我已成功创建并绘制了一个位图图像,并使用渲染器将一条绿线绘制到我的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上绘制绿线?
答案 0 :(得分:5)
如果将图像存储在RAM中并使用CPU进行渲染(这称为软件渲染),则使用<li class="{{isActiveRoute regex='dashboard'}}">
<a href="{{pathFor route='dashboard'}}"><i class="fa fa-th-large"></i> <span
class="nav-label">Dashboard</span> </a>
</li>
。
通过调用此函数,您可以告诉CPU更新屏幕并使用软件渲染进行绘制。
您可以使用SDL_UpdateWindowSurface
将纹理存储在RAM中,但软件渲染效果不佳。您可以使用SDL_Surface
。
SDL_UpdateWindowSurface等同于SDL 1.2 API SDL_Flip()。
另一方面,当您使用GPU渲染纹理并将纹理存储在GPU上时(这称为硬件加速渲染),您应该使用SDL_BlitSurface
。
此功能告诉GPU渲染到屏幕。
使用SDL_RenderPresent
在GPU上存储纹理。
使用此功能时,您可以使用SDL_Texture
进行绘制调用,或者如果需要转换SDL_RenderCopy
因此,当使用SDL的渲染API时,会完成所有用于帧的绘制,然后每帧调用此函数一次,以向用户显示最终绘图。
你应该使用硬件渲染它比软件渲染更有效!即使运行该程序的用户没有GPU(这种情况很少见,因为大多数CPU都集成了GPU),SDL也会自行切换到软件渲染!
顺便说一句,您可以将图片加载为SDL_RenderCopyEx
,而无需将图片作为SDL_Texture
加载,并使用SDL_image库将其转换为SDL_Surface
,你应该这样做,因为它支持多种图像格式,而不仅仅是BMP,就像纯SDL一样。 (SDL_image由SDL的创建者制作)
只需使用SDL_image中的SDL_Texture
!
答案 1 :(得分:4)
您不能同时使用这两种方法,必须选择其中一种方法。我建议你去SDL_Renderer
。从SDL_Texture
创建SDL_Surface
,然后使用SDL_RenderCopy
进行呈现。