为每一帧分配一个新缓冲区以防止屏幕撕裂
Allocating a new buffer per each frame to prevent screen tearing
当我使用SDL库设置内存中的像素值并更新画面时,每当更新过快时就会出现画面撕裂。我不太了解 SDL 的内部结构,但我的理解是:
- 更新函数 returns 在向图形硬件发出信号以从(比如)
buffer1
. 读取像素数据之后
- 下一帧画在
buffer2
,再次调用update,但是太快了buffer1
的读取还没完成;
- 我的程序对硬件一无所知,并假定可以在
buffer1
中再次绘制,同时将此缓冲区发送到监视器。
- 画面撕裂
在待画物体速度不太快的情况下,问题不大。屏幕仍然会撕裂,但人眼几乎看不到,但如果这种撕裂根本不发生,我还是很高兴。我不喜欢垂直同步,因为它每帧都会产生一致的延迟。
我的想法是,可以为每个要绘制的帧分配一个新的屏幕缓冲区。当监视器想要显示某些东西时,它应该从最新的缓冲区中读取。
这是一种已经在实践中使用的可能方法吗?如果我确实想测试我的想法,我可以使用什么样的低级和跨平台库或 API? SDL? OpenGL?
您认为比人眼看到的更快地更新屏幕是否有效率?如果您真的必须让您的引擎 100% 独立于回扫,请使用三重缓冲系统。一个要显示的缓冲区,以及 2 个要来回更新的缓冲区,直到屏幕准备好接收下一个缓冲区。 Triple 和你需要的一样高,就像你填充第二个后台缓冲区一样,你可以只覆盖现在已经不存在的第一个后台缓冲区。没有 GPU 延迟,只有 3 个缓冲区。
Here 很好 link 描述了这种技术以及一些关于在现代 GPU 上使用它的警告...
当我使用SDL库设置内存中的像素值并更新画面时,每当更新过快时就会出现画面撕裂。我不太了解 SDL 的内部结构,但我的理解是:
- 更新函数 returns 在向图形硬件发出信号以从(比如)
buffer1
. 读取像素数据之后
- 下一帧画在
buffer2
,再次调用update,但是太快了buffer1
的读取还没完成; - 我的程序对硬件一无所知,并假定可以在
buffer1
中再次绘制,同时将此缓冲区发送到监视器。 - 画面撕裂
在待画物体速度不太快的情况下,问题不大。屏幕仍然会撕裂,但人眼几乎看不到,但如果这种撕裂根本不发生,我还是很高兴。我不喜欢垂直同步,因为它每帧都会产生一致的延迟。
我的想法是,可以为每个要绘制的帧分配一个新的屏幕缓冲区。当监视器想要显示某些东西时,它应该从最新的缓冲区中读取。
这是一种已经在实践中使用的可能方法吗?如果我确实想测试我的想法,我可以使用什么样的低级和跨平台库或 API? SDL? OpenGL?
您认为比人眼看到的更快地更新屏幕是否有效率?如果您真的必须让您的引擎 100% 独立于回扫,请使用三重缓冲系统。一个要显示的缓冲区,以及 2 个要来回更新的缓冲区,直到屏幕准备好接收下一个缓冲区。 Triple 和你需要的一样高,就像你填充第二个后台缓冲区一样,你可以只覆盖现在已经不存在的第一个后台缓冲区。没有 GPU 延迟,只有 3 个缓冲区。
Here 很好 link 描述了这种技术以及一些关于在现代 GPU 上使用它的警告...