双缓冲解决的核心问题是状态可能在被修改的同时被请求。
目录
一、目的
用序列的操作模拟瞬间或者同时发生的事情。
二、动机
电脑有强大的序列化处理能力。但是通常在游戏中,是需要实时,在瞬间就能完成很多任务。比如:渲染,游戏引擎需要同时处理很多的东西。当需要渲染的物品太多,场景就会不流畅。
双缓冲就提供了一些解决方案。
三、概述计算机图形系统
屏幕的像素信息是从帧缓冲中得到的信息。帧缓冲是内存中的色素数组,RAM中每两个字节代表一个像素点的颜色。
图形算法最终都到了:设置帧缓冲中的字节值。
但是当程序在帧缓冲中开始设置值时,视频驱动((显卡)正在读取。但速度比写入快,就会将还未写入的像素绘制出来,结果是撕裂了图像。
双缓冲模式就可以解决这个问题。
双缓冲就像设置两个场景,提前渲染好下一个场景,当场景切换时,摄像机立马转过去。就可以实现瞬间完成的连贯。
帧缓冲一般有两个,一个代表现在帧。同时,渲染代码写入另一个帧缓冲。当渲染代码完成就交换缓存来切换灯光。
四、双缓冲模式
定义缓冲类封装缓冲:信息从缓冲区读取总是读取当前缓冲区。信息写入总是在下一个缓冲区上操作。改变完成后,会立刻有交换操作来将两个缓冲区交换。
1.适用场景:
1.需要维护被增量修改的状态。
2.在修改到一半,状态可能会被外部请求。
3.想要防止请求状态的外部代码知道内部的工作方式
4.想要读取状态,而且不想等着修改完成。
2.注意:
1.交换本身需要时间。交换必须是院子的——在交换时,没有代码可以接触到任意状态。
2.两个缓冲区增加了内存的使用。
五、示例代码
一个基础的图形系统:
缓冲区:
双缓冲的帧缓冲区封装在Scene类中:
双缓冲解决的核心问题是状态可能在被修改的同时被请求。
同时也适用:实体物理部分和AI部分。
比如:玩家A给了玩家B苹果,玩家B很高兴。如果玩家A在玩家B之前更新,则高兴在同一帧。如果玩家B先更新,则高兴在下一帧。但这样不满足更新顺序不影响结果。
使用了双缓冲模式后,玩家都会在下一帧看到这个事件的因果。结果在一帧内同时刷新。
六、缓冲区相关
i.缓冲区的交换
缓冲区的交换秉承越快约好的原则:
1.交换缓冲区的指针或者引用
速度快。
外部代码不能存储对缓存的永久指针。
缓冲区中的数据是两帧之前的数据。(不能沿用上一帧的数据 )
2.在缓冲区之间拷贝数据
下一帧数据和之前的数据相差一帧。
交换也许花更多时间。
ii.缓冲的粒度
缓冲区本身是如何组织的——是单个数据块还是散步在对象集合中?
1.如果缓存是一整块
交换操作简单
2.如果很多对象都持有一块数据
交换更慢。需要遍历整个对象集合,通知交换。
优化:通过在多个对象间分散状态来优化。
思路:将当前和一下个指针概念改成对象相关的偏移量。