2014-10-06 87 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