Why CPU-side version SDL_FillRect up to 7 times faster in compare GPU-side version SDL_RenderFillRect?

安稳与你 提交于 2021-01-05 06:37:49

问题


Here I have asked what is the difference between SDL_FillRect and SDL_RenderFillRect

Here is code of my benchmark:

my $window  =  SDL2::Video::SDL_CreateWindow( 'Hello', 100, 100, 800, 600, 0x00000004 ); 
my $surface =  SDL2::Video::SDL_GetWindowSurface( $window );

my $render =  SDL2::Render::SDL_GetRenderer( $window );
SDL2::Render::SDL_SetRenderDrawColor( $render, 0, 0, 255, 255 );

use Benchmark ':all';

my $rect1 =  SDL2::Rect->new({ x => 10,  y => 10,  h => 50,  w => 50 });
 timethese( 1000000, {
     'Soft' => sub {
        SDL2::Surface::SDL_FillRect( $surface, $rect1, 0x00FF0000 );
     },
     'Hard' => sub {
        SDL2::Render::SDL_RenderFillRect( $render, $rect1 );
     },
 });

The result:

Benchmark: timing 1000000 iterations of Hard, Soft...
      Hard: 20 wallclock secs (13.06 usr +  8.03 sys = 21.09 CPU) @ 47415.84/s (n=1000000)
      Soft:  3 wallclock secs ( 2.91 usr +  0.01 sys =  2.92 CPU) @ 342465.75/s (n=1000000)

Why CPU-side version of function is much faster? Probably I something wrong while benchmarking?

UPD

When rectangle is more bigger:

my $rect1 =  SDL2::Rect->new({ x => 10,  y => 10,  h => 550,  w => 750 });
Benchmark: timing 100000 iterations of Hard, Soft...
      Hard: 25 wallclock secs ( 1.51 usr +  2.50 sys =  4.01 CPU) @ 24937.66/s (n=100000)
      Soft: 25 wallclock secs (24.80 usr +  0.00 sys = 24.80 CPU) @ 4032.26/s (n=100000)

Benchmark: timing 1000000 iterations of Hard, Soft...
      Hard: 264 wallclock secs (16.67 usr + 23.98 sys = 40.65 CPU) @ 24600.25/s (n=1000000)
      Soft: 259 wallclock secs (258.00 usr +  0.34 sys = 258.34 CPU) @ 3870.87/s (n=1000000)

来源:https://stackoverflow.com/questions/65450100/why-cpu-side-version-sdl-fillrect-up-to-7-times-faster-in-compare-gpu-side-versi

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!