私が確信していないのは、これがどれほど効率的であるかということです。情報の各部分に配列を持たせることは、メモリ効率が悪いようです。
簡単な回答: 代わりに Structs を使用できます。単純に「すべてをまとめて格納する」ことで、追加の配列を取り除くことができます。
長い答え:
配列の表現は次のようなものです
Header:Data
。ヘッダーは 4 バイトの Int32 です。
現在、ストレージは次のようになっています。
IIII:B:B:B //Byte array (e.g. alpha level)
IIII:SS:SS:SS //Short array (e.g. num times clicked)
IIII:B:B:B //Byte array
ここで、I、B、および S は、それぞれ Int、Byte、および Short のバイトを表します。Struct を使用すると、次のようにすべてをまとめて保存できます。
IIII:BSSB:BSSB:BSSB
代わりにクラスを使用すると、クラスはデータの場所への参照として配列に格納されるため、見た目が大きく異なります。
IIII:RRRR:RRRR:RRRR
BSSB //These can be stored anywhere in memory
BSSB //These can be stored anywhere in memory
BSSB //These can be stored anywhere in memory
したがって、構造体はいくらかのメモリを節約できますが、それほど多くはありません。代わりにクラスを使用すると、実際にメモリが消費されます! ただし、使用するメモリは連続している必要はありません。これは、大量の大きなデータ グループ (合計 1 GB 以上) を格納する場合に役立ちます。32 ビット マシンでは... ただし、これについては別の機会に説明します。
もちろん、これは純粋にメモリ サイズの効率に関するものです。ワークロードがフィールドごとに計算を行う場合、個々の配列ははるかにキャッシュ フレンドリーになり、効率的になります。逆に、タイルごとに計算を行う傾向がある場合は、その逆になります。クラスは raw ストレージには非効率的ですが、コーディング パラダイムに適合する場合、開発がはるかに容易になる可能性があります。さらに、クラスは、多くのオブジェクトが同じデータへの参照を必要とする場合に適しています。重複を減らすことでメモリを節約することもできます!
基本をよく理解していると少し役立つことがわかるので、これがお役に立てば幸いです。ただし、最も重要なことは、自分の時間を大切にすることです。パフォーマンスが問題になるかどうか、いつパフォーマンスが問題になるかを自分でテストしてベンチマークすることです。
免責事項:早朝に書いたもので、間違っている/抜けがあるかもしれません.