— AI分享站

Archive
技术闲语

【游戏篇】

0. 我的游戏引擎核阅读心得:找到Update,就找到了一切!

1. 找到游戏主循环:游戏主循环是游戏的核心所在,所以找到主循环至关重要,有几个办法,如果代码是可运行的(一些时候,代码连编都编不过),那比较简单的就是加断点(其实很多时候,都可以用加断点的方式来辅助阅读),这样callstack一看就找到了。如果不能运行,一个办法是从Main函数开始找,还有一个办法,是先找到一个模块,比如input的update函数,然后再顺着往上找。还有一个讨巧的办法,就是搜关键字,比如MainLoop。

2. 熟悉游戏的模块:游戏引擎总有一些常见的模块,比如input,animation,AI,network,sound,render,physics等等,这些模块就是游戏引擎的核心,可以先在引擎里找到这些模块的Tick或者Update函数,由update开始逐渐深入到各个模块的具体运作。看游戏引擎,一般只会挑自己感兴趣的看,因为引擎的东西实在太多,太杂,不可能都去了解。所以一定要有所取舍。

3. 要不求甚解:游戏引擎里面包含了各种技术,每个部分都有很多精彩的东西,但在通篇阅读的时候,有些可以跳过,也就是,只要知道他干吗的就可以了。最好的例子就是math,一些引擎的math实现相当厉害,但对我们来说,只要知道,vector,matrix等等怎么用就可以了,其内部实现,优化方法等完全不用去了解(除非你想学习)。我想到一些游戏中可以不用去了解的部分:基本数据结构(array,list等),math,thread部分,time,memory(但如果要优化内存,或者有bug,就需要看),一些类型的封装(smartpointer等),ScriptSystem(游戏中有时会自己实现一套虚拟机,可以无视)等等

4. 数据的重要性:游戏中的数据十分重要,比如你看AI部分代码,很有可能很多定义都在数据中,如果单看代码会十分难以理解,比较好的就是结合引擎提供的editor来看,先用editor改一下数据,然后再在代码里看相应的代码。还有,现在的游戏引擎很多都用了Script,比如lua,或者游戏自己的Script,比如Unreal,这时候,就要在script和引擎两头转,如果引擎没有提供很好的工具,确实相当麻烦,我到现在还没找到一个很好的办法来解决这样的问题,

5. :阅读游戏引擎需要一点经验,经常会边猜边读,猜的过程,就是一个使用以往经验的过程。总的来说,游戏中用的技术有一定的通用性,虽然名字或叫法可能不同,但基本思想还是一样的,又要举一个我比较熟悉的AI的例子,比如,FSM,有限状态机,看到代码里有类似的名字,那我就能大致了猜到这段代码的实现方法了。

好啦,写了这么多,基本把我想到的,学到的都做了一个梳理,我一方面上班会看一些代码,现在在业余时间也在研究doom的源码(以后可以写个Doom阅读笔记系列,再次崇拜一下伟大的Carmack),还在维护一个游戏引擎(TsiU),可以说,对游戏引擎的积累也慢慢加深,这里share一些东西,也算一个总结,我也是个Game界的newbie,欢迎大家讨论,批评指正。

相关:

---> 阅读代码的一些心得(1)(工具篇)
---> 阅读代码的一些心得(2)(通用篇)

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

Read More

【通用篇】

0. 我的一句话心得:“看代码有时候和阅读外文文章一样,先泛读,了解文章大意,再精读,了解单词语法。”

1. 了解代码的命名规则:代码一般都有自己的命名规范,比如cl打头表示类,E打头表示枚举,函数名前会带返回值类型等等,掌握这些命名规则,可以很方便的知道这个变量或函数的信息,加快看代码的速度,另一方面,对再开发也有很多好处,因为再开发一定要遵守代码中原有的命名规范,我想这也是程序员不成文的准则之一吧

2. 遍历工程结构:在实际看代码前,最好先看看他的solution结构和工程属性,包括哪些工程是lib,哪个是startup proj,工程和工程间的关系是什么。另外,看工程结构也可以大致了解代码中包括了哪些部分,有的项目是以工程来分的,有些是在一个工程中,用folder filter来分的。

3. 以main函数为开始点:和程序运行一下,看代码也可以从main函数开始,一般main函数会分为几个部分:初始化,主逻辑,销毁。初始化可以快速的了解代码中有哪些模块,主逻辑为今后阅读重点,销毁部分基本可以不care。另外,一些库的源代码,可能没有main函数,那就可以结合lib提供的Sample逐渐深入。

4. 拆分代码:一般代码是一个有多个部件组成的,阅读时需要拆分,比如win32窗口程序,一般是控件驱动,大部分的feature代码都可以在处理控件的消息中找到相应的线索,所以就可以按照控件的功能来阅读,逐步到具体实现方法,再比如stl源码,因为本来各个部件就比较独立,就可以按照头文件的分类逐步阅读。

5. 关心值得关心的:代码中有很多无用的信息,比如打印debug消息,profile,assert等等,代码中可能还有很多被称之为guard的代码,就是保护代码,也可以无视。当然,要从一大堆代码中取其精华,去其糟粕,需要一定的经验积累。

6. 用写者的角度思考:阅读代码,必须一直想几个问题,“如果是我,我会怎么实现?”,“作者为什么要这样写”等等。因为看代码如同阅读别人的逻辑思维,只有投入和思考后,才能产生共鸣。

(待续)

相关:

---> 阅读代码的一些心得(1)(工具篇)

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

Read More

一般游戏代码的量都是相当惊人的,在开始做项目的时候,特别是porting项目,都会阅读引擎代码,所以阅读代码的能力确实不可或缺。在进公司后做的第一个项目,我看代码的能力有了很大的提高,记得第一个项目的引擎代码有180万行,我和一些新进的同事,足足研究的了3个月,收获颇丰,后来也陆陆续续的看了多种引擎的代码,有一些心得,和大家分享,有些有可能和游戏相关,不过大体都比较通用。我将分为工具篇,通用代码篇,游戏专用篇来写。

【工具篇】

0. 我选工具的宗旨:尽量使用开源或者免费的工具,工具尽量轻量化。

1. 找一个好的阅读代码的工具:好的工具的基本标准是可以支持类,函数,变量的跳转等,现在的项目大多都用VS创建,所以VS一般就是首选,2003的话需要辅助VAssist,2005本身功能就比较强,就不太需要另外的插件。如果有两个显示器,或者显示器比较大,可以推荐SourceInsight。

2. 找一个好的UML的工具:现在代码大多是OOP,很多类的层次结构相当复杂,所以画UML图的方式就可以非常方便的理清各个类之间的关系,UML有很多内容,我一般就画一下类图,UML的工具也很多,推荐starUML,这个是开源的,而且非常轻量化,相当好用,其他诸如,Visio,RationalRose,也都可以。很多人也许习惯用纸和笔来画,虽然这样很快,但我觉得,这种方法比较不利于文档化和共享。

3. 用wiki来记录:wiki对于阅读代码来说是一个非常好的share和文档化工具,特别是有很多人一起看一个代码时,优点尤其明显。在阅读代码的过程中,可以在wiki上写一点notes,这样其他人在看到这部分代码时,就不用重新去理解代码内容,而可以结合你写的notes来辅助阅读,这样就大大节省了时间,到最后,整个wiki里就成了这个项目的文档,一举两得啊。我在一个项目里用过这个方法,效果相当不错。推荐几个pmwiki(开源,并且不需要额外的数据库),mediawiki(开源)。

(待续)

————————————————————————
作者:Finney
Blog:AI分享站(http://www.aisharing.com/)
Email:finneytang@gmail.com
本文欢迎转载和引用,请保留本说明并注明出处
————————————————————————

Read More