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

       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源碼啦.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值