如何在SDL 2.0中实现双缓冲?

5
我有一个50*50的tile tile map数组。
当我点击鼠标以移动该数组中每个单独tile的x和y时,我会看到每个tile之间的白色空隙 - 我认为这被称为“撕裂”,这是不希望出现的。
我在谷歌上搜索了双缓冲区并阅读了维基页面http://en.wikipedia.org/wiki/Multiple_buffering#Double_buffering_in_computer_graphics
在SDL2中如何实现双缓冲区呢?特别是对于由“for循环”创建的大型tile数组?
...我怀疑你将tile纹理复制到缓冲纹理上,并在完全加载完成后将其复制到渲染器上 - 尽管我无法让它起作用,但我很想看到一个完整的工作示例!
这是我的先前帖子,附有我的当前代码:SDL2 double buffer not working, still tearing

http://sdl.beuc.net/sdl.wiki/SDL_Flip - Vality
@Vality 那是SDL1。 - emlai
@zenith 抱歉,文档错误。它已被 http://wiki.libsdl.org/SDL_RenderPresent 替换,该函数执行相同的操作。 - Vality
它可能是撕裂的,也可能不是。如果不看到你的意思,就无法确定。这可能只是绘图中的其他问题? - Some programmer dude
@OP 双缓冲机制已经内置于SDL2渲染机制中,例如SDL_RenderPresent将在每次调用时翻转前/后缓冲区。您无需对此进行任何特殊处理。 - emlai
1
请查看我的更新答案,我认为你的问题实际上可能与垂直同步有关,而不是双缓冲。 - Vality
2个回答

6

SDL2会自动为您处理双缓冲:

  • SDL_RenderClear将清除当前渲染缓冲区。
  • SDL_RenderCopy将纹理渲染到当前渲染缓冲区。
  • SDL_RenderPresent将交换缓冲区,显示自上次SDL_RenderClear调用以来使用SDL_RenderCopy渲染的所有内容。

1
如果只是交换缓冲区,那么就不需要垂直同步,对吧? - Andrew McKinlay
2
错误的。(使用ctrl-f查找“双缓冲”) - emlai
我以为切换缓冲区只需要简单地移动指针。 - Andrew McKinlay

2
自SDL2版本开始,所有硬件渲染都必须是双缓冲的,因此您需要确保首先通过硬件渲染库进行绘图。
然后,您只需要调用SDL_RenderPresent来翻转双缓冲区即可。
如果您当前正在使用软件渲染系统,则应该可以解决此问题。但是,如果您已经这样做了,我会怀疑其他问题存在,请检查是否使用了垂直同步,并查看绘图代码中是否存在其他错误。
请注意,如果您目前没有使用垂直同步,这也是可能的原因。您需要通过设置SDL_HINT_RENDER_VSYNC提示来解决此问题。

尝试将垂直同步添加到渲染器中,但没有变化。我怀疑问题出在绘图代码中 - 我会再次仔细检查。谢谢! - doomglhfcn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接