2016-04-22 13 views
1

もし私が多分非線形であるが順序付けされた値の束を持っていたら:1、3、8、12と私は新しいものを追加しました。 3から8の間でそれを保存し、インデックスをつかむための最良のコレクションタイプ(他の何ものでもないスピード)で、その値の前と後ろにあるものを直接チェックできます。それはアニメーションシステムです、私はキーフレームを格納しているので、私は正しく前後に何を知る必要があるので、私は正しく値を補間することができますアニメーションツールのためのデータ保存を最も効率的に/最も速く処理する方法

現在、私はハッシュテーブル(dicitonary)thatsキーを使用しています値は私が望む位置です。

この方法では、変更時にキーフレームを更新するのに非常に便利ですが、アニメーション化するときに、私が5ですすデータを配置した場合は3と8を見つけることで、リスト全体を繰り返し現在のエントリを取得し、次に、前と次の繰り返しを格納します..(私は辞書に何かを追加するたびに、これが動作するためにはキーでソートする必要があることは言うまでもありません)。

このかなりオープンな問題に取り組むためのいくつかの提案を探しています。

は、このアニメーションツールのための私の現在の構造の中にいくつかの洞察を得るために:

私はにレコードをKeyframeProperties何であるタイムラインと呼ばれるコンポーネントを、持っています。したがって、キーフレームではrecord()を呼び出すと、現在のスロットに記録できる場合は接続されているタイムラインを問い合わせ、可能であれば、キーフレームが記録されたインデックスを返し、キーフレームプロパティは、現在アニメーターの現在のデータを持つ辞書に索引を格納します。アニメーションの再生を選択すると、timeline.play()関数が呼び出され、接続されているすべてのプロパティを繰り返し処理し、keyframeproperty.advanceframe(int frame#)を呼び出します。これは、前と次のフレームが必要な理由です。フレーム#が渡されたとき、アニメーションの次の補間された送り先がどこにあるかを知る方法はありません。

例: 4でプロパティの最も近い2つのキーフレームが3と7の場合、アニメーションは開始位置を3番目のフレームデータに設定し、次に0.25で補間します(1 /(7-3)= 0.25)

+0

フレームあたり1つのエントリを持つ配列はどうでしょうか?配列インデックス==フレーム番号。配列位置は空でも、キーフレームプロパティを含んでもかまいません。 –

+0

キーフレーム内の次の最も近いフレームに注意する必要があるという問題があります。これは、次のエントリと前のエントリを見つけるために、配列のすべてをループすることを意味します。 キーフレームプロパティのフレームを前進させて、存在しないフレームを渡す場合、アニメーションのどこにあるのかを見つけるために、前後にフレームを見つける必要があることを覚えておいてください。 – Sol

+0

あなたはどのサイズですかについて話す?割り当てられた2つのスロット間の平均距離と最大距離はどれくらいですか? –

答えて

2

.NETには、挿入されたアイテムのインデックスを返すコレクション/コンテナはありません。少なくとも注文されたものはその能力を提供しません。

あなたの質問は、実際には表面上よりも複雑になります。なぜなら、あなたの質問のタグからわかるように、Unity 3.5をターゲットとするかなり古いMono実装を使用するあなたのソリューションでUnityをターゲットにしているからです。さらに、UnityにはIL2CPPを使用してC#コードをC++に変換する機能があるため(ターゲットとするプラットフォームによって異なる)、コードをベクトル化するかどうかにかかわらず、C++コンパイラがどのようにコードを処理するかについて考える必要があります。だから、あなたにまっすぐ答えを与えるのは難しいですが、私はそれにショットを与えるでしょう...

あなたのデータセットが小さい場合(私はあなたに応じて相対的な数であるターゲットプラットフォーム)、あなたはあなたが選んだほとんどのコレクション/コンテナを使用することができ、大きな違いはありません。その場合は、LinkedListと一緒に行くだけです。探しているアイテムと隣のアイテム(リスト内の前のアイテムと次のアイテム)を1回の検索操作で持つことができるからです。あなたのケースでは、キーフレーム5を含むLinkedListNodeへの参照がある場合、LinkedListNodeオブジェクトのPreviousおよびNextプロパティを使用して、前後のキーフレームの位置を確認できます。それはちょうど便利です...

大きなデータセットをお持ちの場合は、まず、あなたにとってより重要なのは、挿入速度や検索速度です。残念ながら、彼らは反対の道を行くので、そこで選択をしなければなりません。検索速度があなたが好むものであれば、LinkedListクラスを忘れてしまいます。大量のデータを繰り返し処理するには遅すぎます。ただし、挿入速度を優先すると、リストに値を追加するたびにすべてのデータをソートする必要がないため、LinkedListを使用することもできます。必要な場所にアイテムを挿入するだけで、ここでいくつかのポインタを変更するだけです。キャッチは、アイテムをどこに追加するかを教えなければならないということです。つまり、コストがかかるが、それでも数万点のアイテムを頼りにするほど悪くないアイテムを挿入したい場所を見つけるために検索を実行する必要があります。

IL2CPPをターゲットにする場合は、上記のすべてを忘れて、シンプルな配列を使用して、すべての検索、挿入、ソート、配列サイズ変更操作を自分で実装します。配列の検索操作はC++コンパイラによってベクトル化される可能性が非常に高いため、大規模なデータセットに対しては大きなスピードバンプがあります。

+0

こんにちはSerkan。私は言うかもしれませんが、あなたは単にあなたの答えを削除して、 "LinkedListを試してください"と入力するだけです。それは簡単です。 – Fattie

+1

魚を与えることとジョーを釣る方法を教えることとを対比する...後者をやりたいなら、答えの背後にある推論を説明しなければならない。 LinkedListは、あなたが完全にそれを読めば私の答えで私が提案する唯一のものではありません。 –

2

多くのデータを扱っていて、それらのメソッドを集中的に実行している場合(フレームあたり100回)は、配列とリストまたはディクショナリの違いはありません。だから、心配しないでください。あなたのために簡単になるものを使用してください。Premature Optimizationをしないでください。

関連する問題