有前人这么定义,软件=算法+数据结构,进入面向对象后更直接,软件=对象+对象+对象+...+消息。而对象是什么,是一个个类的实例化,类又是数据和方法的集合。
这么说来,也可以有如下定义,游戏 = 游戏引擎+资源文件。
而当今的游戏,对于显示可能使用已经成熟的渲染引擎,而对于游戏内的逻辑处理,或者用成熟的脚本解释其例如Lua,Python,要不就自己实现一套解释环境,将更多的游戏内逻辑下放到脚本层,通过脚本来驱动整个游戏。脚本也就是ASCII的文本文件,其实说白了就是资源文件,只是相比传统的声音,图片分量要重得多。可以说对于游戏而言,其数据也十分重要,这里也就提出,数据逆向的概念。
代码逆向工程主要是利用反汇编分析出程序代码的执行流程,进而了解和掌握程序里的秘密,而数据逆向工程更注重数据部分。逆向数据结构也就是数据逆向工程,它可以包含网络数据包分析,库函数分析,文件存储结构分析等。
很对人都喜欢高级语言,而不喜欢低级语言,原因是高级语言提供了丰富的函数和高级指令,短短几十行代码就能够创建出一个具有一定功能且能正常运行的程序,相反低级语言不具备丰富的函数库,也不提供高级指令,要编写什么程序都需要从底层做起,十分麻烦和不方便。
但是,一切高级语言的特性在编译成可执行程序后就消失了,剩下的只是将一段一段的汇编指令交予CPU执行,这里推荐一篇文章《 C/C++程序员是否应该掌握某种汇编语言》,写的真的些很好,对于事物究其本质,而不是追逐那些浮华的东西。
话说在去年的时候,还想着能把《Effective C++》里面的50条Tips特性,通过逆向去学习,然后总结成小册子的,不过没有坚持下来。现在更是没时间,也没精力去完成啦。
最后扯两句,资源打包的几点好处:
1.加快文件读取速度
将多个单独的资源文件打包成为一个归档文件可以利用索引ID快速定位读取游戏所需要的资源,相对操作系统的文件系统而言,操作系统定位一个文件是使用文件名路径字符串,利用索引定位就要快速很多。
2.有效利用缓存
文件系统高速缓存会加快从硬盘到主内存的数据传输,文件系统高速缓存其实就是系统内存开辟的一个区域。
3.减少文件操作
I/O操作是很耗时的,如果将小文件打包成为一个归档,这样可以提高游戏响应速度。
4.减少碎片
操作系统以簇大大小为单位存储文件,一般Windows中标准的簇大小为4.096KB/簇,也就是说一个少于4.096KB的文件依然会占用4.096KB。但是如果打包成为存储文件,可以减少存储文件产生的碎片。
5.保护资源文件
图片,声音,动画,配置,脚本….都是非常重要的资源,玩家可以汉化,修改声音表现,将高等级贴图直接替换低等级….如果客户端都被玩家按照自己的方式DIY,影响其实倒不是那么大,如果玩家将一些重要的配置或者控制脚本修改,有可能会造成非常恶劣的影响。