SDL2 [优化]:SDL_Surface->texture->copy 比在渲染器上绘图快吗?

Posted

技术标签:

【中文标题】SDL2 [优化]:SDL_Surface->texture->copy 比在渲染器上绘图快吗?【英文标题】:SDL2 [optimisation]: is SDL_Surface->texture->copy faster than drawing on renderer? 【发布时间】:2016-06-21 09:34:30 【问题描述】:

我想知道女巫的方式更有效:

从窗口大小的表面修改 RGB 像素数据,从该表面创建纹理,然后将其复制到渲染上。

或者(我用的)

SDL_SetRenderDrawColor + SDL_SetRenderDrawPoint 直接在双缓冲渲染器中,由缓冲区数组驱动

我更喜欢第一种解决方案,但我想在测试之前确定一下。 感谢您了解 SDL :)

【问题讨论】:

唯一确定的方法就是测试它。做一个基准测试,比较结果,然后在结果出乎意料时提出问题。恐怕目前未知因素太多,无法可靠回答您的问题。 我以前从未听说过 SDL_SetRenderDrawPoint,因此无法对此发表评论。但是,它确实取决于您的用例场景。如果数据是相当静态的,那么您可以使用SDL_UpdateTexture,但如果它更新得更频繁,那么您应该考虑使用流式纹理。这将比每帧创建一个纹理更快。示例见lazyfoo.net/tutorials/SDL/42_texture_streaming/index.php 感谢您的回答,确实,我需要使用流式纹理的 SDL_UpdateTexture,因为我以 90fps 更新每一帧,这比为每个像素缓冲颜色并逐点绘制要快得多。 【参考方案1】:

当涉及到每像素的东西时,操作 SDL_Surface 的像素通常比使用 SDL_RenderDrawPoint() 快一点 方式。当然,如果这只是一两个像素,它不会有很大的不同,但是填充整个窗口可能会。将此表面转换为纹理可能需要一些时间,但不会花费太多时间(在我的计算机上,每帧增加大约 2 毫秒)。

但是,据我所知,您最好的选择是访问屏幕表面的像素 (SDL_GetWindowSurface()),然后使用 SDL_UpdateWindowSurface()。

我相信 SDL_RenderDrawPoint() 的减速是由于 CPU 需要花费额外的时间将像素传递给 GPU(也许软件 SDL_Renderer 会更快?)。

希望这会有所帮助。

【讨论】:

以上是关于SDL2 [优化]:SDL_Surface->texture->copy 比在渲染器上绘图快吗?的主要内容,如果未能解决你的问题,请参考以下文章

SDL2.0 用SDL画图

SDL2:快速像素操作

我在 sdl2 上加载 bmp 图像时遇到问题

表面和纹理之间的区别(SDL/一般)

如何用c语言播放同一文件夹里的图片

对“SDL_UpperBlit”的调用没有匹配的函数