天龙八部技术分析报告

刘洋

通过一段时间对天龙八部这款游戏进行分析研究,主要从客户端入手,从技术
角度学习天龙八部游戏中各种实现机制。最终写成此文,献给搜狐游戏,以表敬
意。
本文主要分为三个部分,分别是1 天龙八部基本技术实现技术分析,2 天龙八部
中使用的资源文件分析3 天龙八部中出现的问题及改进意见。
本报告实属本人分析总结,其中必定会有很多错漏之处,望给予指正。
一:天龙八部的基本实现技术:
所用图形引擎: Ogre
OGRE(Object-Oriented Graphics Rendering Engine,即:面向对象图形渲染引擎)
是一个用C++开发的面向场景、非常灵活的3D 引擎,它旨在让开发人员更容易、更
直接地利用硬件加速的3D 图形系统开发应用。这个类库隐藏了底层系统库(如:
Direct3D 和OpenGL)的所有细节,提供了一个基于世界对象和其他直观类的接口。
在研究使用ogre 之前,我一直在学习torque 引擎,并用它做出了一款mmorpg
游戏《盘古online》,但在考察其内部结构过程中发现其过于复杂且耦合性很高,
还有很多冗余代码。这使得项目在发布之后做进一步深入时遇到瓶颈,使得我不
得不暂时放置它,来寻求新的解决方案。在研究ogre 的过程中,我被他清晰的
结构所折服,更为他API 级别的调用接口和插件设计而高兴,这样的设计可以使
研究者在引擎学习过程中直接通过底层API 调用,并且在积累一定程度后可以通
过自己写插件来扩充引擎的功能。除此之外他还和cegui 界面库,ODE 物理库,
python、lua 脚本语言有方便的结合接口。这无疑是研究引擎和自主研发引擎的
一个很好的入手点,自主开发引擎一直是我一个理想,我慢慢努力,向这个目标
迈进。
所用物理引擎: 自主研发
我通过游戏中的观察,发现没有实现非常复杂的物理机制,碰撞是使用包围盒的
方式实现的。在bin 文件夹中寻找,没有找到所知的物理库的dll。故推测物理方
面是自主研发的。
所用网络层: 自主研发
据我所知中国拿ogre 做引擎的人很多,不过网络部分基本都是自己开发的,在
国外有Realm Crafter, Multiverse, Project Darkstar 比较好的网络引擎包,相信
在国内也有很多人在用吧。
使用的界面库: cegui
这是一套强大的界面库,里面包含了大量游戏中所需要的控件,并且可以自由定
制。可以使用辅助工具来图形化设计控件的属性,十分方便。最关键的cegui 是
完全免费的。
使用脚本语言: lua
Lua 是与python 齐名的脚本语言,最早了解他是因为他是著名游戏《博德之门》的
脚本语言,之后在游戏界影响最大的当属应用于WOW 中。之前用过一段时间python
语言,其以本身的易用性和大量扩展的库而闻名。Lua 和他有很明显的区别,他非常
小巧而且更加高效,他所需的库是直接依赖与宿主语言实现的。比如C/C++。这就决
定了他作为游戏脚本语言的先天优势,据我所知现在很多游戏公司在自己的引擎中使
用lua 语言。
二天龙八部中使用的资源文件分析
模型格式: .mesh
这是ogre 的标准格式,是二进制格式保存了模型网格的相关信息,如顶点坐标,
贴图坐标、顶点法线等。
骨骼格式: .skeleton
这是ogre 的标准骨骼动画文件,是二进制格式,保存了骨骼动画中关键帧信息。
贴图文件: .jpg、.tga、.dds 文件
不同格式的图片文件,其中 tga 和dds 拥有alpha 通道,dds 是可以硬件加速的
图形文件。
配置文件: .txt
普通文本文件
文件打包格式: .axp
这是天龙八部特有的文件打包格式。
天龙八部目录结构:


Accounts:是记载在本机登录天龙时,登录服务器和用户等信息,根据不同的用
户建立不同的文件夹。
Bin: 天龙八部可执行的.exe 文件和众多需要引用的.dll 动态链接库。
DirectX9: 微软多媒体应用库,主要使用里面d3d 部分和dsound 的API 接口。
Helper: 保存了众多游戏里面应用到的帮助文件,以HTML 形式提供。
Patch: 升级补丁包的存放位置。
Lanch.exe 天龙八部游戏引导窗体。
Data: 游戏所使用所有资源的存放地,下面仔细分析其内部结构。
Data 包文件结构:
Data/sound.axp :天龙八部中使用的声效文件。
其中包括了众多的.wav 波形文件。这种文件与.midi 不用,他在播放时是需要耗
费系统资源的,他保存了原始的声音对应的数字波形信息,在播放时需要CPU
处理,将处理后的结果输送给声卡。MIDI 则可以直接交给声卡播放。
Data/brushes.axp: 保存了绘制场景地形所需的图片资源。分为Jpg 和tga 两
种。(比如说无量山的地表纹理贴图)
Data/config: 保存了各种角色的行为属性和事件任务,通过脚本定义实现。其
中包括每种怪物的ActionSet,各种事件event 定义(比如说师门任务)等。
Data/effect.axp: 保存了游戏中所有的技能和装备的效果文件,主要是定义粒
子相关的发射器,效果器等属性。(比如一个法杖在镶嵌了不同的宝石后会有什
么样的粒子效果)
Data/interface.axp: 保存了各种界面元素的配置文件,用以标识各种窗口、界
面的位置,大小等信息。主要以cegui 的配置文件.layout、xml 文件,lua 脚本文
件为主。
Data/LanchSkin.axp: 保存了登录引导界面的图片文件,比如背景图片文件,
按钮图片等。
Data/Material.axp: 保存了各种模型贴图和河流等部分环境场景贴图文件
以.dds 格式存储。
Data/model.axp: 保存了游戏中所用到的所有场景模型、角色模型的mesh 文
件,和skeleton 骨骼动画文件。
Data/scene.axp 中资源:为具体场景的地形资源,其中包括如下几类
1. Esd : 记载着该场景声音信息的文本文件,具体格式如下:
ID 声音ID 声源位置X 声源位置Z 有效距离 连播次数 间隔时间(ms) 下
一次连播间隔时间(ms)
0 387 128 128 512
1 360 21 37 15
2 360 10 53 15
示例中只定义了声音的ID,生源位置的X 和Z 坐标和听到声音的有效距离。
2. Gridinfo : 地形网格的属性
3. heightmap : 地形高度图,用于生成地形网格高度
4. lightmap : 地形光照贴图,用于生成地形阴影。
5. path : 记载地图中的路径信息(可能是怪物的路径点集合)
6. rangion :文件属性未知
7. scene :保存场景中enviroment、light、StaticEntity、Model 等实例的信息。
用XML 格式保存。
示例:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Scene formatVersion="0.1.1" name="baozang_1">
<Terrain filename="baozang_1.Terrain"/>
<Object name="#FairyEnviroment" type="Enviroment">
<Property name="ambient" value="0.078431 0.058824 0.133333"/>
<Property name="fog.mode" value="linear"/>
<Property name="fog.colour" value="0.070588 0.439216 0.737255"/>
<Property name="fog.linear start" value="2500"/>
<Property name="fog.linear end" value="6000"/>
</Object>
7.Terrain:保存地形网格的贴图信息,包括高度图信息,光照贴图信息,网格信
息,所用到的贴图列表索引,
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Terrain name="baozang_1" tileSize="32" xsize="256" zsize="256">
地形信息,名字、每块地形大小,相应x,z方向的块数。
<scale x="100" y="100" z="100"/>
地形的缩放倍数
<centre x="8100" y="0" z="-8000"/>
地形的中心点位置
<heightmap filename="baozang_1.Heightmap" type="standard"/>
高度图
<gridInfo filename="baozang_1.GridInfo" type="standard"/>
地形网格模型信息
<lightmap filename="baozang_1.lightmap.png" type="image"/>
光照贴图
<pixmap bottom="0.2480469" left="0.00390625" right="0.4960938"
textureId="0" top="0.001953125"/>
每块贴图对应的绘制面积
<materials>
地形层次的材质信息
<template material="Terrain/OneLayer" name="OneLayer"/>
<template material="Terrain/OneLayerLightmap"
name="OneLayerLightmap"/>
8. WCollision:可能是场景中会发生碰撞的位置标记。(如果这样就像2D 游戏中
的碰撞实现了)。
三 天龙八部中出现的问题及改进意见
1 场景管理:
出现现象:天龙八部使用ogre 的八叉树室外场景管理技术,地形通过LOD 提高效率。没有
提供室内场景的管理方式,所以在很多应该在室内处理的场景没有实现,例如:洞穴的场景、
大型多连通房间内部的场景。
原因分析:ogre 提供了强大的室外场景管理,但对于室内场景则是使用quake3 的地形文件,
通过BSP、portal 技术实现的管理,众所周知这是卡马克在quake 中使用的管理场景的技术,
由于使用的年代过早,现在已经比较少在商业引擎中所使用,再者这种格式已经被很多人所
了解,如果加密不当,存在安全隐患。
改进方案:结合现有资料,重新写一个室内地形的管理方法,使用BSP、portal 技术实现的
管理是现在成熟可行的选择。


2 场景剔除:


(NPC 门卫人物裁切前)


(NPC 门卫人物裁切后)
出现现象:天龙八部中使用的第三人称摄像机大体是从上向下30°~60°俯视人物角色,这
样做的好处就是能看到的区域即时把视角拉到60°也是很小的。这样场景中出现的角色就
会大大减少,通过裁剪技术提高效率。天龙也正是这样做的,他把距离裁剪定的很近,稍微
远一点的角色就直接被裁减掉,当视角在60°左右比较明显,角色走远,但在未消失在视
距以外时突然消失。
原因分析:网络游戏要求游戏帧数在30 以上,最好是保持在60 左右,这就对游戏实现的效
率提出了高要求。而现在的游戏,占游戏循环时间最多的就是渲染,怎么让一桢渲染更少的
三角片,是人们一直追寻的方向。可见天龙在这个方向走的很远。但就游戏性来说,从一个
玩家的角度,来使用这样的视野是很不习惯的。玩惯3D 游戏的玩家,喜欢五方向轴的摄像
机,可以观察天空,云彩,地面。因此感觉真实。而天龙摄像机的设定就无法满足要求。
改进方案:根据现在的设定,若要改变摄像机为标准3D 摄像机,还要在裁剪、雾效等多个
方面修正,得不偿失。要剔除角色突然消失现象,只要适当增加一些裁剪范围。
3 雾效:


出现现象:天龙八部中的雾效比较不真实,在一些山地场景中,使用的雾效效果不理想,只
使用了一层蓝紫色的雾,看起来很不舒服。
原因分析:天龙八部的雾效处理使用的是ogre 自带的方法,提供FOG_LINEAR、
FOG_EXP1、FOG_EXP2 雾。这是一些比较简单的雾效,但在游戏中应用比较广泛,要
实现好这种雾效,需要美术人员的协助,调整一个好一些的数值。
改进方法:重新调整雾效的参数使得其更加合理美观,除此之外,我们可以使用体积雾效实
现更加真实的效果。
4 碰撞:


出现现象:天龙八部中在碰撞中处理不是很好,在很多地方出现角色与建筑物穿插的现象。
特别是当人物在骑乘状态,比如玩家骑乘20 级的陆行雕时,雕的翅膀就会穿插到建筑物里
面。
原因分析:天龙八部里面的人物和建筑物等的碰撞是使用包围盒(推测)实现的。平时人物
正常行走时,人物和建筑物的碰撞是比较正常的。当人物骑乘了宠物,这时体积变大,但人
物的碰撞盒还是原来的大小,只有中间的一块,于是造成大量的穿插现象。
改进方法:可以根据人物骑乘的宠物适当增加碰撞盒的大小,但不宜增加太多,否则可能出
现,在比较狭小的地方人进的去,但是若进去后骑宠,则卡住的现象。要在合理性与实现性
中寻求一个平衡点。
5 跟随:


出现现象:宠物或是跟随的队员,在速度达不到队长,被拉下一定距离时会出现瞬移现象。
从游戏性上来说,小型宠物的瞬移是不易被觉察的。但大型宠物和人物的瞬移在视觉上会给
予游戏者造成一定影响。
原因分析:天龙八部中,逻辑程序员在跟随模块的实现时,设定了类似的实现机制,跟随状
态时当跟随者和被跟随者超过一定距离,跟随者的位置坐标就设置成与被跟随者位置坐标成
一条线稍后的位置。
改进方法:
方法一:在一些游戏中有如下设置,当距离超过一定时,跟随者的速度就会加快到一定程度,
比如说被跟随者的150/100,之后在短时间内跟上后者,之后再把速度降下来。(剑侠情缘2)
方法二:直接把跟随者的速度设为被跟随者的速度,这样就不会有拖后的效果。
6 摄像机对近物处理


出现现象:摄像机跟随人物移动的过程中,对于非地形网格遮挡会出现影响视线,与Entity
距离过近,出现瑕疵。例如场景“剑阁”中的树木,当摄像机不断逼近时,没有进行任何处
理,直到被摄像机近平面裁切。
原因分析:对于场景中的可渲染实例,没有针对摄像机的裁剪做适当处理。
改进方法:在摄像机靠近到一定程度将树木ALPHA 掉,为了实现简单可以做半透明处理,
物体碰撞盒距离摄像机小于一定距离就将其设为30/100 透明。这样即时被近平面裁切掉也
不会影响很大。
7 摄像机抖动:


出现现象:摄像机沿着高处地形表面移动时,出现抖动现象。
原因分析:出现抖动的前提条件是,摄像机的原有位置已经被地形网格所遮挡,为了避免遮
挡玩家视线。把摄像机的位置抬高,天龙八部中设定的是使得摄像机的位置抬高到,当前地
形网格的位置在加一个y 方向的分量。我们知道,地形网格的高度是通过高度图生成的,将
高度图保存在一个二维数组中,数组的下标分别表示x,z 坐标,数组的值是高度y 值。由于
高度图是像素图,在高度位置相邻的点与点之间存在高度差异。如果直接把摄像机的y 值设
定为地形网格数组中离他最近点的y 值加上一个分量的话。必然导致摄像机在移动时的高度
跳变。
解决方法:根据摄像机的位置,对相邻高度数组中的高度进行插值计算,得到的高度结果在
累加一个高度分量作为摄像机的位置。以达到平滑过度的目的。
8 AI 寻路算法
出现现象:npc 寻路算法中,有些地方会出现卡住现象。特别的,在出现有悬崖等大型地形
隔绝的两块相邻地域,寻路算法会出现严重问题,例如我在悬崖上的地域点击地图上悬崖下
的地域,会发现人物自动寻路到悬崖边上就停在了那里。
原因分析:天龙八部程序员在实现寻路算法时(可能是A*的增强版算法)在这种情况下,
实现的代码有瑕疵。可能某些悬崖上的点没有被设定为遮挡块,被算法误认为可以通行。
解决方法:如果是上述原因,将这张地图中悬崖的这些点重新设定为遮挡块。
9 攻击时武器挂接


(攻击前)


(攻击中)
出现现象:峨嵋派角色在攻击时武器消失,在攻击之后,武器又重新出现在手中,让玩家觉
得十分奇怪。
原因分析:这可能是考虑到峨眉派角色是属于远程法术性角色,在攻击动画进行过程中如果
加入了武器,随着手部的骨骼运动,可能会出现穿插效果。即时能够避免穿插效果,在释放
法术时也很不美观。
解决方法:除了美工修改动画以使得佩戴武器攻击也合理的方法外,可以在攻击时将佩戴的
武器绑在背后的骨骼点上,这样既不会穿帮,又比较合理。
10 无限大纹理拼接


出现现象:地形贴图的裂缝问题,在天龙八部的场景贴图时,会发现场景的地形贴图一块与
一块的拼接处会出现裂缝(纹理拼接不上),使得摄像机拉近后看起来会比较假。
原因分析:美工在制作地形无缝贴图时不是做的特别好,左边与右边,上边与下边贴图连接
不上。
解决方法:改进地形贴图的制作,可以在PS 中使用位移,这样就会暴露出瑕疵的位置,在
处理完成后在位移回去。
11 服务器对于玩家信息的同步


出现现象:组队中队员血条刷新过慢,在平时这样影响不大,但是到了BOSS 战中,峨眉专
注于给其他职业加血。如果血条刷新过慢,很可能造成加血不即时,导致团扑。
原因分析:网络传输在队员之间信息传递的延迟问题,但在服务器延迟较小的情况下,这种
延迟应该不会这么明显。可能是在逻辑代码上,有一些问题。比如每隔一段时间服务器才将
各个队员的信息发送给队伍中的其他人,如果这个时间过长,就会造成上述影响,这段时间
过短就会过分加重服务器负担。
解决方法:适当缩短服务器对于玩家信息的同步时间,使得在游戏中血条刷新速度提高。
12 水下处理


出现现象:在一些场景中,玩家角色可以进入水中,但达到一定深度后应该改变为游泳状态,
而天龙设定中角色在水中没有游泳动画,如果角色带有宠物,会出现小型宠物长期泡在水里
面的现象。
原因分析:没有试图实现水下效果,于是没有制作游泳的设定。
解决方法:可以尝试制作水下模块,增加游戏玩法。对于现有模式,可以限制玩家行动范围,
来避免玩家入水过深。
13 阴影体对非地形模型影响


出现现象:玩家的投影只是针对于场景而言,对于其他建筑物是没有投影效果,比如在太湖
水牢外,人物的投影只能打在地面上,不可以打在建筑物上。
原因分析:在实现阴影体时,应先把不会出现阴影的物体渲染,在渲染会出现阴影体的物体,
如角色,之后计算阴影体的位置,再利用模板缓冲区防止二次重绘。在天龙中建筑物使用的
是纹理阴影,在纹理阴影技术之下,一个物体对于某个阴影可以是投射者或者是接受者,但
不能同时兼为两者。换句话说,当物体作为自阴影的产生者之后就不可能再得到自身阴影的
投射了。虽然目前有一种被称为深度阴影贴图(Depth Shadow-Mapping)的改进纹理阴影技
术可以实现纹理阴影的自投影,不过目前Ogre 本身还不支持这项技术。
解决方案:实现深度阴影贴图,或者使用模板阴影。
14 水的效果


出现现象:水的效果不是很真实,天龙八部中的水的使用了简单的纹理动画,这在效率的提
高上是个很好的选择,但是对于高配置的玩家来说,没有让他们体会到更好的效果。可以通
过针对不同的主题使用不同的技术(technique)来实现。
原因分析:程序底层没有实现真实效果的水。
解决方案:可以增加高级水面的效果实现,比如使用pond water,用reflection,refraction map
实现水的效果。
15 角色转动的插值问题
出现现象:人物在行走时突然转向,没有旋转的过程,而是直接变过去。特别是在骑乘飞兽
的时候,会感觉很突兀。
原因分析:在人物旋转过程中没有实现插值,而是直接改变方向。
解决方案:旋转中通过插值计算,使得角色光滑旋转。
总结:
天龙八部是一款难得的用心雕琢的游戏,本文省略了其中非常优秀的部分,只从技术方面分
析其中出现的不好的现象。希望能对游戏进一步研发有所帮助。

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
天龙八部是一款非常受欢迎的网络游戏,其server源码是指游戏服务器端的代码。服务器端是天龙八部游戏的核心部分,负责处理游戏的各种逻辑处理、数据库交互以及与客户端的通信等。 天龙八部的server源码一般是由游戏开发团队开发和维护的,承载着游戏运行的基础设施。这些源码包含了游戏的各个模块,如角色管理、技能系统、战斗系统、任务系统等等。它们通过服务器端的编程语言(通常是C++、Java或者Python等)实现,并通过网络通信协议与客户端进行数据传输和交互。 服务器源码的开发需要具备扎实的编程技术游戏开发经验。在开发过程中需要考虑到游戏的稳定性、性能优化、数据存储和安全等问题。同时,服务器端还需要处理游戏的各种操作请求,如登录、注册、角色创建、物品掉落等等,保证游戏的流畅性和平衡性。 天龙八部的server源码是游戏运行的核心,通过它我们可以深入了解游戏的结构和内部逻辑。在游戏行业内,一些开发者也会通过研究游戏源码来进行二次开发,以满足不同的需求或者开发新的版本。 总结来说,天龙八部的server源码是游戏服务器端的代码,它承载着游戏的核心逻辑和功能。它的开发需要高超的编程技巧和丰富的游戏开发经验,对于理解游戏运行机制和二次开发都有很大的帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值