为防止屏幕撕裂,每帧分配一个新的缓冲区



当我使用SDL库在内存中设置像素值并更新屏幕时,每当更新太快时就会发生屏幕撕裂。我不太了解SDL的内部,但我从我所看到的理解是:

  1. 更新函数在向图形硬件发送信号以读取(例如)buffer1的像素数据后返回。
  2. 下一帧在buffer2上绘制,并再次调用更新,但这太快了,buffer1的读取仍然没有完成;
  3. 我的程序不知道关于硬件的任何事情,并假设在buffer1中再次绘制是可以的,而这个缓冲区被发送到监视器。
  4. 屏幕被撕破

当待绘制对象的速度不是太快时,这不是一个大问题。屏幕仍然会撕裂,但人眼几乎看不到,但如果这种撕裂完全不发生,我仍然会很高兴。我不喜欢垂直同步,因为它每帧都会产生一致的延迟。

我的想法是,可能一个新的屏幕缓冲区可以分配到每一帧画上。当监视器想要显示某些内容时,它应该从最新的缓冲区中读取。

这是一种已经在实践中使用的可能方法吗?如果我确实想测试我的想法,我可以使用哪种低级和跨平台的库或API ?SDL吗?OpenGL吗?

你认为更新屏幕的速度比人眼所能看到的要快吗?如果你真的必须让你的引擎100%独立于回溯,使用三重缓冲系统。一个缓冲区用于显示,两个缓冲区用于来回更新,直到屏幕为下一个缓冲区做好准备。如果你填满了第二个回缓冲区,你只需要写三倍就够了,你可以直接写现在已经失效的第一个回缓冲区。没有GPU延迟,只有3个缓冲区。

这里有一个很好的链接,描述了这种技术以及一些关于在现代gpu上使用它的警告…

相关内容

最新更新