如果我有一堆可能是非线性但有序的值: 1,3,8,12,并且我添加了一个新的值,比如5种最好的集合类型(速度比其他任何东西都快),它可以存储在3到8之间,并给我索引,这样我就可以直接检查值后面和前面的杂念了。这是一个动画系统,我正在存储关键帧,我需要知道前面和后面的内容,这样我才能正确地插入值
目前,我使用的是一个哈希表,关键是关键帧号,它的值是我想要的位置。
因此,使用这种方法,它非常有用,在进行更改时更新关键帧,但在动画时,如果我将soem数据放在5中,则查找3和8,让我遍历整个列表来计算当前条目的索引,然后存储前一项并迭代到下一项。(更别提每次我在字典中添加东西时,它都需要按键排序才能起作用)。
只是想找些建议来解决这个相当开放的问题。
来了解一下我当前动画工具的结构:
我有一个叫做时间线的组件,这就是KeyframeProperties记录的内容。因此,在keyframe属性中,您将调用record(),它将询问它连接到的时间线是否可以记录到当前插槽中,如果可以,它将返回记录关键帧的索引,然后keyframe属性将该索引存储到它当前与动画器当前数据一起使用的字典中。当您选择播放动画时,调用timeline.play()函数,它将处理所有连接属性的迭代和调用keyframeproperty.advanceframe(int frame#)。这就是为什么我需要上一帧和下一帧,因为在不知道这一点的情况下,当frame#被传入时,就无法知道动画的下一个内插目的地应该在哪里。
示例:在4中传递,而属性中最近的两个关键帧位于3和7,动画应该将起始位置设置为第3帧数据,然后插值到第7帧0.25 (1/(7-3) = 0.25)。
发布于 2016-04-22 22:43:13
我认为.NET中没有任何集合/容器返回插入项的索引。至少订购的不能提供这种能力。
你的问题实际上比表面上看起来复杂得多。因为,据我所知,从您问题的标记中可以看出,您的解决方案使用了一个相当老的Mono实现,它的目标是.NET 3.5Profile。此外,由于团结能够用C#将您的C++代码转换为IL2CPP (取决于您所针对的平台),您甚至可能需要考虑C++编译器将如何对待您的代码,它是否会将您的代码向量化。所以,很难给你一个直截了当的答案,但我会给你一个机会.
如果您的数据集很小(我可以说少于几千项,这是一个相对的数字,取决于您的目标平台),那么您几乎可以使用您所选择的任何集合/容器,这不会产生太大的影响。如果是这样的话,那么我只需要使用LinkedList,因为它允许您在一个搜索操作中同时拥有要查找的项及其邻居(列表中的前一项和下一项)。在您的示例中,如果您对包含关键帧5的LinkedListNode有一个引用,您将能够通过使用LinkedListNode对象的前一个和下一个属性来检查上一个和下一个关键帧在哪里。只是方便..。
如果你有一个大的数据集;首先,什么对你更重要,插入速度还是检索速度?不幸的是,他们走的是相反的方式,所以你必须在那里做出选择。如果检索速度是您所喜欢的,那么忘记LinkedList类,它对遍历大量数据来说太慢了。但是,如果您喜欢插入速度,那么LinkedList也是一个很好的选择,因为它不必在每次向列表中添加值时对所有数据进行排序。您只需在您想要的位置插入一个项目,它所做的就是在这里和那里更改几个指针。问题是,您必须告诉它要将项目添加到何处。这意味着,您仍然需要执行搜索,以找到要插入项目的位置,该位置的开销将很高,但仍然不会像诉诸数万项那样糟糕。
如果您要以IL2CPP为目标,那么我将忽略所有这些,使用一个简单的数组,自己实现所有的搜索、插入、排序和数组调整操作。因为数组上的搜索操作很可能被C++编译器矢量化,这将给大型数据集带来很大的速度障碍。
发布于 2016-04-23 10:08:20
就速度而言,数组和列表或字典之间没有区别,除非您正在密集地处理大量数据和执行它们上的方法(例如,每帧100次)。所以,不要担心,只要使用任何让您更容易使用的东西,就不要做早熟优化。
https://stackoverflow.com/questions/36802935
复制相似问题