SDL_RenderPresent与SDL_UpdateWindowSurface

Joe*_*ino 3 c++ sdl

我已经使用渲染器成功创建并绘制了位图图像并绘制了绿线到我的SDL窗口。问题是我不确定如何在同一窗口上同时执行这两项操作。

void draw::image(){
    SDL_Surface *bmp = SDL_LoadBMP("C:\\Users\\Joe\\Documents\\Visual Studio 2013\\Projects\\SDL_APP1\\map1.bmp");
    SDL_BlitSurface(bmp, 0, SDL_GetWindowSurface(_window), 0);

    SDL_Renderer * renderer = SDL_CreateRenderer(_window, -1, 0);
    // draw green line across screen
    SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
    SDL_RenderDrawLine(renderer, 0, 0, 640, 320);
    SDL_RenderPresent(renderer);
    SDL_UpdateWindowSurface(_window);
    SDL_Delay(20000);

    // free resources
    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(_window);
}
Run Code Online (Sandbox Code Playgroud)

我的代码的这个版本将bmp文件绘制到窗口,因为SDL_UpdateWindowSurface(); 在SDL_RenderPresent()之后;但是,当我翻转这些按钮时,它会在屏幕上画一条绿线。如何在BMP上划绿线?

小智 5

您不能同时使用这两种方法,必须选择其中一种方法。我会建议去SDL_RendererSDL_Texture从您的创建一个SDL_Surface并使用SDL_RenderCopy.


kov*_*ell 5

如果将图像存储在RAM中并使用CPU进行渲染(这称为软件渲染),请使用SDL_UpdateWindowSurface

通过调用此函数,您可以告诉CPU更新屏幕并使用软件渲染进行绘制。

您可以使用来将纹理存储在RAM中SDL_Surface,但是软件渲染效率不高。您可以使用进行绘图调用SDL_BlitSurface

SDL_UpdateWindowSurface等效于SDL 1.2 API SDL_Flip()。

另一方面,当您使用GPU渲染纹理并将纹理存储在GPU上(这称为硬件加速渲染)时,应该使用SDL_RenderPresent

此功能告诉GPU渲染到屏幕。

您可以使用将纹理存储在GPU上SDL_Texture。使用此功能时,您可以使用SDL_RenderCopy或如果要进行转换来进行绘图调用SDL_RenderCopyEx

因此,当使用SDL的渲染API时,将完成所有针对该框架的绘图,然后每帧调用一次此功能以将最终的绘图呈现给用户。

您应该使用硬件渲染比软件渲染更有效!即使运行该程序的用户没有GPU(这种情况很少见,因为大多数CPU都具有集成的GPU),SDL也会自行切换到软件渲染!

顺便说一句,您可以使用SDL_image库将SDL_Texture图像加载为而不需要将图像作为加载SDL_Surface并将其转换为,这是您应该这样做的,因为它支持多种图像格式,而不仅仅是BMP,例如纯SDL。(SDL_image由SDL的创建者制作)SDL_Texture

只需使用IMG_LoadTextureSDL_image中的!