C#正在寻找一种灵活的数据结构

本文关键字:一种 数据结构 寻找 | 更新日期: 2023-09-27 18:25:38

我正在考虑一个小问题,希望大家能发表意见
我正在为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个)我不能使用类层次结构,因为字段的任何组合都可能在不同的情况下使用
我确实想到了一种方法。。

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);

并在阅读时回到适当的课堂。所以我可以得到一个粒子,只包含颜色、重量和位置数据,而不包含其他数据。你觉得怎么样?

C#正在寻找一种灵活的数据结构

我可以设想两种方法:

a) 您说您不能使用类,"因为可以使用任何字段组合"。但也许合成(而不是继承)可以完成这项工作:粒子可以有DisplayBehavior、MovementBehavior等。这些行为将具有实际属性。这适合你的问题吗?

b) 否则,如果粒子的所有属性的枚举可能很慢(几微秒),而一个或两个特定属性的值的检索必须很快,则正确的解决方案是具有属性存储:对于每个属性,您都有一个保存所有粒子值的结构。基本上,您可以将(粒子id、属性值)信息存储在平面数组或字典中。例如,这就是WPF使用的解决方案,它具有高效缓存和内存管理能力。

同时,您将不在粒子结构中存储任何内容,以至于您可以考虑删除此类型,只存储粒子标识符(可能是ParticleID枚举,以使代码更加明确)。或者,您可以保留此类型并添加将操作全局属性存储的属性。

PS:关于结构的一个注意事项:你正确理解它们吗?在大多数情况下,使用大型结构是个坏主意,因为这涉及到许多内存副本。未缴纳此税的唯一情况是结构可以通过其地址访问,例如,当您通过数组中的索引(particles[index].Position=…)对其进行操作时。

相关文章: