游戏编程模式之游戏循环

实现用户输入和处理器速度在游戏行进时间上的解耦。
(摘自《游戏编程模式》)

游戏作为一个实时互动软件,实时是其核心。在程序里,总有那么一段代码一直在软件运行周期里不断重复着以监听着用户的输入,并根据输入进行对应的响应,这就是游戏循环代码。要注意的是,在游戏循环中不会出现类似UI事件循环中的阻塞,即使你不输入,游戏依旧在运行着游戏循环。

试着将游戏逻辑简化为输入处理ProcessInput()、逻辑更新LogicUpdate()、画面渲染Render()、物理更新PhysicUpdate()三个部分(事实上还会有很多模块的循环需要运行),则最简单的游戏循环代码如下:

while(true)
{
    ProcessInput()
    LogicUpdate();
    PhysicUpdate();
    Render();
}

如果是单机游戏且是指定设备游玩的情况下,我想这样的游戏循环写法或许不会出现太多问题。但是,当今游戏运行设备、平台众多,性能不同导致其运行的效率也不同。我们在编写游戏循环代码时也要考虑到此游戏运行在低性能和高性能机器上会有什么样的差异、这些差异会导致什么问题。接下来我们将逐个进行讨论。

在此之前

术语:FPS

FPS(Frame Per Second)这是一个频度单位,例如对于屏幕来说,fps代表的就是每秒屏幕刷新多少次。对于游戏循环来说,fps即每秒游戏循环执行多少次。

性能要求

游戏循环是整个游戏的主干部分。程序大部分的时间在运行着游戏循环中的内容,因此,需要优化好游戏循环中调用的函数。

游戏循环

看看我们上面最简单的游戏代码,你能发现它的问题所在吗?在不同设备运行上述代码时是不一致的。对于性能好的机器,它会在1秒内快速的运行三个函数很多次(例如100次);而对于性能稍差的机器,它只能在1秒内运行5次。这是游戏不能接受的,这会使得游戏对象在不同硬件上所表现的游戏状态不同步(高性能电脑游戏进程快一些;低端电脑游戏进程慢一些)。

方案一:依托时间差的状态更新

让游戏状态同步,我们可以将距离上一次更新的时间传递给状态更新函数,让游戏状态更新函数根据这个差值进行计算并更新游戏状态。这样编写的游戏循环会针对不同设备的不同时间差进行更新,以确保状态的一致性。

double lastedTime=Time.time;
while(true)
{
    double current=Time.time;
    double deltaTime=current-lastedTime;
    
    LogicUpdate(deltaTime);
    PhysicUpdate(deltaTime);
    
    Render();
    lastedTime=current;
}

然而这样的方法同样存在缺陷。下面我们针对缺陷进行分析。

  • 对于高性能计算机。它的FPS高,更新的次数更多。而游戏中 的数据计算多为浮点数,计算次数多以为着误差变得更大,而这样会导致两者最后的状态不一致。
  • 为了提高性能,对于游戏的物理引擎会做减幅运算,这个减幅运算被小心地安排成以某个固定时长进行,并非随时调用且计算。然而,对不同设备而言,此方案对PhysicUpdate的调用频率是不一致的,这对物理引擎来说无疑是灾难性的(因为可能两者错开会导致物理引擎模块会丢失几帧的计算)。

方案二:恒定状态更新

既然要保证不同设备下状态更新次数一致。我们需要限制状态更新相关函数的调用以保证任何机器运行时调用更新函数的频率是一致的(即恒定FPS)。代码如下:

double timeTag=Time.time;
double MS_UPDATE_INTERVAL=1000/60;
double accumulation=0;
while(true)
{
    double current=Time.time;
    double deltaTime=current-timeTag;
    timeTag=current;
    accumulation+=deltaTime;
    
    if(accumulation>MS_UPDATE_INTERVAL)
    {
        LogicUpdate(MS_UPDATE_INTERVAL);
        PhysicUpdate(MS_UPDATE_INTERVAL);
        accumulation=0;
    }
    
    Render();
}

MS_UPDATE_INTERVAL值的设定有一定的讲究。首先,这个值最好是小于 1000 /60 ms (1秒中刷新次数大于60次),刷新频率过低可导致画面跳帧;其次,MS_UPDATE_INTERVAL设定的时间要大于Update处理的时间——我们需要Update完成后再准备进行下一次Update。

渲染和更新不同步的问题

我们还有哪些问题可以优化。从上面代码可以看到:Render()代码是没有固定更新步长的,也就是说,状态更新和画面渲染不是在一个时序上,因此,下图的更新次序会导致一些问题的出现。当一次渲染指令在两次更新的中间时,即使前后更新了两次状态,但渲染只执行了一次!这就导致在下一次更新时游戏状态的变化幅度过大,从而导致跳帧。

我们可以借助之前对Update的思路:将时间差传递给渲染引擎,让渲染引擎知道应该渲染到何种程度。

Render(accumulation/MS_UPDATE_INTERVAL);

控制游戏循环方式的抉择

基于平台的事件循环

  • 我们不要花更多的时间去编写游戏循环核心代码
  • 针对平台的开发是得天独厚的
  • 失去了对时间的控制。且很多平台的事件循环并没有想象中的敏捷。
  • 无法跨平台

现成游戏引擎的游戏循环

  • 利用现成稳定的游戏循环
  • 无法获得时间的控制权,自定义选项完全依赖引擎现有的实现

自己编写游戏循环

  • 需要自己编写所有代码
  • 需要自己实现平台的接口

拓展

四种游戏循环的实现:https://blog.csdn.net/qq_38134452/article/details/88738879?spm=1001.2014.3001.5501

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如 果你会一点C、C++语言,你就可以学习游戏编程了,开发真正的游戏!如果你学过一点C++更好,没学过也没关系。本课程教你从零基础开始开发7个完整的 游戏:Brainiac、Light Cycles、Henway、Battle Office、Meteor Defense、Space Out、Stunt Jumper。教程无KEY wmv版本,手机平板等移动设备均可观看! 第1部分 入门 第1章 学习开发游戏的基础知识 1.1 认识视频游戏 1.1.1 为什么人们如此沉迷于开发视频游戏 1.1.2 视频游戏的类型 1.2 学习游戏设计的要素 1.2.1 提出基本思想 1.2.2 整理剧情 1.2.3 可视化图形 1.2.4 为游戏选择正确的声音 1.2.5 使用控制器控制游戏 1.2.6 确定游戏模式 1.3 面向对象的编程游戏 1.3.1 理解OOP 1.3.2 在游戏中应用OOP 1.4 研究相关工具 1.4.1 编译器和开发环境 1.4.2 选择图形工具 1.4.3 选择声音和音乐工具 1.5 小结 1.6 亲身实践 第2章 创建游戏引擎 2.1 什么是游戏引擎 2.2 考虑游戏引擎的作用 2.2.1 将游戏分解为事件 2.2.2 建立游戏的计时机制 2.3 开发游戏引擎 2.3.1 游戏事件函数 2.3.2 GameEngine类 2.4 开发Blizzard示例 2.4.1 编写程序代码 2.4.2 测试完成的程序 2.5 小结 2.6 游戏大变身 第3章 学习绘制基本图形 3.1 图形基础 3.1.1 理解图形坐标系统 3.1.2 学习颜色的基础知识 3.2 查看Windows中的图形 3.2.1 使用设备环境 3.2.2 使用画笔写 3.2.3 使用画刷绘制 3.2.4 使用位图绘制图像 3.2.5 使用调色板管理颜色 3.3 绘制窗口 3.3.1 绘制文本 3.3.2 绘制图元 3.3.3 使用画笔和画刷 3.4 开发Crop Circles示例 3.4.1 编写程序代码 3.4.2 测试完成的程序 3.5 小结 3.6 亲身实践 第4章 绘制图形图像 4.1 位图图像的基础知识 4.2 深入学习位图 4.3 开发位图类 4.3.1 位图类的工作原理 4.3.2 整合代码 4.4 开发Slideshow示例 4.4.1 编写程序代码 4.4.2 汇集资源 4.4.3 测试完成的程序 4.5 小结 4.6 游戏大变身 第2部分 与游戏玩家交互 第5章 使用键盘和鼠标控制游戏 5.1 游戏与用户输入 5.2 了解用户输入设备 5.2.1 接受键盘输入 5.2.2 响应鼠标 5.2.3 使用游戏杆交互 5.3 评估游戏的键盘输入 5.4 跟踪鼠标 5.5 向游戏引擎添加输入支持 5.5.1 添加键盘支持 5.5.2 添加鼠标支持 5.5.3 修改Bitmap类 5.6 开发UFO示例 5.6.1 编写程序代码 5.6.2 测试完成的程序 5.7 小结 5.8 亲身实践 第6章 示例游戏:Brainiac 6.1 游戏的玩法 6.2 设计游戏 6.3 开发游戏 6.4 测试游戏 6.5 小结 6.6 游戏大变身 第7章 使用游戏杆改进输入 7.1 了解游戏杆的基础知识 7.2 校准游戏杆 7.3 追踪游戏杆的移动 7.4 向游戏引擎添加游戏杆支持 7.4.1 访问Win32多媒体功能 7.4.2 开发游戏杆代码 7.5 开发UFO 2示例 7.5.1 编写程序代码 7.5.2 测试完成的程序 7.6 小结 7.7 亲身实践 第8章 示例游戏:Light Cycles 8.1 游戏的玩法 8.2 设计游戏 8.3 开发游戏 8.4 测试游戏 8.5 小结 8.6 游戏大变身 第3部分 在游戏中使用子画面 第9章 使用于画面动画移动对象 9.1 理解动画的基础知识 9.1.1 动画和帧频 9.1.2 了解计算机动画 9.2 2D动画与3D动画 9.3 理解2D动画的类型 9.3.1 基于帧的动画 9.3.2 基于形状的动画 9.4 将子画面动画应用于游戏 9.5 设计通用的子画面 9.6 创建Sprite类 9.6.1 创建和破坏子画面 9.6.2 更新子画面 9.6.3 绘制子画面 9.7 开发Planets示例程序 9.7.1 编写程序代码 9.7.2 测试完成的程序 9.8 小结 9.9 亲身实践 第10章 管理子画面 10.1 了解管理子画面的需求 10.2 设计子画面管理器 10.3 向游戏引擎添加子画面管理器 10.3.1 改进Sprite类 10.3.2 增强游戏引擎 10.4 使用双重缓存消除闪烁 10.5 开发Planets 2示例 10.5.1 编写程序代码 10.5.2 测试完成的程序 10.6 小结 10.7 游戏大变身 第11章 示例游戏:Henway 11.1 游戏的玩法 11.2 设计游戏 11.3 开发游戏 11.4 测试游戏 11.5 小结 11.6 游戏大变身 第4部分 使用声音和音乐 第12章 播放数字声音效果 12.1 理解数字声音 12.2 了解Windows波形声音 12.3 了解声音工具 12.3.1 Sony Sound Forge 12.3.2 Adobe Audition 12.3.3 廉价的声音编辑器 12.4 创建和编辑声音 12.5 查找声音和音乐 12.6 访问波形声音 12.7 播放波形声音 12.7.1 播放文件中的波形声音 12.7.2 播放作为资源的波形声音 12.7.3 循环播放波形声音 12.7.4 停止播放波形声音 12.8 开发Brainiac 2示例程序 12.8.1 编写程序代码 12.8.2 组合资源 12.8.3 测试完成的游戏 12.9 小结 12.10 亲身实践 第13章 播放MIDI音乐 13.1 感受MIDI音乐 13.2 理解Windows媒体控制接口 13.3 使用MCI播放MIDI音乐 13.3.1 打开MIDI设备 13.3.2 播放MIDI歌曲 13.3.3 暂停MIDI歌曲 13.3.4 关闭MIDI设备 13.4 向游戏引擎添加MIDI音乐支持 13.5 开发Henway 2示例程序 13.5.1 编写程序代码 13.5.2 测试完成的游戏 13.6 小结 13.7 亲身实践 第14章 示例游戏:Battle Office 14.1 游戏的玩法 14.2 设计游戏 14.3 开发游戏 14.4 测试游戏 14.5 小结 14.6 亲身实践 第5部分 高级动画 第15章 实现子画面外观动画 15.1 再次介绍帧动画 15.2 设计动画子画面 15.3 向游戏引擎添加动画子画面支持 15.3.1 只绘制位图的一部分 15.3.2 对Sprite类实现动画 15.4 开发Battle Office 2示例程序 15.4.1 编写程序代码 15.4.2 测试完成的游戏 15.5 小结 15.6 游戏大变身 第16章 创建子画面背景 16.1 了解游戏背景的重要性 16.2 了解游戏背景的类型 16.2.1 纯色背景 16.2.2 图像背景 16.2.3 动画背景 16.2.4 滚动背景 16.3 向游戏引擎添加背景支持 16.3.1 创建基本的背景类 16.3.2 创建动画背景类 16.4 开发Roids示例 16.4.1 编写程序代码 16.4.2 测试完成的游戏 16.5 小结 16.6 亲身实践 第17章 示例游戏:Meteor Defense 17.1 游戏的玩法 17.2 设计游戏 17.3 增强游戏引擎中的子画面 17.4 开发游戏 17.5 测试游戏 17.6 小结 17.7 游戏大变身 第6部分 让游戏拥有大脑 第18章 教游戏思考 18.1 理解人工智能 18.2 了解游戏AI的类型 18.2.1 漫游AI 18.2.2 行为AI 18.2.3 策略AI 18.3 开发AI策略 18.4 开发Roids 2示例程序 18.4.1 编写程序代码 18.4.2 测试完成的程序 18.5 小结 18.6 亲身实践 第19章 示例游戏:Space Out 19.1 游戏的玩法 19.2 设计游戏 19.3 向游戏引擎中添加另一个子画面特性 19.4 开发游戏 19.5 测试游戏 19.6 小结 第7部分 增添游戏的趣味性 第20章 使用闪屏增添游戏的活力 20.1 闪屏的重要性 20.2 了解闪屏 20.3 创建Space Out 2游戏 20.3.1 编写游戏代码 20.3.2 测试完成的游戏 20.4 小结 20.5 亲身实践 第21章 使用演示模式展示游戏 21.1 什么是演示模式 21.2 演示模式的细节 21.3 开发Space Out 3游戏 21.3.1 编写游戏代码 21.3.2 测试完成的游戏 21.4 小结 21.5 游戏大变身 第22章 记录高分 22.1 记录得分的重要性 22.2 确定高分数据模型 22.3 存储和检索高分数据 22.4 开发Space Out 4游戏 22.4.1 编写游戏代码 22.4.2 测试完成的游戏 22.5 小结 22.6 亲身实践 第8部分 附加练习 第23章 使用滚动背景更改远景 23.1 什么是滚动背景 23.1.1 横向滚动的背景 23.1.2 纵向滚动的背景 23.1.3 视差滚动背景 23.2 理解滚动背景的工作原理 23.3 向游戏引擎添加滚动背景支持 23.3.1 创建背景图层类 23.3.2 创建滚动背景类 23.4 开发Wanderer示例 23.4.1 编写程序代码 23.4.2 测试完成的程序 23.5 小结 23.6 游戏人变身 第24章 示例游戏:Stunt Jumper 24.1 游戏的玩法 24.2 设计游戏 24.3 开发游戏 24.4 测试游戏 24.5 小结 24.6 游戏大变身 24.7 亲身实践
目 录 游戏编程指南... 1 目 录... 1 导 读... 1 第一章 表述游戏的语言... 1 1.1 VC.net概述... 1 1.2 入门知识... 4 1.2.1 数与数据类型... 4 1.2.2 变量与常量... 4 1.2.3 Namespace. 5 1.2.4 操作符与表达式... 6 1.3 预编译指令... 7 1.4 结构,联合和枚举... 8 1.4.1 结构... 8 1.4.2 联合... 9 1.4.3 枚举... 10 1.5 控制语句... 10 1.5.1 判断和跳转语句... 10 1.5.2 选择语句... 11 1.5.3 循环语句... 13 1.6 函数... 13 1.7 指针、数组与字符串... 17 1.7.1 指针... 17 1.7.2 数组... 19 1.7.3 字符串... 22 1.7.4 小结... 23 1.8 多文件程序的结构... 23 1.9 常用函数... 25 第二章 如何说得更地道... 29 2.1 定义和使用类... 29 2.2 类的构造函数... 32 2.3 类的静态成员... 34 2.4 运算符重载... 35 2.5 类的继承... 38 2.6 虚函数和抽象类... 41 2.7 模板... 42 2.8 优化程序... 45 2.9 调试程序... 47 第三章 容纳游戏的空间... 49 3.1 基本Windows程序... 49 3.2 WinMain函数... 53 3.2.1 简介... 53 3.2.2 注册窗口类... 53 3.2.3 创建窗口... 55 3.2.4 显示和更新窗口... 56 3.2.5 消息循环... 57 3.3 消息处理函数... 58 3.4 常用Windows函数... 59 3.4.1 显示对话框... 59 3.4.2 定时器... 59 3.4.3 得到时间... 60 3.4.4 播放声音... 60 第四章 描绘游戏的画笔... 61 4.1 初始化DirectDraw.. 61 4.1.1 简介... 61 4.1.2 DirectDraw对象... 62 4.1.3 设置控制级和显示模式... 63 4.1.4 创建页面... 64 4.2 后台缓存和换页... 66 4.3 调入图像... 67 4.4 页面的丢失与恢复... 67 4.5 透明色... 68 4.6 图像传送... 68 4.7 程序实例... 72 4.8 图像缩放... 72 4.9 释放DirectDraw对象... 72 第五章 丰富画面的技巧... 74 5.1 填涂颜色... 74 5.2 输出文字... 75 5.3 GDI作图... 75 5.4 程序实例... 76 5.5 锁定页面... 76 5.6 程序提速... 78 5.7 特殊效果... 82 5.7.1 减暗和加亮... 82 5.7.2 淡入淡出... 83 5.7.3 半透明... 83 5.7.4 光照... 84 5.7.5 动态光照... 85 5.7.6 光照系统... 88 5.7.7 天气效果... 88 第六章 加速游戏的魔法... 89 6.1 内嵌汇编简介... 89 6.2 基本指令... 90 6.3 算术指令... 91 6.4 逻辑与移位指令... 93 6.5 比较、测试、转移与循环指令... 93 6.6 MMX指令集之基本指令... 96 6.7 MMX指令集之算术与比较指令... 98 6.8 MMX指令集之逻辑与移位指令... 99 6.9 MMX指令集之格式调整指令... 100 第七章 我没有想好名字... 102 7.1 读取键盘数据... 102 7.2 读取鼠标数据... 103 7.3 恢复和关闭DirectInput 104 7.3.1 恢复DirectInput设备... 104 7.3.2 关闭DirectInput 104 7.4 初始化和关闭DirectX Audio. 104 7.4.1 初始化DirectX Audio. 104 7.4.2 关闭DirectX Audio. 105 7.5 播放MIDI和WAV音乐... 105 7.5.1 调入MIDI和WAV文件... 105 7.5.2 播放MIDI和WAV文件... 106 7.5.3 停止播放... 107 7.6 在3D空间中播放音乐... 107 7.7 播放MP3音乐... 109 7.7.1 调入MP3文件... 109 7.7.2 播放MP3文件... 109 7.7.3 停止播放和释放对象... 110 第八章 支撑游戏的基石... 111 8.1 链表... 111 8.2 哈希表... 111 8.3 快速排序... 112 8.4 深度优先搜索... 113 8.5 广度优先搜索... 117 8.6 启发式搜索... 120 8.7 动态规划... 126 8.8 神经网络... 128 8.9 遗传规划... 129 第九章 向三维世界迈进... 131 9.1 概述... 131 9.2 基本知识... 133 9.2.1 初始化DXGraphics. 133 9.2.2 关闭DXGraphics. 135 9.2.3 恢复DXGraphics设备... 135 9.3 设置场景... 135 9.3.1 设置渲染状态... 135 9.3.2 设置矩阵... 136 9.4 创建场景... 137 9.4.1 调入3D场景... 138 9.4.2 调入2D图像... 139 9.5 刷新场景... 140 9.6 渲染场景... 141 9.6.1 渲染3D场景... 141 9.6.2 渲染2D图像... 141 9.7 改变场景... 141 9.8 显示文字... 142 9.9 程序实例... 143 第十章 我没有想好名字... 144 10.1 灯光... 144 10.2 半透明... 145 10.3 纹理混合... 146 10.4 雾... 148 10.5 凹凸贴图与环境贴图... 149 10.6 粒子系统... 149 10.7 骨骼动画... 149 10.8 镜子... 151 10.9 影子... 151 第十一章 我没有想好名字... 152 11.1 基本概念... 152 11.2 程序流程... 152 11.2.1 服务器端... 152 11.2.2 客户端... 153 11.3 程序实例... 153 11.4 错误处理... 158 11.5 显示IP地址... 158 11.6 更有效地传送数据... 159 第十二章 创造我们的世界... 161 12.1 程序流程... 161 12.2 程序结构... 162 12.3 基本方法... 163 12.4 SLG编程要点... 163 12.4.1 电脑AI 163 12.5 RPG & ARPG编程要点... 163 12.5.1 迷宫的生成... 163 12.5.2 脚本技术... 163 12.6 RTS编程要点... 163 12.6.1 寻路... 163 12.6.2 电脑AI 163 12.7 FPS编程要点... 164 12.7.1 移动... 164 12.7.2 碰撞检测... 164 12.8 游戏中的物理学... 165 附 录... 166 附录一 Windows常见消息列表... 166 附录二 虚拟键列表... 171 Windows消息中的虚拟键... 171 DirectInput中的虚拟键... 172 附录三 DirectX函数返回值列表... 174 DirectDraw部分... 174 Direct3D部分... 181 附录四 Winsock函数返回值列表... 183 附录五 游戏编程常用网址... 187 附录六 中英文名词对照... 188 附录七 常见问题及解决办法... 189 1. 程序编译时出现"Warning". 189 2. "Cannot Execute Program". 189 3. "Unresolved External Symbol". 189 4. 运行时出错... 189 5. 大家还有什么问题,可以告诉我... 189
本版本与网上其他资源不同之处在于,此版本可进行编辑,搜索,已进行内容识别扫描。可全选,可编辑,可剪切文字。 部分目录如下: 第1 章计算机,游戏,我_ 我,云风,从二十年前的计 算机游戏萌芽阶段一路走来。计 算机,并不神秘。程序,也只是 表达计算机控制逻辑的符号而 巳。 第2 章算法,程序的灵魂 算法,先千计算机存在于世, 比编程语言本身更为蜇要C 语言 只是工具,算法才是灵魂。这里 简单介绍了数据结构的基本知 识、算法放率的评估方法、几种 NP 问题的定义。 这里对游戏中最常用的搜索 算法问题之一寻路问题做了些许 探讨,并展开介绍了在以后可能 被广泛使用的智能算法。最后用 几个实例探讨了优化问题。 1.1 计算机...................................................................... 2 1.2 计算机游戏............................................................., 3 1.3 计算机与我......................, ... , ................................... 7 1.3 .1 启蒙............................................................... 7 1.3 .2 编程..... , .................................... , .......... , ......... 9 13 2.1 程序=算法+数据结构............................................ 14 2.1.1 算法,.......................................................... ,, 15 2.1.2 数据结构,.................................................... 17 2.2 搜索算法,.............. . ............ .... ..................... . .. . ....... 23 2.2.l 地图寻路问题................................................ 23 2.2.2 博弈问题,...................................................... 27 2.2.3 更为广泛的运用............................................ 28 2.3 智能算法,............................................................... 29 2.3.1 遗传算法(Genetic Algorithm) .... ·........ …... 29 2.3.2 模拟退火算法(Simulated Annealing) ....... 31 2.3.3 禁忌搜索(Tabu Search) ............................. 33 2.3.4 人工神经网络 (Artificial Neural Network) …..... ….............. 34 2.4 优化,....................................................................... 36 2.4.1 质数问题....................................................... 36 1.4.2 俄罗斯方块竞赛............................................ 37 2.5 Apple II 上的编程之路.......................................... 39 XIII 第1 章计算机,游戏,我_ 我,云风,从二十年前的计 算机游戏萌芽阶段一路走来。计 算机,并不神秘。程序,也只是 表达计算机控制逻辑的符号而 巳。 第2 章算法,程序的灵魂 算法,先千计算机存在于世, 比编程语言本身更为蜇要C 语言 只是工具,算法才是灵魂。这里 简单介绍了数据结构的基本知 识、算法放率的评估方法、几种 NP 问题的定义。 这里对游戏中最常用的搜索 算法问题之一寻路问题做了些许 探讨,并展开介绍了在以后可能 被广泛使用的智能算法。最后用 几个实例探讨了优化问题。 1.1 计算机...................................................................... 2 1.2 计算机游戏............................................................., 3 1.3 计算机与我......................, ... , ................................... 7 1.3 .1 启蒙............................................................... 7 1.3 .2 编程..... , .................................... , .......... , ......... 9 13 2.1 程序=算法+数据结构............................................ 14 2.1.1 算法,.......................................................... ,, 15 2.1.2 数据结构,.................................................... 17 2.2 搜索算法,.............. . ............ .... ..................... . .. . ....... 23 2.2.l 地图寻路问题................................................ 23 2.2.2 博弈问题,...................................................... 27 2.2.3 更为广泛的运用............................................ 28 2.3 智能算法,............................................................... 29 2.3.1 遗传算法(Genetic Algorithm) .... ·........ …... 29 2.3.2 模拟退火算法(Simulated Annealing) ....... 31 2.3.3 禁忌搜索(Tabu Search) ............................. 33 2.3.4 人工神经网络 (Artificial Neural Network) …..... ….............. 34 2.4 优化,....................................................................... 36 2.4.1 质数问题....................................................... 36 1.4.2 俄罗斯方块竞赛............................................ 37 2.5 Apple II 上的编程之路.......................................... 39 XIII 第3 章编程语言 至少要学会一种编程语言, 才可能编写游戏软件。流传于世 的编程语言数以百计,但真正流 行的却不多。各种编程语言之间 有它们的共通性,但也并非能够 一通百通,甚至也不存在一种适 合娇决所有问题的语言。 我认为大部分游戏程序员都 应该掌握工作平台的汇编语言。 这对理解硬件, 写出更好的代码, 还有软件调试都有莫大的帮助。 第4 章前Windows 时代 现在, Win d ows 一统江山, 它帮我们稳藏了硬件的许多东西。 这一章是对1 0 年前知识的一个回 顾,它们如今已经沉寂在历史中, 或是被Windows 掩盖。但是, 作 为喜爱创根l河底的程序员,我们有 必要对Window s 之前的时代有一 些了解。 XIV 3.1 C 语言................................................, .. ,, .......... ,.,,. 46 3.2 BASIC ..................................................................... 50 3.3 Ct+ ......................................................................... 51 3 .4 汇编语言,............................................................... 54 3.4.1 概述.............................., ... , ....................... ,,, .. 55 3.4.2 程序的本质....., .. , ... , ...................................... 57 3.4.3 寄存器........................................................... 58 3.4.4 寻址方式....................................................... 60 3.4.5 汇编指令....................................................... 61 3.4.6 CIC++ 语言和汇编....................................... 62 3.4.7 ,J 、结... . .. .. . .. .. .... .... ....... .... .. . . .. ............ .. ........... 63 3.5 其他语言................................................................ 63 3.5.1 Forth .............................................................. 63 3.5.2 Lisp ................................................................ 64 3.5.3 Java····..................................................... ....... 64 3.5.4 Python 、Lua 、更多...................................... 65 4.1 386 保护模式......................................................... 68 4.2 VGA 至U VESA ...................................................... 70 4.2.1 超越BGI ...................................................... 70 4.2.2 VGA·....... ··· · ···............................................... 72 4.2.3 VESA 标准................................................... 72 4.2.4 花絮............................................................... 74 4.3 保护模式下的开发工具.... …... ……............. ………··75 4.4 闲话Allegro .......................................................... 81 4.4.1 用C 与汇编写成的程序库….... …·….............. 81 442 BITMAP···.....................................................8 2 4.4.3 Sprite···.. ·.. ·.... ·.. ·.. ··.. ·.. ·········.. ··.... ···············.. ··85 4.4.4 几何图形和3D··........................................... 89 4.4.5 数据文件............... .-....................................... 91 4.4.6 声音............................................................... 92 4.4.7 其他的部分................................................... 93 45 67 第5 章Windows 编程 如果我们在Window s 下开 发游戏,那么理惮Window s 系统 就是尤为重要的事情。Window s 只是一个操作系统的特例,不属 子计算机理论知识的范畴。这导 致了许多已经掌握了编程知识, 理论功底也很扎实的程序员, 面 对Window s 下的开发无可适从。 第6 章汇编优化 汇编优化, 是在高性能游戏 引擎设计中很难避免的一个环 节。虽然不用汇编去做优化依然 可以写出高性能的程序,但优化 却可以变得更好。 但是,这一章并非从汇编开 始谈起。相反,一开始我就花了 不少笔墨谈汇编之外的知识。即 使是一些技巧性的细节, 也并非 必须用汇编才可以做到。 这一章着重介绍了在CIC++ 中和汇编进行混合编程的方法和 技巧,然后才具体谈到汇编指令 的高效使用策略。 4.4.8 ,J 、结............................................................... 94 4.5 cfido 中国惠多网.................................................. 94 5.1 Windows 编程入门............................, ................. 104 5.1.1 Windows 版本综述...... ,, ..... , ........................ 105 5.1.2 操作系统的核心................ ., ........................ 107 5.1.3 Windows API 和DLL.. ·······......................... 110 5.14 COM··........................................................... 111 5.1.5 Windows 的窗口和消息处理与传递........... 114 5.1.6 Windows GDI .................................. ............ 125 5.2 控制游戏的速度,................................................. 130 5 .3 浅谈M FC .................. .. ......................................... 132 5.4 小结,............................................................. . ....... 132 6.1 浅谈代码优化............................................... ..... .. 138 6.2 并不仅仅是汇编.................................................. 139 6.2.1 在算法实现时减少上下文的依赖关系.. ….. 139 6.2.2 低效的静态变量.................................... ... ... 140 6.2.3 数据的组织.................................... ... .......... 141 6.2.4 消除除法..................................................... 142 6.2.5 避免过大的循环.......................................... 144 6.3 汇编和CIC++ 的混合编程.................................. 146 6.3.1 使用外置的汇编编译器.. . ....... …............. …·146 6.3.2 使用内嵌汇编·· ·· · ··· ···········........................... 148 6.3.3 C++ 的函数调用规则........ ……..................... 150 6.3.4 寄存器的使用...................................... ........ 152 6.3.5 _declspec(naked)· ·· ·.... · · ·· · · ··... ·... ·.... · ·· · · ·· · ··.... 152 6.4 指令使用的技巧.................................................. 153 6.4.1 LEA: 别样的内存寻址指令................……·153 6.4.2 BSWAP: 扩展寄存器的个数......... ….... …··154 101 135 XV 第7 章S-I M D 指令 单指令多数据(SIMD , Single Instructio n-Mu l tiple- D ata) 编程是 现代CP U 高速处理多媒体数据 的发展方向。好的工具摆在一边 不去用就是一种浪费。 这里介绍得多的是MMX 使 用技巧,这方而也是我用得比较 多的,勉强算得上经验丰富。 第8 章引擎中的优化 单从内容来看,这一章是本 书的独家内容。我得以成名的开 源游戏引擎“风魂”的几乎所有 优化策略都在这章公开出来。虽 然引擎源码一直都是公开的, 想 研究的人自然可以通过阅读代码 来学习,但是,由作者本人来解 释其中的优化策略,这是第一次 的文字记录。 XVI 6.4.3 缩短指令的宇节数............ . .... . .................…155 6.4.4 避免跳转指令............................................. 159 6.5 Pentium 的汇编优化策略...... ….......................... 161 6.5.1 UV 流水线................................................... 163 6.5.2 AGI 地址生成互锁 ( Address Generation Interlock)· · ………... 167 6.5.3 Pentium Pro, Pentium II 和Pentium III 的汇编优化策略......................................... 168 6.5.4 Pentium 4 的汇编优化策略…...... …............. 178 6.5.5 如何测试代码的速度…............................... 181 6.5.6 汇编能干的事情.......................................... 183 7.1 单指令多数据编程...... .. ..... ...... .. .. . .. .. ..... ... .. .. ...... 186 7.1.1 Alpha 混合.................................................. 187 7.2 MMX .................................................................... 191 7.2.1 MMX 的指令概况....................................... 192 7.2.2 SSE 及其对MMX 的扩展,......................... 194 7.2.3 SIMD 技术在C 语言环境下的使用...…….. 196 7.2.4 MMX 编码技巧.......................................... 197 7.2.5 SIMD 的应用举例...................................... 201 7.2.6 SIMD 编程注意要点. .................................. 203 7.2.7 SIMD 的性能检测....................................... 204 8.1 Blit 的优化........................................................... 207 8.2 脏矩形优化............................ . ............................. 209 8.2.1 "风魂”中改进的脏矩形算法...........…..... 215 8.2.2 滚动优化..................................................... 219 8.2.3 覆盖优化............................................. . ....... 222 8.2.4 脏矩形在3D 游戏界面中的运用....... .. .. . .... 224 8.2.5 时间和空间的权衡...................................... 229 8.2.6 关于估算..................................................... 230 185 205

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值