ストライドパターンでアクセスする多くのクラスインスタンスの代わりに、[]
をオーバーロードしてシングルトンの内部配列にアクセスできます。したがってpixels[n].X
は、 "pixels"オブジェクトの内部配列または構造体の配列にアクセスし、その中からXを速く取得します。
構造体のすべてのピクセル属性を持ちます。その構造体にアクセスするには、ピクセルクラスからのインデックスを使用します。その構造体を構造体配列に配置します。
structLayoutAttributeを使用すると、構造体を適切なサイズ(および配置)でパックして、アクセスパフォーマンスを向上させることができます。
構造体のフィールドを並べ替えると、すべてのデータを(おそらく)少ないメモリ操作で読み込むことができます。
関数内のすべての属性を使用すると便利です。
代わりの構造体の配列は、すべての画素について(あなたのゲームエンジンのアロケータによって与えられる)アンマネージメモリ領域を使用し、移行のオーバーヘッドをelliminateする大きな塊で読むことができます。(ちょうど1で全体の構造体を読み取ることができますまたは2つの固有のロード命令)。ポインタと安全でないコンテキストを使用して、より大きなチャンクで更新する(または一時的な結果を蓄積する)
int X
int Y
int brightness
byte red
byte green
byte blue
byte alpha
は、16バイトの構造体境界に収まる必要があります。
あなたが使用しようとしている場合は、色とは別に座標、またはいくつかの属性は、常に使用されません、それは次の画素のために反復する一つ少なくストライド要素になりますので、あなたはそれを切り離し、プリミティブの配列として使用する必要があります。 XとYを色ではなくいくつかの空間検索アルゴリズムで使うつもりならば、XとYを持つ構造体の別の配列(クラスではない)にXとYを再グループ化して、色属性が得られないようにすることができますパフォーマンスの面であなたの方法で
あなたがXにアクセスする、あなたの代わりにpixels.X[i]
を試してみて、(配列またはアンマネージメモリで)最高速度を有することができるので、セッターゲッターが50%の性能をコストとしても
public class MyPixel{
public float X{
get{ /* access an array or
array of structs or
unmanaged memory */}
set{ /* same */}
}
// for unrolled loops
public static void BatchUpdateXY(float[] source,int pixelStart,int pixelEnd)
{ /* copy from source */}
}
。
純粋なC++配列を上位ソリューションに追加すると、新しいピクセルを追加するのが難しくなります。そのため、C++側でベクターなどのコンテナが必要な場合があります。