三重缓冲

三重缓冲 是一种图象处理技术
英文名Triple Buffering,是一种图象处理技术。

Triple Buffering使用一个前置缓存和两个后置缓存。在着色完第一个后置缓冲区的数据后,立即开始处理第二个后置缓冲区。今天,不少新游戏都采用的是Triple Buffering,Trible Buffering正逐渐成为发展的趋势,因为它没有Vsync(荧幕的垂直刷新频率)等待的时间,游戏也将更加流畅。三重缓冲,有3个缓冲区,显卡无需等待前缓冲区清空进而腾出后缓冲区,随时可以把渲染结果放入第3个缓冲区。


   实现

编辑
这就是说,可以在打开 垂直同步的同时保持应有的 帧速了。ATi和 nVidia的驱动中都有打开三重缓冲(triple buffering)的选项。可惜这只能起到一半的作用,因为驱动中的3重缓冲选项只对 OpenGL游戏起作用。加上OpenGL游戏远少于D3D游戏,所以事实上驱动的3倍缓冲选项在超过一半情况都不起作用。三级缓冲是低帧速的完美解决办法,不过,这并不是免费的午餐。打开三级缓冲也意味着需要多50%的缓存空间。在某些条件之下,它也可能会对游戏效果产生负面影响。

应用

编辑
举个简单的例子来说明这个潜在的问题:譬如当我们在1600x1200分辨率下运行游戏的时候,每个像素需要32bit空间储存信息,1600x1200x32=61,440,000 bit,将它转换成MB为单位,相当于7.32MB。使用二级缓冲,需要 14.64MB显存;为了使用三级缓冲,则需要21.96MB显存。显存占用率不成问题。不过,一旦打开4x FSAA,这个数字就会飞速膨胀。在打开4x FSAA的时候,有多出4倍的像素进行取样,如此21.96MB乘4,变成可观的87.84MB!这就大于显存总容量的1/3了。如果这个游戏需要用200MB的空间储存材质、光影、各种贴图……等等,游戏效果就会非常变得非常糟糕,会由于不时存取硬盘产生大量停滞现象。这里只是提醒大家注意,如果发现游戏过程中存取硬盘过于频繁,则可能说明3级缓冲占用了太多 显存,此时你就应该考虑降低游戏的画面设置或者购买更高档的显存容量更大的显卡了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三重缓冲区是一种用于在多线程或多进程之间共享数据的技术。在C语言中,可以通过使用指针和互斥锁来实现三重缓冲区。 下面是一个简单的三重缓冲区的C语言实现: ```c #include <stdlib.h> #include <pthread.h> #define BUFFER_SIZE 100 // 定义三个缓冲区 int buffer1[BUFFER_SIZE]; int buffer2[BUFFER_SIZE]; int buffer3[BUFFER_SIZE]; // 定义三个缓冲区的指针 int *pBuffer1 = buffer1; int *pBuffer2 = buffer2; int *pBuffer3 = buffer3; // 定义三个互斥锁 pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex2 = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex3 = PTHREAD_MUTEX_INITIALIZER; // 定义一个函数,将数据写入缓冲区 void write_data(int *data) { // 获取第一个缓冲区的互斥锁 pthread_mutex_lock(&mutex1); // 将数据写入第一个缓冲区 *pBuffer1++ = *data; // 如果第一个缓冲区已满,则将指针移到第二个缓冲区 if (pBuffer1 >= buffer1 + BUFFER_SIZE) { pBuffer1 = buffer1; // 释放第一个缓冲区的互斥锁,并获取第二个缓冲区的互斥锁 pthread_mutex_unlock(&mutex1); pthread_mutex_lock(&mutex2); } else { // 释放第一个缓冲区的互斥锁 pthread_mutex_unlock(&mutex1); } // 将数据写入第二个缓冲区 *pBuffer2++ = *data; // 如果第二个缓冲区已满,则将指针移到第三个缓冲区 if (pBuffer2 >= buffer2 + BUFFER_SIZE) { pBuffer2 = buffer2; // 释放第二个缓冲区的互斥锁,并获取第三个缓冲区的互斥锁 pthread_mutex_unlock(&mutex2); pthread_mutex_lock(&mutex3); } else { // 释放第二个缓冲区的互斥锁 pthread_mutex_unlock(&mutex2); } // 将数据写入第三个缓冲区 *pBuffer3++ = *data; // 如果第三个缓冲区已满,则将指针移到第一个缓冲区 if (pBuffer3 >= buffer3 + BUFFER_SIZE) { pBuffer3 = buffer3; // 释放第三个缓冲区的互斥锁,并获取第一个缓冲区的互斥锁 pthread_mutex_unlock(&mutex3); pthread_mutex_lock(&mutex1); } else { // 释放第三个缓冲区的互斥锁 pthread_mutex_unlock(&mutex3); } } // 使用示例 int main() { int data = 123; write_data(&data); return 0; } ``` 在上面的代码中,我们定义了三个缓冲区和三个互斥锁,每个缓冲区的指针分别指向第一个元素。当写入数据时,我们先获取第一个缓冲区的互斥锁,将数据写入第一个缓冲区,并判断第一个缓冲区是否已满。如果第一个缓冲区已满,则将指针移到第二个缓冲区,并释放第一个缓冲区的互斥锁,获取第二个缓冲区的互斥锁。如果第二个缓冲区已满,则将指针移到第三个缓冲区,并释放第二个缓冲区的互斥锁,获取第三个缓冲区的互斥锁。如果第三个缓冲区已满,则将指针移到第一个缓冲区,并释放第三个缓冲区的互斥锁,获取第一个缓冲区的互斥锁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值