我正在考虑一个小问题,并会赞赏人们的意见 我正在为C ++粒子模拟库制作Unity的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 :(得分:1)
我可以设想两种方法:
a)你说你不能使用类&#34;因为可能会使用任何字段组合&#34;。但也许组合(而不是继承)可以完成这项工作:粒子可以有一个DisplayBehavior,一个MovementBehavior等等。这些行为将保留实际的属性。这适合你的问题吗?
b)否则,如果粒子的所有属性的枚举可能很慢(几微秒),而一个或两个特定属性的值的检索必须很快,那么正确的解决方案是拥有属性存储:每个属性都有一个结构,用于保存所有粒子的值。基本上,您将(particle-id,property-value)信息存储在平面数组或字典中。这是WPF使用的解决方案,例如,这是缓存效率和内存精通。
与此同时,您不会在粒子结构中存储任何内容,以至于您可以考虑删除此类型并仅存储粒子标识符(可能是ParticleID枚举以使您的代码更加明确)。或者您可以保留此类型并添加将操纵全局属性存储的属性。
PS:关于结构的一个注释:你能正确理解它们吗?在大多数情况下,使用大型结构是一个坏主意,因为这涉及许多内存副本。没有支付这种税的唯一情况是结构可以通过其地址访问,例如当你通过数组中的索引操作它时(粒子[index] .Position = ...)。