byte
s の代わりに x、y、幅、高さのフィールドに sを持つ Rectangle 構造体を作成したいと考えていますint
。通常と互換性があるはずですMicrosoft.Xna.Framework.Rectangle
(キャスティングは(bytesRectangle)
問題ないはずです)。それ、どうやったら出来るの?
Upd:この構造体を使用すると、タイルごとに 12 バイトを節約できました。
byte
s の代わりに x、y、幅、高さのフィールドに sを持つ Rectangle 構造体を作成したいと考えていますint
。通常と互換性があるはずですMicrosoft.Xna.Framework.Rectangle
(キャスティングは(bytesRectangle)
問題ないはずです)。それ、どうやったら出来るの?
Upd:この構造体を使用すると、タイルごとに 12 バイトを節約できました。
型を XNA フレームワークが期待する型に変換するには、変換を定義する必要があります。
ここを参照してください: http://msdn.microsoft.com/en-us/library/09479473.aspx
この構造体を実装するための設計上の選択を知りたいです。Microsoft.Xna.Framework.Rectangle を見ると、30 を超えるプロパティとメンバーがあることがわかります。これは、数バイトを節約するために再現することがたくさんあります。あなたの唯一の目標がいくつかのバイトを節約することである場合、より良い方法があるかもしれません. たとえば、データを小さなスペースに保存したい場合は、オブジェクトとキャストを定義してそれを保存できます。このようなもの:
class SmallRectangle
{
public byte x { get; set; }
public byte y { get; set; }
public SmallRectangle(byte inx, byte iny)
{
x = inx;
y = iny;
}
public static explicit operator SmallRectangle(Microsoft.Xna.Framework.Rectangle big)
{
SmallRectangle small = new SmallRectangle((byte)big.x, (byte)big.y);
return small;
}
public WriteToFile(FileStream out)
{
//....
}
}
もちろん、完全な実装には、キャストなどでデータが失われないことを確認するためのテストが含まれます。
以下のコメントに基づいて:これは進むべき方向ではありません。XNA を使用しているときに XNA でメモリを節約する必要がある場合は、同じ属性で同じ方法でメモリを保存しない Small Rectangle マネージャー クラスを作成する必要があります。しかし、このクラスは、必要なときに XNA のものを作成するのに適しています。小さな四角形のクラス (またはマネージャー) を「互換」にしないでください。
必要なデータをメモリに保存する最良の方法は、オーバーヘッドなしで 4 バイトを保存することです。オーバーヘッドなしで 2 バイトを格納する最良の方法は、Tuple クラスを使用することです。
したがって、長方形をタプルとして内部的に格納し、必要に応じて Xna オブジェクトに "ボックス化" および "ボックス化解除" する長方形マネージャー クラスを作成することをお勧めします。