卡马克http://baike.baidu.com/view/59118.htm
http://oldbbs.ali213.net/thread-1532392-1-1.html
http://www.xue5.com/itedu/200505/8051_2.html
http://www.pcppc.cn/kaifa/shujujiegousuanfa/kaifa_131457.html
http://baike.baidu.com/view/85010.htm
http://baike.baidu.com/view/2624.htm
网络游戏通讯模型初探http://www.pcppc.cn/kaifa/shujujiegousuanfa/kaifa_131457.html
游戏的基础结构, 引擎,无限状态机和内存池http://dev.csdn.net/article/39/39381.shtm
AI:http://games.enet.com.cn/article/A15720050513002.html
3D数学基础:图形与游戏开发内容:
介绍了基础概念,如向量、坐标空间、矩阵、变换、欧拉角、齐次坐标空间、几何图元、相交性检测和三角网格。
读者论论了3D中的方位,包括四元数和对不同表示技术之间的优劣比较。
描述了数学和几何的实际应用示例,提供了一些C++类和不同的矩阵类,每个类都完成特定的几何任务。
所有基本变换矩阵的完整来历。
3D游戏里的点坐标,就是使用三个浮点数来表示的。浮点数的计算,往往就会有不精确的现像,比如判断一个数是否等于0,就不能想当然地认为是否等于0了。
3D和2D的区别在于3D世界多了一个表示“高度”的坐标轴。如果去掉这个坐标轴,那么3D就变成了2D,也就是说如果这个坐标轴的值是0的话,3D坐标系就可以用来表示2D图形。但是2D坐标系仅仅有两根坐标轴,即只有两个维度,所以无论如何也不可能用来表示3D物体。
照像机本身是一个3D空间物体,它可以在3D空间中自由移动。我们应该有这样一个经验,如果我们靠近“人”,那么相片上的“人”就会显得更大,远处的“油轮”显得更小,反之亦然。
但是如果我们对着一张照片再拍照,我们会发现不管是靠近照片上的人像还是靠近照片上的油轮像,它们的大小比例都不会改变。(此时不作3D变换,即只和照片平行移动,不做倾斜等涉及到第三维度的位置变化)
这,就是3D和2D的现实区别。
当计算机需要显示2D图形时,通常的做法(DirectX的做法)是在显存中开辟两块空间,用来储存基于x/y坐标系的数据。当需要显像的时候,计算机直接把坐标系中的数据贴上屏幕。
当计算机需要显示3D场景时,DirectX的做法是在内存中开辟3D坐标系空间(对于计算机来说是三元数组)。首先要建立一个世界坐标系,这个坐标系就如同我们的宇宙,是容纳内存中其他3D物件的容器。然后,计算机往这个容器内添加物体(3D模型)。注意,此时还仅仅是计算机内存世界的建立,我们屏幕上还看不到任何东西。当内存世界建立完毕以后,计算机会建立一个摄像机(?显卡),这个摄像机具备三个坐标:镜头方向、右方向和上方向。这个摄像机摄到的东西就是我们在屏幕(范平面,摄像机的成像部件,相片)上看到的东西,这三个坐标决定了我们看到的到底是什么。当摄像机在内存世界中游走时,我们在屏幕上看到的东西也在不断的变化。
很明显,显示3D场景的开销远远大于显示2D图形,所以早期的计算机游戏都是2D的。不过,设计师们显然不满足于一眼就开出长和宽的画面,所以他们想出了一个绝妙的解决办法:让那些2D图形“看起来像”3D。比如星际争霸,暗黑破坏神,它们的每一个物件图形都是一张平面图片,计算机所需要做的仅仅是把这些图片按需求贴上屏幕而已。在3D游戏里,所有的物件都有一个模型(记录了该物件长宽高各点的信息),我们看到的东西仅仅是摄像机拍摄下来的照片。
照这个原理来看,关于视野方面,我们可以在2D游戏中做到的事情最多(如果设计者允许)是:水平移动,等比例缩放。而在3D游戏中,我们最多可以做到:任何方向的移动,镜头的缩进拉远(表现为透视现象)。
这,就是3D和2D在计算机中的区别。
综上所述,我们应该注意到,当计算机显示3D场景时,相当于我们用照相机给人和油轮照相,显示2D图形时则是在给现成的2D图形照相。
渲染器部分是游戏引擎质量的直接体现
dx和opengl只是图形库,游戏引擎则是基于其上开发的一套软件
OpenGL是一套纯C库,各大显卡厂商都争相推出自己的扩展,所以导致库函数接口越来越混乱。而dx则是微软先制定了高层COM接口,具体实现再交给硬件厂商去实现,所以接口一直都比较统一
dx,opengl就是提供用于管理显示卡功能的通用SDK和操作系统,只不过dx和opengl这里叫基础的标准的通用的3D图形开发包。它们提供了对显卡底层IO调用的封装。为显卡和图形程序之间提供了一个统一接口的逻辑层。游戏引擎同游戏相比也是游戏的基础设施,相当于为建立特定类型和效果的游戏提供的一个封装库和开发工具。游戏引擎首先不是通用的,不以通用为目的。每种游戏引擎的设计架构和实现效果上是不相同的,游戏引擎的实现目的是大大简化开发游戏的工作时长和难度。就像机械制造过程中模具和生产出的零件的关系。说穿了DX,OPENGL就是车床等等通用的加工工具,游戏引擎就是针对特定零件的模具,游戏就是生产出的零件。通常写3D游戏是需要游戏引擎的,因为直接从底层开发工作量大,也不便于游戏的小修小改和调试,而且用引擎的好处在于把一些游戏开发中必须的或者说用的较多的算法和结构都给固定下来,便于减少公司开发未来游戏所需要的工作量(同时也可以向同行出售引擎授权获取利润),也减少对开发游戏所需要的开发人员技术水平的要求,在有游戏引擎的情况下,开发人员只需要掌握基本的一些设计游戏逻辑的编程能力,而不必要所有的开发人员都熟悉图形学和较高的数学水平,同时游戏引擎通过一些编辑器等工具减少了从事美工的开发人员协同从事程序设计的游戏开发人员进行游戏开发的难度。
游戏常用算法如,二叉树裁减,门裁减,地形渲染,闭合测试,路线规划,自然环境渲染,碰撞检测等等加速游戏绘图和逻辑计算的算法和游戏渲染实时特效的算法
DirectX特效游戏程序设计是一部关于DirectX游戏程序设计的理论用书,全书分为三个部分,第一部分介绍了Windows编程、3D图形学以及DirectX的基础知识;第二部分以示例方式介绍了在特效游戏中使用DirectX实现各种二维图形效果的方法,包括火焰、二维水面、图像反馈的扭曲、云彩、图像模糊化及消隐等;第三部分介绍了实现三维图形效果的方法,包括各种粒子、爆炸、投射、炫光、三维水体及顶点和像素的消隐等。
普通单机游戏的简化执行流程:
Initialize() // 初始化模块
{
初始化游戏数据;
}
Game() // 游戏循环部分
{
绘制游戏场景、人物以及其它元素;
获取用户操作输入;
switch( 用户输入数据)
{
case 移动:
{
处理人物移动;
}
break;
case 攻击:
{
处理攻击逻辑:
}
break;
...
其它处理响应;
...
default:
break;
}
游戏的NPC等逻辑AI处理;
}
Exit() // 游戏结束
{
释放游戏数据;
离开游戏;
}
一个简单的网络游戏模型执行流程:
客户机:
Login()// 登入模块
{
初始化游戏数据;
获取用户输入的用户和密码;
与服务器创建网络连接;
发送至服务器进行用户验证;
...
等待服务器确认消息;
...
获得服务器反馈的登入消息;
if( 成立 )
进入游戏;
else
提示用户登入错误并重新接受用户登入;
}
Game()// 游戏循环部分
{
绘制游戏场景、人物以及其它元素;
获取用户操作输入;
将用户的操作发送至服务器;
...
等待服务器的消息;
...
接收服务器的反馈信息;
switch( 服务器反馈的消息数据 )
{
case 本地玩家移动的消息:
{
if( 允许本地玩家移动 )
客户机处理人物移动;
else
客户机保持原有状态;
}
break;
case 其他玩家/NPC的移动消息:
{
根据服务器的反馈信息进行其他玩家或者NPC的移动处理;
}
break;
case 新玩家加入游戏:
{
在客户机中添加显示此玩家;
}
break;
case 玩家离开游戏:
{
在客户机中销毁此玩家数据;
}
break;
...
其它消息类型处理;
...
default:
break;
}
}
Exit()// 游戏结束
{
发送离开消息给服务器;
...
等待服务器确认;
...
得到服务器确认消息;
与服务器断开连接;
释放游戏数据;
离开游戏;
}
服务器:
Listen() // 游戏服务器等待玩家连接模块
{
...
等待用户的登入信息;
...
接收到用户登入信息;
分析用户名和密码是否符合;
if( 符合 )
{
发送确认允许进入游戏消息给客户机;
把此玩家进入游戏的消息发布给场景中所有玩家;
把此玩家添加到服务器场景中;
}
else
{
断开与客户机的连接;
}
}
Game() // 游戏服务器循环部分
{
...
等待场景中玩家的操作输入;
...
接收到某玩家的移动输入或NPC的移动逻辑输入;
// 此处只以移动为例
进行此玩家/NPC在地图场景是否可移动的逻辑判断;
if( 可移动 )
{
对此玩家/NPC进行服务器移动处理;
发送移动消息给客户机;
发送此玩家的移动消息给场景上所有玩家;
}
else
发送不可移动消息给客户机;
}
Exit() // 游戏服务=器结束
{
接收到玩家离开消息;
将此消息发送给场景中所有玩家;
发送允许离开的信息;
将玩家数据存入数据库;
注销此玩家在服务器内存中的数据;
}
}
游戏编程精粹6
第1章 通用编程
简介
1.1 Lock-Free算法
1.2 通过OpenMP来充分利用多核处理器的能力
1.3 用OpenCV库实现游戏中的计算机视觉
1.4 游戏对象的地理网格注册
1.5 BSP技术
1.6 最相似字串匹配算法
1.7 利用CppUnit实现单元测试
1.8 为游戏的预发布版本添加数字指纹,1威慑并侦测盗版行为
1.9 通过基于访问顺序的二次文件排序,1实现更快速的文件加载
1.10 你不必退出游戏:资产热加载技术可以实现快速的反复调整
第2章 数学与物理
简介
2.1 浮点编程技巧
2.2 利用齐次坐标实现投影空间中的GPU计算
2.3 利用叉乘积求解线性方程组
2.4 适用于游戏开发的序列索引技术
2.5 多面体浮力的精确计算
2.6 带有刚体交互作用的基于粒子的实时流体仿真系统
第3章 人工智能
AI中的懒惰(Lazy)问题http://hi.baidu.com/kawaifinney/blog/item/7550458bff75f6769f2fb464.html
引言
3.1 游戏的制作方法——应用基于模型的决策——在雷神之锤III中应用蝗虫人工智能引擎
3.2 独立非玩家角色合作行为的实现
3.3 针对游戏的基于行为的机器人架构
3.4 使用模糊感知器.c有限状态自动机和扩展的行为网络为虚幻竞技场游戏构建一个目标驱动的机器人
3.5 一个目标驱动的虚幻竞技场游戏角色程序:使用扩展的行为网络制作目标驱动的具有个性的代理
3.6 用支持向量机为短期记忆建模
3.7 使用战力值评估模型进行战争役分析
3.8 设计一个多层可插拔的AI引擎
3.9 一个管理场景复杂度的模糊控制方法
第4章 脚本和数据驱动系统
简介
4.1 脚本语言总述
4.2 把C++对象绑定到Lua
4.3 使用LUA协同程序实现高级控制机制
4.4 在多线程环境里处理高级脚本执行
4.5 使用非插入型代理导出角色属性
4.6 基于组件的游戏对象系统
第5章 图形学
简介
5.1 交互角色真实的静止动作合成
5.2 用自适应二叉树进行空间剖分
5.3 用有向包围盒增强对象裁减
5.4 皮肤分离的优化渲染
5.5 GPU地形渲染
5.6 基于GPU的交互式流体动力学与渲染
5.7 基于多光源的快速逐像素光照渲染
5.8 路标渲染的清晰化
5.9 天空渲染在游戏中的实际运用
5.10 基于OpenGL帧缓冲区对象的高动态范围渲染
第6章 音频
简介
6.1 由可变形网格(DeformablecMeshes)实时生成声音
6.2 实时音效轻量级生成器
6.3 实时混音总线
6.4 可听集(PotentiallycAudiblecSets)
6.5 一种开销较低的多普勒效果
6.6 仿造实时DSP效果
第7章 网络及多人在线
简介
7.1 3D动画角色数据的动态自适应流
7.2 大规模多人在线游戏基于复杂系统的高阶架构
7.3 为游戏物件生成全局唯一标识符
7.4 利用SecondcLife为大规模多人在线游戏原形设计游戏概念原形
7.5 稳定的P2P游戏TCP连接及敏感NAT1a1c1ac111c111a1a1