游戏设计模式阅读笔记7——序列模式(双缓冲模式)

 双缓冲解决的核心问题是状态可能在被修改的同时被请求。

目录

 双缓冲解决的核心问题是状态可能在被修改的同时被请求。

一、目的

二、动机

三、概述计算机图形系统

四、双缓冲模式

 1.适用场景:

2.注意:

五、示例代码

六、缓冲区相关

 i.缓冲区的交换

1.交换缓冲区的指针或者引用

2.在缓冲区之间拷贝数据

ii.缓冲的粒度


一、目的

        用序列的操作模拟瞬间或者同时发生的事情。

二、动机

        电脑有强大的序列化处理能力。但是通常在游戏中,是需要实时,在瞬间就能完成很多任务。比如:渲染,游戏引擎需要同时处理很多的东西。当需要渲染的物品太多,场景就会不流畅。

双缓冲就提供了一些解决方案。

三、概述计算机图形系统

         屏幕的像素信息是从帧缓冲中得到的信息。帧缓冲是内存中的色素数组,RAM中每两个字节代表一个像素点的颜色。

         图形算法最终都到了:设置帧缓冲中的字节值。

         但是当程序在帧缓冲中开始设置值时,视频驱动((显卡)正在读取。但速度比写入快,就会将还未写入的像素绘制出来,结果是撕裂了图像。

         双缓冲模式就可以解决这个问题。

        双缓冲就像设置两个场景,提前渲染好下一个场景,当场景切换时,摄像机立马转过去。就可以实现瞬间完成的连贯。

        帧缓冲一般有两个,一个代表现在帧。同时,渲染代码写入另一个帧缓冲。当渲染代码完成就交换缓存来切换灯光。

四、双缓冲模式

        定义缓冲类封装缓冲:信息从缓冲区读取总是读取当前缓冲区。信息写入总是在下一个缓冲区上操作。改变完成后,会立刻有交换操作来将两个缓冲区交换。

 1.适用场景:

        1.需要维护被增量修改的状态。

        2.在修改到一半,状态可能会被外部请求。

        3.想要防止请求状态的外部代码知道内部的工作方式

        4.想要读取状态,而且不想等着修改完成。

2.注意:

        1.交换本身需要时间。交换必须是院子的——在交换时,没有代码可以接触到任意状态。

        2.两个缓冲区增加了内存的使用。

五、示例代码

一个基础的图形系统:

缓冲区:

双缓冲的帧缓冲区封装在Scene类中:

         双缓冲解决的核心问题是状态可能在被修改的同时被请求。

        同时也适用:实体物理部分和AI部分。

        比如:玩家A给了玩家B苹果,玩家B很高兴。如果玩家A在玩家B之前更新,则高兴在同一帧。如果玩家B先更新,则高兴在下一帧。但这样不满足更新顺序不影响结果。

        使用了双缓冲模式后,玩家都会在下一帧看到这个事件的因果。结果在一帧内同时刷新。

六、缓冲区相关

 i.缓冲区的交换

        缓冲区的交换秉承越快约好的原则:        

1.交换缓冲区的指针或者引用

        速度快。

        外部代码不能存储对缓存的永久指针。

        缓冲区中的数据是两帧之前的数据。(不能沿用上一帧的数据 )

2.在缓冲区之间拷贝数据

        下一帧数据和之前的数据相差一帧。

        交换也许花更多时间。

ii.缓冲的粒度

        缓冲区本身是如何组织的——是单个数据块还是散步在对象集合中?

1.如果缓存是一整块

        交换操作简单

2.如果很多对象都持有一块数据

        交换更慢。需要遍历整个对象集合,通知交换。

优化:通过在多个对象间分散状态来优化。

思路:将当前和一下个指针概念改成对象相关的偏移量。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值