游戏编程精粹(1、3)

2019-08-19  本文已影响0人  HelloWorld_de97

《游戏编程精粹1》

1.当处理小的数据类型时候,允许复制数据的做法是可取的;但当处理较大的数据结构和类时,传进这些对象或者结构的指针的做法则更好,否则每一次的插入都要调用构造函数<>
2.使用singleton时可以创建模板函数
3.为什么使用前置递增或者递减运算符?是因为效率的问题,使用后置的时候需要返回一个当前旧值的拷贝,因此它需要使用一个临时对象。除非有特殊原因要使用后置自增或自减运算符,否则一律使用前置的。
4.使用句柄的好处是即使是使用无效句柄或已关闭的句柄调用函数也不会导致游戏崩溃,而只是返回一个程序错误。
5.如果使用的系统可用内存很少,并且动态内存被一起禁止。在这种情况下,需要事先在内存中的某个缓冲区,在需要读取文件时候不会被使用,用它作为临时缓冲区而避免使用动态内存分配
6.在游戏中任何希望重设、打开或关闭的任意多选项都可以使用Stats系统处理。例如高亮冲突、调整摄像机行为,指定玩家速度、设置环境光源等。一个应用程序增加Stats的三步:1、启动时调用CStatsBase::Initalize();2、实时循环每步调用CheckInput来更新键盘或手柄的状态;3、在屏幕渲染后调用Print在实时图像显示统计信息
7.成功运用可预测随机数的关键就在于如何能8正确地在对象属性上与游戏状态上同时使用好种子数
8.单精度浮点数格式只存储23位精度,意味着对于像2127这样大的数,根本就没有在0.0到1.0之间的精度。最低位的值是2104,因此对于一个数量级为1.0的数值来说,其计算误差可以达到2^100。
9.当稳定性成为着重考虑的问题时,可以考虑隐式欧拉方法。否则如果更看重的是准确性那么使用显式欧拉方法。(前者是对x+1处的y求导,后者是对x处的y求导)
10.水面交互式模拟(未读,位于《游戏编程精粹1》的164页)

  1. 四元数主要用来表现3D旋转,四元数乘法比矩阵乘法快,而且四元数差值能产生平滑的动画。矩阵主要用来进行顶点变换,大多数3D API以矩阵形式存储它们的旋转。
    12.游戏对象在世界中起反应有两种方式:轮询和事件驱动
    13.AI触发消息由消息发送者、消息接收者、消息发送时间、消息内容组成
    14.在删除一个游戏对象的时机为执行状态机外部代码的时候,应该设置一个识别应被删除的游戏对象的标志。
    15.固定深度的搜索会很糟糕。如果一个特别糟的走步将会发生,计算机将会把其他走步在他
    们在搜索深度后有那很糟的一步进行排序。这是因为如果糟糕的一步在很远的将来才能发生,他将不能看到。
    16.A寻路效率最差的情形就是用它来判断开始位置和目标位置之间是否无路径。那样的话,他将在确定目标不在这些位置集合中之前,检查从位置出发的每个可达位置。避免这个问题的最好方法是用手工或者用算法做一个地图的预分析,以使程序能检查两个位置是否互相可达。如果不能则搜索工作无法开始。
    17.要让A
    变得既快又节省资源,那么解决的办法就是对于搜索空间的优化。可以通过优化存储地址分配和每个数据存取的方式来达到优化目的。
    18.搜索空间优化的方式有以下几种:简化搜索空间、矩形或者六角形栅格、真实的多边形地板、多边形地板、可见点
    19.对于任何阈值方法,滞变阈值或者其他,你都需要选择阈值。对于细节层次选择来说,选择阈值就是在性能与视觉品质之间的权衡。如果阈值设置的过低,那么更高的细节层次就会被频繁的选择,每帧不得不渲染更多的几何体,这将使渲染速度慢下来。如果阈值设置的过高,那么更低品质的多边形将被绘制,使得层次之间的抖动更明显。为了减少抖动,可以执行选择算法
    20.关键帧动画值是提高动画质量的一个容易且代价低廉的方法。线性插值能以每顶点极小的代价来实现。Hermite样条插值较之线性差值改善了差值关键帧的质量,但是每顶点付出了更大的代价
    21.平滑算法的工作方式是通过将栅格分成一系列较大的正方形,然后再细分他们:接着计算出子块的平均值并且推广到所有字块中去。最后达到一种平滑效果
    22.很多游戏通过预先计算各个顶点的光照颜色使用静态光照,这样做可以几乎不耗费计算机开销而生成逼真的Gouraud光照。但是生成的光照看上去也完全是静态的。

《游戏编程精粹1》读后总结:

第一章:通用编程技术包括如何写好游戏代码(脚本的使用时机,代码风格,数学思想运用到游戏变成中,STL,通用句柄的资源管理器,数据载入技巧,内存优化,网络协议的简单介绍和实现,巧妙使用assert,游戏的单元测试以及游戏内建剖析)
第二章:数学技术包括数学思想如何正确运用到游戏中(可预测随机数,刚体运动方程-物理学,三角函数的多项式逼近,水面交互模拟-二维波动方程,四元数)
第三章:人工智能包括了人工智能AI的简单介绍以及各类实现方式(有限状态机,博弈树,A*路径规划,简化的3D运动和使用导航网格寻径,神经网络概要)
第四章:多边形技术包括2D和3D图形渲染(OpenGL,矢量摄像机,交互碰撞检测,八叉树构造,独立于观察的渐进网格,3D关键帧动画,简单的皮肤构造技术,实时地形系统的形成)
第五章:像素特效包括对于模拟现实中的光照进行对游戏的细化渲染(将3D模型问题转化为2D,使用纹理坐标生成技术的高级纹理,光学上的底面阴影,构造游戏中的玻璃效果,基于容器中液体折射效果)
总结:主要对于第一章的游戏编程通用技术做了深入的学习,后面AI也看的比较仔细,而对于其他章节只能算得上是浏览,至于涉及到数学上微积分和线性代数的地方可以说连浏览都算不上,只是对于渲染和OpenGL有了个大概的认识。

《游戏编程精粹3》

1.调度器的基本组件包括任务管理器、事件管理器和时钟。通过这些组件,调度器就能生成基于时间或是基于帧的事件,然后调用相应的事件处理器(任务)。
2.调度任务的第一步就要设定它究竟是时间事件、帧事件、还是渲染事件。
3.游戏架构的阶段(概念,原型,可玩性阶段,生产阶段,产品包装阶段,测试阶段,发布阶段,3移植阶段),其中概念、原型、可玩性阶段是对于游戏后期极具影响力的过程。
4.面向对象设计的两个原则:对于接口编程而不是对实现编程、尽量采用对象组合而不是类继承
5.通常用C/C++按相应的程序框架进行编程,这些程序往往就程序应用提供相应的文档、范例和软件开发工具包,所以这种编程方式又称为2SDK方式。另一种是使用“封装”方式,例如VC++的MVC方式,它是将SDK中的绝大多数函数、数据等按C++“类”的形式进行封装,并提供相应的应用程序框架和编程操作。
6.本质上说宏只是对编译器的预处理做了一些聪明的文本替换工作,类型检查或者任何其他的安全性检查在这一步不会发生,这就是的给很多开发人员添加麻烦的地方,为了避免这一点,有一条基本原则,那就是不要使用宏创建有函数功能的行为或者常量。
7.使用宏的技巧:把枚举值转化为字符串、利用二进制表达式得到编译期常量、给标准断言添加描述性注释、编译期断言、得到一个数组里面的元素个数、在一个字符串中间加入LINE(对于微软VSC没有太大用处,对于Metrowerks CodeWorrior和SN Systems ProDG<一个基于gcc的编译器>)、防止进入无限循环、小型的特制语言、简化类接口(重要)
8.利用工具产生的代码来输出和绑定函数可以为我们在手工为脚本和RPC引擎绑定函数时节省很多工作。以前我们需要开发人员来修改代码以改动函数映射表,现在只需要设计人员或者艺术人员就可以,这就可以大大加快迭代设计的速度
9.分配器架构最大的优点就是只需要改动很少的一段代码就能替换掉原分配器。编写分配器只需要拷贝一些程式化的代码和自制很少的关键成员函数。只有对分配器的特性有了一个实际的了解才能理解分配器是如何工作的,不同的STL实现可能会不支持针对对象数据的分配器,而且可能提供了自制的成员函数以避免编译器的问题。定制分配器能极大的改善性能。
10.有三个理由需要对浮点异常进行检查——夸平台兼容性、性能,还有就是要避免粗心大意。
11.使用Lex和Yacc来处理自定义数据文件,将这些数据文件通过工具转化为某个游戏子系统的二进制数据。Lex是词法分析器的源文件,Yacc是语法分析器的源文件。
12.Directinput可以使用两种方法从不同的输入系统得到数据:直接访问式和缓冲式。
13.变长参数列表是传统的日志记录操作的方法,但是此种方法有缺乏参数检查、缺乏类型安全、缺乏可扩展性、不支持用户自定义类的类型几个缺点
14.在使用分数矢量的时候很重要的一点就是要避免产生溢出。如果我们在不同的计算阶段使用了不同的数据类型,编译器就可以帮助我们进行处理。如果我们已知自己需要进行什么几何图形查询,我们可以将分数矢量的概念抽象成一个类或是一组函数了。
15.在一个骨架运动中使用逆向运动学(IK算法)将得到某种程度上的自动化,此效果通过事先制作或是捕获的运动数据是很难生成的。如果能实时的生成这些动作,那么人物就可以在一个不断变化的环境中反应自如了。
16.散列表进行规则簌的动态学习
17.在分解世界的时候需要考虑的两个基础性的问题:分解得到的节点数目越少越好(如果节点数目越少,启发式搜索的速度也就越快)、结果节点对于路径遍历的有用程度(最好通过此节点得到的路径能充分利用环境中可行走区域的最大面积_保证一个人物可以有更大的面积行走)
18.PLP算法是一个近似的、基于视点、对象空间可见性算法。将叶子节点保存在了一个被称为front的优先级队列中,然后在队列中按照优先级从高到低进行遍历。当访问一个节点(对之进行投影)的时候,如果他是可见的,那么就将之放入了可见对象集合里面去。然后从front中删除它,将与其相邻的未经访问过的节点加入到front中去,这就是优先分层投影法。
19.cPLP算法利用PLP生成的可见对象集合作为初始数据,然后不停的对之添加数据,直到front为空为止。这样就可以保证其最后的可见对象集合是稳健的。
20.如何使用图形处理硬件来创建动态的3D纹理?使用单个的预先计算出来的3D噪声纹理,然后通过纹理矩阵对之进行多次访问以控制其频率,让寄存器在每一层上进行加权与加和,生成最终的色彩。
21.图形处理系统可以将不同的原纹理智能的结合起来以得到最终的效果,但在某些情况下,这种结合可能会相当复杂而缓慢,因此一定要注意
不要出现缓存频繁交换的现象,这样才可以与那些不是很智能但是却比较快的缓存协同工作(例如,Driect3D中的纹理缓存)

上一篇下一篇

猜你喜欢

热点阅读