1

ゲーム用のエンティティ システムを構築していますが、基本的に、単純なオブジェクト (辞書) と配列のどちらを使用してエンティティ/コンポーネントを ID で格納する必要があるかわかりません。

私の最大の問題は、動的なエンティティ ID が必要なかったことです。id が単なる文字列 (辞書を使用してエンティティを格納する) である場合、それは常に有効であり、storage[id] を使用してそのエンティティにアクセスできます。

配列を使用すると、ストレージ配列のインデックスを表すエンティティの ID が変更されると思いました。次のエンティティの配列を検討してください。

[
    Entity,
    Entity, //This one is being removed.
    Entity
];

その配列の 2 番目のエンティティを削除する場合、3 番目の配列にアクセスするために必要な ID は、(削除された) 2 番目のエンティティの ID (インデックス) に変更する必要があると考えました。splice()それはingの観点から削除を考えたからです。

しかし、delete式を使用して要素 (エンティティ) をundefined! そして、Javascript の配列が実際には単なるオブジェクトであり、オブジェクトが論理的に無限に多くの未定義の値を持っていることが本当なら、それは配列内の未定義の値がメモリを使い果たしていないことを意味しますか?

最初は、配列はメモリ内で整列されるように実装されており、インデックスは最初の要素からの単なるオフセットであると考えていました。このロジックにより、未定義の値は少なくともポインタのメモリを使用すると考えました (私は、実際には、要素自体ではなく、要素へのポインターが整列していると考えていたからです)。

したがって、この配列に 10,000 個以上のエンティティを保存deleteし、その半分を編集した場合、 5k はundefinedメモリをまったく使用しませんか?

また、for entity in arrayループを実行すると、これらの未定義の要素が渡されますか?

また、配列が実際に Javascript でどのように実装されることになっているのかを確認するためのリソースはどこにありますか? 私が見つけることができるのは、配列の一般的な説明とそれらの使用方法に関するチュートリアルだけですが、特定の状況で重要であることが証明されるこれらの小さな癖についてすべて知りたいと思っています. 「Javascript quirks」サイトのようなものは素晴らしいでしょう。

4

1 に答える 1

2

配列は単なるオブジェクトではありません。特にlengthプロパティは非常に魔法です。

もちろん、外部 API が同じままである限り、JavaScript エンジンは任意の方法で配列を内部的に表すことができます。たとえば、ランダムに区切られた値を設定するとハッシュとして格納される場合がありますが、連続した値を設定すると配列に最適化される場合があります。

for ... in設定されていないプロパティを列挙しません。[true, , false]これには、インデックス 0 と 2 のみを列挙する などの値をスキップする配列リテラルが含まれます。

于 2012-07-21T22:04:10.060 に答える