Quake源代碼分析(草稿).1

转载 2006年05月18日 14:19:00
       Quake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的CS,它就是在Quake2引擎上改良而來的.雖然裡面的代碼實現並不完全相同,但是整體框架還是Quake2的,只要是稍微接觸過Quake引擎的人都很容易看得出來.(它是那麼的經典,以至於一直沿用到今天,個人認為它是遊戲領域大型結構化設計最好的一個典範.現在很多遊戲已經改用面向對象的程序設計方法來編寫,但Quake的影響卻是深遠的.包括前段時間洩露的CS2源碼,它的架構仍然保留著些許多Quake風格.)
        很多人告述我Id Software 很早之前就已經公開了 Quake 3全部源碼.這裡我要告述大家,其實Id公開的並不是所有的源代碼,而僅僅是邏輯層代碼,你想想看哪個公司會笨到將自己的核心技術傾囊倒出,這些可是他們吃飯的本錢啊!邏輯層的代碼只包括了UI,AI等實現.像圖像渲染,網絡傳輸部分均沒有給出.你看到的唯有函數的聲明部分.因此要徹底研究Quake3就必須獲得這部分的源代碼,可上哪去找呢?令人興奮的是,早前已經有牛人通過逆向工程的方法將Quake3核心代碼整理出來,做了一個仿Quake3引擎(Dusk3D).我下面的分析就是根據他的代碼來寫的,雖然跟真實的Quake3引擎比較也許會有些出入,但我相信那並不影響我們去理解Quake3.
         類如大多數Win32應用程序,Quake的Win32部分也是從WinMain函數進入的.邏輯層被分成了cgame,game,ui,q3_ui四個主要的模塊.(這幾個模塊被做成dll程序,由引擎負著加載它們)Quake中dll與引擎之間的交互通過vmMain和dllEntry這兩函數來完成.
        vmMain作為引擎程序訪問邏輯層dll的接口,引擎使用VM_Call函數調用邏輯層dll引出的vmMain,然後vmMain再根據引擎提供的要訪問函數的索引號查找到相應的函數實現.
       dllEntry是邏輯層dll接收引擎系統函數的接口,邏輯層dll利用它調用引擎專門提供給他的系統函數.
       SV_GameSystemCalls是引擎提供給game模塊的系統函數調用接口.CL_CgameSystemCalls提供給cgame模塊,而CL_UISystemCalls則是提供給ui模塊使用.上述這幾個函數的實現方法與vmMain十分相似,它們都是通過一個Switch語句根據傳入的索引號跳轉到指定的函數處.
        以下是dllEntry函數的實現,可以看到它只有一個參數,一個函數指針,這個函數指針就是指向引擎提供給邏輯層模塊的接口函數,例如SV_GameSystemCalls:
        static int (CDECL *syscall)( int arg, ... ) = (int (CDECL *)( int, ...))-1;
        void dllEntry( int (CDECL *syscallptr)( int arg,... ) ) {
                 syscall = syscallptr;
        }
常見的trap打頭的函數實際上是調用了引擎代碼的,具體如下:
        void trap_Printf( const char *fmt ) {
                syscall( G_PRINT, fmt );
        }
了解了調用規則後,我們就可以比較輕鬆地跟蹤調試Quake源碼啦.

Quake源代碼分析(草稿).1

Quake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的CS,它就是在Qu...
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:14
  • 638

Quake源代碼分析(草稿).3

消息處理:        我把Quake的消息分為兩類,一種是常用輸入設備產生的消息,譬如KeyBoard,Mouse,JoyStick等.        另一種就是網絡或本地傳輸數據包時引發的消息....
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:15
  • 668

Quake源代碼分析(草稿).4

Quake網絡部分總結: (1) 網絡部分被分為接收和傳送兩個部分. (2) 傳送部份被分為本地數據包傳輸和異地數據包傳輸兩個部分. (3) 本地封包傳輸由NET_SendLoopbackPacket...
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:16
  • 619

Quake源代碼分析(草稿)

Quake是Id Software公司推出一款風迷全球的FPS遊戲.至今為止已經發展到了第三代,而且作為一個優良的遊戲引擎,它也被大量的運用到其他公司開發的遊戲當中.例如我們所熟知的CS,它就是在Qu...
  • zhouqishi
  • zhouqishi
  • 2014年10月31日 15:06
  • 151

QUAKE 3源代码审查:渲染器

QUAKE 3源代码评论:RENDERER(第2部分,共5部分)>> Quake III渲染器是Quake II硬件加速渲染器的演变:经典部分是建立在“二进制分区”/“潜在可见集”架构上,但...
  • tailiangliang
  • tailiangliang
  • 2017年07月30日 08:42
  • 256

DiskLruCache源码解析

DiskLruCache是google开源的一个本地缓存类,虽然没有成为android的库类,但是非常好用,我个人推荐使用这个类进行缓存。 当然也已经有很多人在使用这个类了,但是很多事情,我们不但要知...
  • kangaroo835127729
  • kangaroo835127729
  • 2015年04月23日 00:34
  • 1750

QUAKE系列引擎以及基于QUAKE扩展引擎的源代码分析

前言: 一:研究quake系列引擎断断续续也已经两年有余了,一直想写点什么,但是真的到了那一步,又发现其实很难下笔,原因有三:1 文笔不流畅,特别是技术性技巧的缺乏,概念难以精确定义,无法想内心的真实...
  • Chinamming
  • Chinamming
  • 2013年11月25日 01:24
  • 1419

T4代碼生成器(1)

轉自http://www.cnblogs.com/lzrabbit/archive/2012/07/18/2597953.html
  • qq_22150821
  • qq_22150821
  • 2017年07月18日 18:25
  • 68

代码生成: 利用SQL生成SQL代码

作者 Haidong Ji --- 作为一位DBA或者程序开发者,随着越来越富于经验,无疑会收集一些使工作和生活更为有趣的技巧和窍门。在SQL编程方面,我就有一个窍门。 你可能认为SQL仅仅是查询...
  • Suprman
  • Suprman
  • 2015年10月16日 12:43
  • 2738

quake3 code 源代码 编译调试。保证通过。

原地址:http://www.cnblogs.com/roland1982/articles/5045624.html quake3 code 源代码 编译调试 。保证通过。 Qu...
  • mayao11
  • mayao11
  • 2015年12月14日 16:26
  • 2302
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quake源代碼分析(草稿).1
举报原因:
原因补充:

(最多只允许输入30个字)