关闭

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

标签: 引擎dllui框架
2329人阅读 评论(0) 收藏 举报
分类:
       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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:136192次
    • 积分:1408
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:49篇
    • 译文:1篇
    • 评论:21条
    游戏相关
    友情BLOG