登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

秒大刀 博客

好好学习 天天向上

 
 
 

日志

 
 
 
 

网络游戏资源组织  

2009-01-07 18:20:42|  分类: Game |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

总述

       网络游戏一般都是基于CS的架构,部署时服务器一般归运营公司所有,客户端则要部署到玩家的机器上。

       网络游戏客户端发布时一般包括:可执行程序、美术资源、音频资源、表格、脚本,其中除了可执行程序外的其他部分一般统称为资源。也就是说游戏客户端就是exe+资源,换了资源也就换了一个游戏,当然游戏的类型不会改变。

       服务器端发布时一般包括:可执行程序、部分美术资源、表格、脚本、数据库。其中的美术资源用于一些辅助运算,比如:服务器端阻挡点的计算。数据库是用来持久化的,玩家下线后过几天重新上线后当时所有的游戏状态都应该被正确恢复,这就是数据库的主要功能。

       游戏是一个需求变动非常频繁的特殊软件领域,为了应对这些变化经常把系统中不改变的部分固化到可执行中,而将易变动的部分通过配置文件的形式提供。这样就可以简单的通过修改配置文件来调整游戏的功能,比如:某个怪物的攻击力由5改成3。对于这样数据形式的配置通常是通过表格来做的,而对逻辑的配置通常是通过脚本来做的。这就是游戏中应对变与不变的最基本原理。表格应对数据变化,脚本应对逻辑变化。通过这些快速易改的方案,避免直接修改游戏核心代码带来的巨大的风险和令人憎恶的编译时间。赢得了时间也就赢得了市场。

 

客户端打包加密

       一款游戏需要的美术资源和其他资源的数量绝对是一个天文数字,若将这么多的文件散落在磁盘中,管理这些碎小的文件对操作系统来说将是一件皱眉头的事。而且游戏访问这些多而小的文件时将导致频繁的文件打开关闭,效率非常之差,绝对会成为影响游戏性能的瓶颈。如此多的小文件,若玩家不小心误删除或修改也会导致游戏发生不可预料的结果。再者,这些资源都是游戏开发公司花了巨大的代价做出来的,比如漂亮的图片、精美的3D模型、动人心弦的音乐等等,如果这些资源都自由散落在磁盘中,那么很容易被别人或者竞争对手拿去做一些意想不到的事情。所以,市面上几乎所有的游戏,都用了同样一种模式来应对以上所述的问题——资源打包。

       资源打包其实我们天天都在用,RAR、Zip本身就是通用的资源打包方法,将一堆小文件压缩后再拷贝就会发现非常的快(不考虑压缩打包本身的速度)。游戏也会采用类似的方案去将一堆的文件合成一个文件,不过为了防止竞争对手破解自己的资源包,几乎每家公司都用了自己特有的打包方式。打包过程的通常做了更多的事情,比如压缩、加密、文件重新排序以方便访问等等。游戏发布的时候就会将很多资源以很简洁的几个资源包的形式去发布,游戏启动后一旦打开资源包文件就不再关闭,直到游戏关闭。游戏过程中对资源的访问其实是在读取包文件中特定的数据段,如此就可以很好的解决性能问题。

       游戏客户端的表格和脚本都是需要加密的,否则玩家很可能会通过修改某些敏感的数据来破坏游戏规则进而影响到游戏平衡性甚至正常的运营。游戏客户端可执行程序本身一般也是要加壳的,以避免通过修改客户端来制作外挂或者更恐怖的事情。游戏网上跑的数据一般也都是加密压缩过的,也是要避免某些人通过分析网络包来制作外挂,比如篡改网络包或者网络包重放。

 

服务器端资源部署

       服务器端因掌握在运营公司手中,玩家不会拿到,故一般不需要对各种资源和可执行程序进行加密(不过现在有黑客可以将整个服务器的数据全部盗走)。服务器端一般只将不可变的资源进行打包,可变资源一般都不打包,比如脚本或者数据表格。因为这可以通过修改表格或者脚本在服务器不停机时动态的修改服务器的行为。有的公司甚至做到服务器“永”不停机。服务器一般都配备非常大的内存,这些表格脚本之类的一般都是直接加载到内存,游戏中用的时候也是直接从内存读取的,很少访问磁盘,所以性能没有问题。

 

脚本

       脚本一般是用来制作游戏中灵活易变的逻辑。目前游戏主流的脚本语言是lua——号称是世界上速度最快的嵌入式脚本。Lua有短小精悍的解释器,可以和C、C++语言非常非常好的协作,这点上其他任何脚本都做不到lua这么好。客户端嵌个脚本引擎,服务器端也嵌个脚本引擎,然后一堆脚本就在里面跑来跑去。脚本引擎是游戏中非常重要的一块。

 

表格

       目前可能最好的电子表格还是Excel吧,游戏中填表的任务一般都是策划干的,而策划肯定会指名道姓的说要用Excel2007或者更新更爽的工具的。但对程序来说Excel表格不能直接带到客户端,因为玩家不一定装了对应版本的OfficeExcel,即使装了程序也不好直接通过OfficeExcel来访问OfficeExcel中的内容。当然也Excel也不能被带到服务器,因为服务器可能压根就是linux的。为了解决策划人性化接口和程序数据接口的矛盾,需要将表格数据重新装换,这就是打表工具的功能。

       常见的游戏表格数据格式有:txt、xml、lua、bin等。Txt当然最简单了,不过描述性最差,很难包含结构复杂的表格,常用逗号或者tab来作为列分隔符,每行表示一条记录。Xml功能很强大,但大型xml(MB以上)的解析速度非常慢,甚至会造成游戏卡死的假象。Lua格式的表格是利用lua语言内部表这个数据结构实现的,相当于将数据写成一份lua的程序代码,然后让lua引擎去加载。Bin格式就时根据表格格式直接将表格数据写成自定义的二进制格式,目标文件小,加载迅速。

       打表工具的工作流程就是:打开excel文件,读取其中的数据,翻译成目标格式并输出。比较优秀的打表工具可以在打表过程中执行一些数据合法性的严重工作,比如是否为空,数字不能填成字符串之类的工作。Eddy的打表工具还支持代码生成功能,它将根据配置文件对表格数据进行规则检验的同时自动化生成读取该bin格式表格的C++代码。

       好的表格系统将对策划是友好的,对程序读取是友好的,性能好,目标尺寸小。

 

 

秒大刀2008年12月12日写给杨婷


 2010-04-12

    风云一篇《实现一个简单的虚拟文件系统》讲到了游戏资源打包,可以参考。


2011-10-15

    推荐风云文章《游戏资源的压缩、打包与补丁更新


2011-12-21
    Excel数据读取可参考Use Excel2007 as DBUse Excel2003 as DB
    Lua只读表格可参考lua readonly table,更复杂lua对象也可进行序列化
  评论这张
 
阅读(1753)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018