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 比在渲染器上绘图快吗?的主要内容,如果未能解决你的问题,请参考以下文章