2017-04-01 124 views
2

我正在構建一個體素引擎,所以我擔心內存使用情況,使用12位而不是16位塊ID可以節省大量內存。我有一個3D數組塊ID,每個ID都有一個靜態配置。C++ 12bit變量,我該怎麼做?

我不確定實現這個目標的好方法是什麼。有沒有辦法只是獲得一塊原始記憶並自己管理它,這是一個好主意;我可能遇到任何問題嗎?有一個更好的方法嗎?

我有一些C++的經驗,但我的大部分時間都花在Java和c#上。

感謝您的閱讀!

+0

使用自然數據類型時,您不必打包或解包值可能會更快,以至於您可能需要犧牲相當大的內存塊。在嘗試解決這個問題之前,確保這是一個真正的*問題*。 – paxdiablo

+0

[如何在C中定義24位數據類型?]可能的重複(http://stackoverflow.com/questions/7416699/how-to-define-24bit-data-type-in​​-c) –

+0

[ bit整數溢出,我們可以使用一個40位結構而不是一個64位長的?](http://stackoverflow.com/q/27705409/995714),[哪個C數據類型可以表示一個40位二進制數?](http://stackoverflow.com/q/9595225/995714),[10或12位字段數據類型](http://stackoverflow.com/q/29529979/995714),[如何創建3位變量作爲數據類型](http://stackoverflow.com/q/31339473/995714) –

回答

5

例如, : -

  • 儲備一個8字節變量(存儲5個變量,每個12個比特),或使用該char[k]kceiling{(12*n)/8.0f},然後使用union
  • 儲備等....

這裏是一個鏈接(我是誰問),我知道分配內存塊。
How to use void* as a single variable holder? (Ex. void* raw=SomeClass())

但是,我對你正在嘗試做的事情表示不同意。

據我所知,你的方法的缺點是: -

傳統推薦:(提前)優化之前簡介它。

0

這裏有一些其他的想法:

  • 有一個8位的塊標識,但有一個扇區的每個部分,每個部分使用它自己的塊標識的「調色板」。基本上你可以在任何地方找到128個「常用」瓷磚,以及128個特定區域的瓷磚。根據該級別資產的「調色板」,這種解決方案可以用於許多遊戲,尤其是移動平臺,因爲您可以指定一整套資產並僅加載每個特定級別中引用的資產。

和/或甚至更好的主意比上摳塊類型:

  • 使用辛樹塊。一個沒有區分的區域將只有一個BlockID用於整個節點。已經挖出的空白空間不需要有多個節點(每當一​​個塊被改變時,你就可以檢查它是否可以被合併),這將彌補在打開區域時創建的額外節點。

八叉樹的理論最大存儲量比塊ID的實體塊多一點,但實際使用量會有很大的面積,實際上是實體塊類型(例如空氣)。渲染一個八叉樹的速度會更快,因爲你可以跳過任何節點的空白,比遍歷所有拼貼來檢查它們是否爲空。

您可以製作一個包裝,以便八叉樹與您完全定義的三維blockIDs數組可以互換,例如,你可以通過函數調用爲任何節點提取一個blockID。然後添加函數來設置blockID,根據需要進行節點的拆分和合並。

+0

ID的數組不會直接用於渲染,當對塊進行更改時,網格和紋理將被烘焙。 – user5389242