我已经使用渲染器成功创建并绘制了位图图像并绘制了绿线到我的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上划绿线?
如果将图像存储在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中的!
| 归档时间: |
|
| 查看次数: |
1851 次 |
| 最近记录: |