2016-10-09 8 views
0

性能上の理由から、私は10,000個のタイルで分割されたゲームマップを持っています。各タイルにはエンティティの配列があります。このようにして、タイルに出入りするエンティティは、対応するアレイ内に/から除去される。一方ループ:10,000個の配列(時間を無駄にする)と1つのグローバル配列(メモリを無駄にする)

、すべてエンティティごとのxミリ秒更新に万のアレイ上のループを回避するために、配列を処理するための最も効率的な方法は何ですか?

タイル配列以外に、すべてのタイルのすべてのエンティティを含むグローバル配列を1つ作成する必要がありますか?メモリを浪費していませんか?

+0

あなたのモデルをうまく取得できませんでした。オブザーバーパターンを設定して、エンティティごとに状態の変更を公開したり、タイルをサブスクライブしたりすることはできません。 [Observer and PubSub pattern](https://addyosmani.com/resources/essentialjsdesignpatterns/book/#observerpatternjavascript)はあなたが探しているものです。 xミリ秒ごとにすべての10Kタイルをチェックするのはひどい考えです。 – Redu

+0

私はあなたが行列ゾーニングpaternを使うべきだと思います。例えば、ゾーニングに合流する500タイルのブロック。したがって、500タイルの配列要素が200個あります。そうすることで、ゾーン参照が渡され、サブ配列をループします。 – cpugourou

+1

はい、エンティティのないタイルがたくさんある場合は、ループするすべてのエンティティを含むグローバル配列がすべてのタイルをループするより効率的です。 – Bergi

答えて

2

これは、パフォーマンスチューニングでの処理とメモリの共通の二分法です。 いつものように私の答えは(特にパフォーマンスに関して)「それは依存している」です。実際に知る唯一の方法は、両方を測定し、速度/メモリの使用が許容範囲内に収まるかどうかを確認することです。例えば。 60fpsが必要な場合は、1フレームにつき、< 16msでなければなりません。質問はありません。

私の提案は、読者(つまりあなた/あなたのチーム)にとって最も論理的な方法で実装することです。コードを実行してパフォーマンスを向上させてから)。これにより、コードを "最適化"することができなくなり、必要な証拠を持たずにコードを読むことができない/維持できなくなる(または少なくとも少なくなる)ことが防止され、実際の改善となります。

関連する問題