为什么具有多个后缓冲区对性能更好
Why having multiple back buffers is better for performance?
向我解释一些我还不太明白的东西。我读到在DirectX中有多个后缓冲区对性能更好。
它说,当前缓冲区被绘制到屏幕上时,假设你已经将所有内容都渲染到后缓冲区中,后缓冲区已经准备好了,但很明显,你必须等到前缓冲区完全绘制出来,才能确保不会发生撕裂。因此,它不再等待,而是开始渲染到另一个后台缓冲区中。
在我对C++的看法中,唯一会发生的事情就是必须为更多的后台缓冲区分配更多的内存。所以,再一次,
为什么具有多个后缓冲区对性能更好?
因此,如果你只有两个缓冲区,一个正在显示,另一个正在绘制。一旦GPU完成了当前的后缓冲区,它就必须等到后缓冲区变成前缓冲区才能绘制下一帧。如果您不关心vsync,这不是问题,因为您只需要在后台缓冲区完成后进行交换,然后使用旧的前端缓冲区作为后台缓冲区。
现在,想象一下,我们只能在完全的vsync下交换缓冲区,这样我们就不会在交换过程中撕裂缓冲区。所以我们有一个60帧/秒的vsync,或者16毫秒来绘制后缓冲区。想象一下,根据一些情况,有时画一帧需要14毫秒,有时需要19毫秒。如果需要19毫秒,我们必须等待13毫秒,直到下一个16毫秒的间隔出现,GPU才能绘制任何东西。
有了三个缓冲区,GPU可以立即开始绘制第三帧,即使我们错过了时隙,这意味着在帧速率显著下降之前,我们还有13毫秒的时间来完成。所以平均帧速率更高。
显然,N帧缓冲区的一个缺点是,在显示当前帧之前,第N帧必须"准备好绘制"N-1帧,否则将没有任何好处。
因此,如果帧速率相当慢,屏幕上出现的实际图形将是"N-1帧旧"。考虑一些非常慢的绘画,每帧需要半秒。如果你在有3帧缓冲系统的FPS游戏中开枪,那么直到你开枪1.5秒(三帧后),子弹才会真正出现。幸运的是,FPS游戏通常不会运行得那么慢…;)
【然而,值得注意的是,"性能"通常比"每秒帧数"更复杂——例如,GPU使用、功耗和GPU使用是需要考虑的重要因素】
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++字符*缓冲区的大小
- OpenMP阵列性能较差
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 递归列出所有目录中的C++与Python与Ruby的性能
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- ostream过载时的缓冲区冲洗
- C++中的高效循环缓冲区,它将被传递给C样式数组函数参数
- 大小相等但成员数量不同的结构之间的性能差异
- Xaudio2在更改缓冲区或循环时弹出声音
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 为什么constexpr的性能比正常表达式差
- 在OpenGL中为顶点、uvs和法线使用一个缓冲区是否比使用三个缓冲区性能更好
- 提高循环缓冲区或堆排序性能
- 写入内存缓冲区时性能损失 (C++)
- 为什么缓冲区应该在 64 字节边界上对齐以获得最佳性能
- 为什么具有多个后缓冲区对性能更好
- 我可以通过控制std::ofstream中的缓冲区刷新来获得性能吗
- 我如何提高我的环形缓冲区代码的性能
- 优化内存和性能的传输数据缓冲区