2014-10-06 86 views
0

我正在考慮一個小問題,並會欣賞人們的意見。
我正在爲一個C++粒子模擬庫製作Unity的C#插件。我想要一種方式來表示系統中的所有粒子,以便最終用戶可以輕鬆訪問數據。目前,每個粒子通過像這樣一個結構來表示..C#尋找一個靈活的數據結構

public struct Particle 
{ 
    public Vector3 Position; 
    public Color _Color; 
    public float Age; 
    public float Weight; 
    public Vector3 Velocity; 
    public int UserData 
} 

我有問題這是然而,在大多數情況下,你會不會刻意從模擬檢索所有信息的提供的結構。例如,您可能只想檢索每幀的位置和顏色信息以提高性能。在這種情況下,我的結構將有很多未初始化的字段+將佔用更多的內存比它需要(將有1000年的btw) 我不能使用類的hieratchy任何字段組合可能會在不同情況下使用。
一種方法我沒想到的是這個..

public struct Particle 
{ 
    public Dictionary<string,object> Data; 
} 

創建他們看起來是這樣的..

Particle parttest = new Particle{Data = new Dictionary<string,object>()}; 
parttest.Data.Add("Position",(object)Vector3.one); 
parttest.Data.Add("Weight",(object)1.8745f); 

,在讀取時它們轉換回相應的類。 因此,我可以擁有一個包含其中的僅包含顏色,重量和位置數據的粒子,而不包含其他任何內容。 你認爲呢?

+0

至少可以使類的類型吧。 – 2014-10-06 11:10:12

+0

使用類,子類,接口等來分割你的「結構」分成小段 – 2014-10-06 11:11:34

+1

你實際運行的內存不足,或者只是過早優化?我會說拳擊將是你的第二種方法的問題。 – juharr 2014-10-06 11:13:57

回答

1

我可以設想兩種方法:

一)你說你不能使用類「作爲字段的任意組合可以使用」。但是也許組合(而不是繼承)可以完成這項工作:一個粒子可以有一個DisplayBehavior,一個MovementBehavior等等,而這些行爲將會保存實際的屬性。這會適合你的問題嗎? b)否則,如果一個粒子的所有屬性的枚舉可能很慢(幾微秒),而檢索一個或兩個特定屬性的值必須很快,那麼正確的解決方案是擁有屬性存儲區:對於每個屬性,您都有一個結構可以保存所有粒子的值。基本上,您可以將(particle-id,property-value)信息存儲在平面數組或字典中。這是WPF使用的解決方案,例如高速緩存和精通內存。

同時你將存儲在什麼粒子結構,你可以考慮刪除此類型和只存儲顆粒標識符(可能是ParticleID枚舉使代碼更明確的)點。或者你可以保持這種類型,並添加操縱全局屬性商店的屬性。

PS:一個音符約結構:你瞭解他們是否正確?在大多數情況下,使用大型結構是一個壞主意,因爲這涉及到許多內存拷貝。唯一的情況是,當這個稅沒有支付的時候,結構可以通過它的地址訪問,例如,當你通過數組中的索引操作它時(particles [index] .Position = ...)。

+0

B聽起來不錯,謝謝!如果我正確地理解它,我認爲A有點太精細了(我會閱讀行爲)感謝PS順便說一句。我認爲在這方面我是可以的,因爲他們作爲一個照顧他們的類的一部分存儲在一個大陣列中 – 2014-10-06 15:55:43