SDL_RenderPresent vs SDL_UpdateWindowSurface
SDL_RenderPresent vs SDL_UpdateWindowSurface
我已经成功地创建并绘制了位图图像,并使用渲染器在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
进行渲染。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- SDL 窗口不会弹出
- SDL 操纵杆按钮按下/C++
- VSCode IntelliSense无法识别SDL框架的SDL_image扩展库
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- SDL 映像:无法打开映像,仅显示错误消息
- 如何在 3D OpenGL 场景上绘制 SDL 2D 矩形?
- "Undefined symbols for architecture x86_64" 在 SDL 2 (macOS) 中
- 为什么 SDL 在 Mac 上比 Linux 慢得多?
- 在 OSX 上打开 SDL 窗口时不要打开终端窗口
- SDL + OpenGL ES 2.0 使用着色器显示纹理
- SDL GPU 为什么将两个图像分成两个单独的循环更快?
- 在 cmake 中找不到 SDL 库
- SDL/C++: 如何平滑但随机地移动矩形?
- 如何与 SDL 库链接?
- 为什么我的C++代码不呈现 SDL 矩形?
- 为什么要在初始化SDL之前在SDL中声明指针
- C++/SDL 如何覆盖数组?
- 在 SDL 中水平减小静态图像进度条