SDL_RenderPresent vs SDL_UpdateWindowSurface

SDL_RenderPresent vs SDL_UpdateWindowSurface

本文关键字:SDL UpdateWindowSurface RenderPresent vs      更新时间:2023-10-16

我已经成功地创建并绘制了位图图像,并使用渲染器在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);
}

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

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

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

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

SDL_UpdateWindowSurface等效于SDL 1.2 API SDL_Flip()。

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

此函数告诉GPU渲染到屏幕。

使用SDL_Texture将纹理存储在GPU上。使用此选项时,您可以使用SDL_RenderCopy进行draw调用,或者如果您想要转换SDL_RenderCopyEx

因此,当使用SDL的渲染API时,可以为帧绘制所有图形,然后每帧调用一次此函数,以向用户呈现最终图形。

你应该使用硬件渲染,它比软件渲染效率高得多!即使运行程序的用户没有GPU(这很罕见,因为大多数CPU都有集成GPU),SDL也会自行切换到软件渲染!

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

只需使用SDL_image中的IMG_LoadTexture

不能同时使用两种方法,必须选择其中一种。我建议使用SDL_Renderer。从SDL_Surface创建一个SDL_Texture,并使用SDL_RenderCopy进行渲染。