irrlicht原始碼總結(二)

2021-08-29 02:19:25 字數 2909 閱讀 8492

好久沒寫文章了,這幾天又突發興趣來了解下原始碼。

既然irrlicht幾乎能支援跨平台和各個版本的c++(當然我的vs2017似乎不修改一些原始碼就不行了,因為原始碼好像用的還是directx9,個人覺得在如今gpu普及的時代,在怎麼也要支援到directx11才行吧。。。),好了,不說偏了。這就是為什麼irrlicht沒有使用c++標準庫里的stl的原因,而是自己實現了乙個stl,(當然還多了向量,矩陣等)。當然也就談不上廣泛利用c++11以上的特性了。

所有的檔案在資料夾core中,看過標準stl原始碼的同志會發現,這裡的stl其實還是和標準庫差了個檔次的(所以還是建議各位能用標準庫就用標準庫吧),但架構大致還是類似的。

首先必須看irrallocator.h檔案,所謂allocator其實就是個類似於記憶體管理的東西,(所以你可以通過寫不同的allocator來實現不同的記憶體分配策略),眾所周知,比如乙個class我每個物件new 100次 和 new 1次100個物件,效率是很明顯後者會提高很多的,並且前者可能記憶體不連續還會有碎片問題。而乙個大型遊戲乙個類有很多物件,所以可以在載入遊戲時就把可能要用的物件創造出來,結束時再銷毀。當然,讀者去看時就會發現這個allocator很簡單,只是把new和delete薄薄封起來而已,達不到什麼效果。有能力的人可以模仿stl自己寫allocator試試。(這個水還是挺深的,我當年也是研究了allocator很久)

irrlicht似乎沒有提供stl裡的vector,這裡的vector2d和vector3d其實是固定大小的向量,提供了向量的各種運算。矩陣是matrix4,利用template可以使用各種型別。其實就是一些簡單的數學而已,比如說,平面的元素為(t可以替代為float,int等):

vector3dnormal;//! normal vector of the plane.

t d;//! distance from origin.

也就乙個法向量和距離可以表示乙個平面咯,

那麼什麼是點呢?,看點就是這樣的,點可以用向量表示:

#define position2d vector2d(利用c++11的using也可以達到相同的目的)

還有乙個尺寸dimension(似乎該翻譯成這樣),看其元素,就兩個

//! width of the dimension.

t width;

//! height of the dimension.

t height

這不就是高寬麼?,其實也可以用二維陣列vector2d表示咯,殊途同歸。再看三角形的定義:

//! the three points of the ********

vector3dpointa;

vector3dpointb;

vector3dpointc;

用的三個點而已,再看矩形

//! upper left corner

position2dupperleftcorner;

//! lower right corner

position2dlowerrightcorner;

這當然是乙個2d矩形咯

所謂quaternion四元數,應該很常見咯,這裡只有浮點數:

f32 x; // vectorial (imaginary) part

f32 y;

f32 z;

f32 w; // real part

f32不用想,肯定就是float

(你去搜肯定能找到typedef float f32;)

直線line我就不列出了,肯定是兩個點表示的咯

當然有乙個irrstring(這個我不如char或wchar_t吧。。。)

irrmath裡提供了一部分數學函式,(我還是用cmath吧。。)

還有一顆rbtree,紅黑樹,也有相應的迭代器,但irr沒有type traits型別萃取就少了點味道啊,c++標準庫里的set和map肯定是紅黑樹實現的,我相信讀者運用c++和標準庫,也可以寫出更優雅的紅黑樹。(或者把map裡的紅黑樹,我的vs裡是xtree)

裡面有乙個heapsort堆排序,敘述這些的書都很多啦,至於coreutil,這個很簡單,**也很少,似乎是用來查詢檔案名字的(比如乙個檔案是否在資料夾中),各位用fstream和string也能很輕鬆達到相同的目的。

還有list忘了,裡面的定義是

struct sklistnode

sklistnode* next;

sklistnode* prev;

t element;

};很明顯是個雙向鍊錶咯,因為構造的時候0個元素,那可能就不是環狀了(這個隨意了),這個list當然不及stl list了;

再看array,我似乎猜到這個array應該就如同vector了吧,裡面似有個新概念alloc strategy,難道是記憶體分配策略?噢,讀了一些**發現它其實就是在模擬c++11的move功能,當然不如vector有那麼優秀的效率咯。

還有個叫aabbox3d,是由兩個點定義的

//! the near edge

vector3dminedge;

//! the far edge

vector3dmaxedge;

這個是用於碰撞檢測的,實際遊戲中的物體不可能做那麼多碰撞檢測,就會轉化為一些簡單的幾何體當它的碰撞體積,當然,對於精度高的,可以用著名的bsp演算法來實現。

因為我只是幫各位梳理下思路,我跳過了其它很多細節,以上若有沒有聽過的概念(其實敘述那些的書很多了),還請各位自行查詢資料學習;若有我不當之處,嘿嘿,還請批評指正,謝謝。

最後想談談未來的遊戲架構,遊戲引擎中各種功能可用軟體模擬,也可用硬體實現,大家看到的**其實都是基於軟體模擬,毫無疑問,如果硬體直接支援能獲得數千倍不止的提公升。

想當年為解決cpu浮點運算,推出了fcpu,為解決3d遊戲的渲染問題,推出了gpu。那麼以後會不會為ai的神經元計算而普及ai cpu,會不會為真實的碰撞模擬推出collision cpu?我相信是可能的,因為我準備讀完研究生就去研究這些晶元,嘿嘿。

Irrlicht引擎原始碼剖析 第二天

我們來看看irrlicht.h檔案中宣告的建立引擎裝置物件的函式的形參 irrlicht api irrlichtdevice createdevice video edrivertypedevicetype,const core dimension2d windowsize,u32 bits,bo...

irrlicht引擎原始碼剖析 引用計數

在研究irrlicht的video driver和scene graph之前,必須先了解在irrlicht中廣泛應用的引用計數機制。irrlicht的介面ireferencecounted實現了引用計數的機制。需要採用引用計數管理的類都會繼承這個介面。irr的引用計數最重要的兩個介面就是grab 和...

irrlicht引擎原始碼剖析 引用計數

在研究irrlicht的video driver和scene graph之前,必須先了解在irrlicht中廣泛應用的引用計數機制。irrlicht的介面ireferencecounted實現了引用計數的機制。需要採用引用計數管理的類都會繼承這個介面。irr的引用計數最重要的兩個介面就是grab 和...