C++ 大神 John Carmack 的編程傳說

你是否也曾發現那些頂級球星常常能夠輕鬆做出各種高難度動作,而其他球員卻無法做到。你是否也在疑惑這其中的原因,為什麼頂級球星看起來毫不費力?

作為一名C++程序員,John Carmack 的源代碼就像頂級球星的球技一樣震撼著我。其代碼簡單而強大,我很想知道自己如何才能像他一樣優秀。

C++ 大神 John Carmack 的編程傳說

讓我們來探索 Doom3(遊戲:毀滅戰士) 的源代碼,深入其中,尋找這些代碼簡單但強大的原因。

2011年11月23日,id Software(遊戲軟件公司)延續自己的傳統,發佈了他們之前引擎的源代碼。這些源代碼被眾多開發者審閱,下面是其中一個針對 Doom3 的反饋信息:

Doom 3 BFG由 C ++編寫,C++是一門既強大又複雜的編程語言,它可以編寫出無比優秀的代碼,但同時也可能讓你欲哭無淚。幸運的是,id Software的 C++子集(擁有類的 C 語言)可以讓你輕鬆運用 C++ :

  • 沒有異常
  • 沒有引用(使用指針)
  • 儘可能少使用模板
  • 常量無處不在
  • 擁有類
  • 多態性
  • 繼承

它僅僅是 c++ 98 標準的一個子集。以下是 Doom3 的一些特性:

1、提供一個強大的基類

眾多的類都從 idClass 繼承而來:

C++ 大神 John Carmack 的編程傳說

idClass 提供了下列服務:

  • 實例創建
  • 類型信息管理
  • 事件管理
C++ 大神 John Carmack 的編程傳說

需要c++零基礎視頻 開發工具 系統學習路線,私信回覆 關鍵字:“777” 獲取

2、字符串操作非常簡單

通常來說,字符串是一個項目中最常用的數據類型,許多功能都需要字符串來完成,我們需要使用函數來處理它們。

Doom3 定義了一個 idstr 類,它幾乎包含了所有與字符串操作相關的方法,非常實用。這樣一來,你就不必像其他框架那樣需要根據不同的字符串類來定義自己的方法。

3、源代碼與GUI框架(MFC)高度解耦

在很多使用 MFC 的項目中,代碼與它們的類型高度耦合,並且你可以找到任何代碼在 MFC 中的類型。

在 Doom3 中,代碼與 MFC 高度解耦,僅有 GUI 類與之直接相關。如下面的 CQLinq 查詢所示:

C++ 大神 John Carmack 的編程傳說

這個特性大大提升了開發效率。的確,只有 GUI 開發人員必須關心 MFC 框架,而對於其他開發人員來說,則並不需要在 MFC 上浪費時間。

4、提供了一個非常強大的utility程序庫(idlib)

幾乎在所有項目中,utility 程序類都是最常用的,如下查詢結果所示:

C++ 大神 John Carmack 的編程傳說

從以上查詢結果可以發現 utility 是用得最多的。如果 C++ 開發人員沒有一個強大的 utility 程序框架支撐,那麼他們將不得不花費大量的時間自己編寫。

idlib 幾乎提供了很多實用的類和方法,可用來處理字符串、容器和內存。這有利於提升開發人員的工作效率,讓他們更加專注到遊戲邏輯上。

5、容易理解

作為 C++ 開發人員應該都知道開發解析器和編譯器並非易事,而 Doom3 成功實現了一個硬編碼的編譯器。並且 Doom3 的實現代碼非常簡潔也很容易理解。

下圖展示了編譯器使用的類之間的依賴關係:

C++ 大神 John Carmack 的編程傳說

以下是編譯器源碼的代碼片段:

C++ 大神 John Carmack 的編程傳說

過去我也曾研究過很多解析器和編譯器的源代碼。但是,這是我第一次發現一個編譯器的源代碼如此易懂,除了編譯器之外,整個 Doom3 的源代碼也一樣容易理解。這真的很神奇。當我深入研究 Doom3 的源代碼時,發現這些代碼真的寫得太好了。

Doom3 的源代碼只使用了 C++ 標準的一個子集,它非常簡潔並且易於理解和維護。它遵循代碼設計、命名和格式化的基本規範,並沒有使用高級技術。

John Carmack 的編程秘訣是完全遵循維基百科定義的 KISS 原則:

KISS 是由美國海軍在1960年提出的一項設計原則,KISS 是 “ Keep it simple, stupid ” 的縮寫。KISS 原則指出,相比於複雜的系統,越簡單的系統往往運行效果越好。因此簡單性應當是設計過程中需要關注的關鍵指標,同時應當儘量避免不必要的複雜性。

KISS 原則的核心思想是:相比於複雜的系統,越簡單的系統往往運行效果越好。

採用新C++標準時的注意事項

新標準引入了許多有趣的新功能。但是不要認為使用這些功能就可以讓你的代碼變得高效。實際上,許多新功能對開發通用庫更為有用,特別是與通用編程相關的功能。

不要強迫自己使用所有的新功能,在絕真正需要或者有助於提高代碼效率時使用即可。例如,這篇文章就討論了過度使用 auto 關鍵字的缺點。

需要c++零基礎視頻 開發工具 系統學習路線,私信回覆 關鍵字:“777” 獲取


分享到:


相關文章: