Vin*_*rta 2 c++ directx buffer
向我解释一些我还不太明白的事情。我读到,在 DirectX 中拥有多个后台缓冲区可以提高性能。
它说,当前缓冲区被绘制到屏幕上时,假设您已经将所有内容渲染到后缓冲区并且后缓冲区已准备就绪,但显然您必须等到前缓冲区完全绘制才能确保不会发生撕裂。因此,它不再等待,而是开始渲染到另一个后台缓冲区中。
在我看来,C++ 唯一会发生的事情是您必须为更多的后台缓冲区分配更多的内存。所以,再一次,
为什么拥有多个后台缓冲区对性能更好?
因此,如果您只有两个缓冲区,则一个正在显示,一个正在绘制。一旦 GPU 处理完当前的后缓冲区,它就必须等到后缓冲区变成前缓冲区才能绘制下一帧。如果您不关心垂直同步,这不是问题,因为您只需在后缓冲区完成时进行交换,然后继续使用旧的前缓冲区作为后缓冲区。
现在,想象一下我们只能以精确的垂直同步交换缓冲区,这样我们就不会在交换过程中出现撕裂。所以我们有一个 60 fps 的垂直同步,或者 16 毫秒来绘制后台缓冲区。还可以想象一下,根据一些因素,有时需要 14 毫秒,有时需要 19 毫秒来绘制一帧。如果需要 19 毫秒,我们必须等待 13 毫秒,直到下一个 16 毫秒间隔到来,然后 GPU 才能绘制任何内容。
有了三个缓冲区,GPU 就可以立即开始绘制第三帧,即使我们错过了时隙,这意味着在显着降低帧速率之前我们还有 13 毫秒的时间来完成该任务。所以平均帧率更高。
显然,N 帧缓冲区的缺点是第 N 帧必须在显示当前帧之前“准备好绘制”N-1 帧,否则不会有任何好处。
因此,如果帧速率相当慢,则屏幕上显示的实际绘图将是“N-1 帧旧”。考虑一些非常慢的绘图,其中每一帧需要半秒。如果您在 FPS 游戏中使用 3 帧缓冲系统开枪,则在开枪后 1.5 秒(三帧后)才会真正出现射击。幸运的是,FPS 游戏通常不会运行得那么慢......;)
[但值得注意的是,“性能”往往是一个比“每秒帧数”更复杂的数字——例如,GPU 使用率、功耗和 GPU 使用率是需要考虑的重要因素]
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |