為什麼CryEngine、Unreal這些行業頂級引擎,代碼寫得這麼亂?


說實話現在開源的UE和CE質量都不差。不像以前都是只給自家人看,寫的亂一點也行。你看lumberyard和CryEngine V的源碼,完全就是兩個級別。

不知道問題的題目(為什麼CryEngine、Unreal這些行業頂級引擎,代碼寫得這麼亂?)有何根據,是以什麼標準來說他們不好。在他們開源之前業界比較認同的好代碼是Quake,你先以自己的標準給它打個分,如果覺得不符合你的標準,那就是標準的問題。

我說說為什麼遊戲引擎的代碼為什麼會寫的亂。主要是兩個原因。

1.需求變更。相比傳統行業軟體(ERP,CMS)之類一步一步做過來的軟體,引擎的更新迭代非常快。為了緊追新技術,不得不做出大規模重構才能保證代碼規範。比如CE的代碼,基本框架其實做了十來年也沒大變化(內存管理,IO之類),而渲染部分支離破碎,基本上每換一代技術就加一套模塊。你看每個模塊都很漂亮,但整個項目結構很亂也是這個原因。而UE則直接丟掉前一代重新開發了新版本。PS:CE5把以前的代碼全部重構了一遍,現在一點不亂。

2.優化。最開始看這些代碼的時候覺得挺怪,函數的聲明都老老實實的寫在各自的頭文件里,定義往往都擠在一個cpp裡面,在別的語言(JAVA之類)是根本無法想像的。目的是為了讓CPU能更快的cache指令。其實程序員一開始絕對不會寫成這樣的。

題主說他們不符合軟體設計原則也請舉出具體例子。我雖然說由於這兩個原因會破壞軟體設計原則,但我不承認這些引擎就都被破壞了,我看到的UE4處處體現了設計原則,大量的設計模式應用,六大原則一點不缺。上百個模塊清晰可見,模塊內部職責明確。另外遊戲引擎本身就要處理複雜的數據流,沒有強健的架構模式也不可能支撐運行的。


在這個體量下,這麼多功能的穩定實現。請給一個更好的範本吧。


軟體的設計,永遠是功能優先,而不是好看優先

曾經,我主導的兩三個項目,有一些關鍵的功能,就是因為會影響整體結構的設計而被我砍掉了

所以項目失敗,雖然可能不是主要的原因

UE4已經做得非常好了,我不覺得它亂,可能是你看不懂所以覺得亂,一些不得已的Hack,我不認為你能找到更合理的寫法,那些你覺得優雅的代碼,你確定它除了優雅還有其他價值?

一些書里沒有的最新的設計模式非常棒,我不認為這個行業最頂尖的人有時間把那些模式整理出來耐心的教人看懂,他們真的有太多更有意義的事情要做


UE 代碼還算比較乾淨的。

CE V 之前的代碼基本一泡烏,有許多部分都屬於沒寫完還處於試驗階段程序員就離職了的那種。CE V後用代碼美化器把代碼整理過了,但是物理部分的代碼還是一泡烏。


操作系統代碼也是goto到處飛。。。底層的東西看中的更多的應該是性能吧,所以可讀性不是很重要了,畢竟一個功能要優化到可怕的地步。


先問是不是,再說為什麼系列?

Unreal4代碼是自成一派風好伐?無數團隊效仿的對象好伐?


是類似這樣的代碼么?寫的亂糟糟的,居然還有magic number

float Q_rsqrt( float number )
{
long i;
float x2, y;
const float threehalfs = 1.5F;

x2 = number * 0.5F;
y = number;
i = * ( long * ) y;
i = 0x5f3759df - ( i &>&> 1 ); // what the fuck?
y = * ( float * ) i;
y = y * ( threehalfs - ( x2 * y * y ) );
y = y * ( threehalfs - ( x2 * y * y ) );

return y;
}


推薦閱讀:

大型3D遊戲是如何將地圖做得很大卻避免讀條的?
在Unity 舉行的VISION SUMMIT 2016大會上主要宣布哪些新技術呢?
未來的手遊行業使用虛幻四引擎會更加有利嗎?
Unity3D剛體受力情況如何取得?
如何用unity做出磁體相互吸引和排斥的效果?

TAG:網路遊戲 | 軟體設計 | Unity遊戲引擎 | 虛幻引擎 | CryEngine引擎 |