私は、オブジェクトを無駄にByteBufferに入れようとしています。ByteBufferに直列化せずにオブジェクトを置く
私は、DirectX/XNA頂点バッファを模倣するAndroid向けのVertexBufferクラスを作成しようとしています。私は、ある種の頂点構造(特定のインタフェースを実装する/特定のクラスを拡張する)を許可したいということです。これを行うためには、そのオブジェクトをbyte []に変換する必要があります。
私はSerializable、ByteArrayOutputStream、およびObjectOutputStreamを見てきました。 Ex。 x、y、zの3つの浮動小数点数を持つVertexクラスは約3 * 4または12バイトでなければなりませんが、結果の配列の長さは51です!余分なバイトはシリアライズの結果であり、おそらく配列の終わりのバイトを取ることができると確信していますが、それは遅いですし、簡単な方法があればそれを好むでしょう。
私はgetClassメソッドを使用して、プリミティブデータに到達するまでフィールドを再帰的にループしました。プリミティブデータでは、それぞれのputメソッドを使用してByteBufferに直接入れることができます。これははるかに頑丈な方法です(私の意見では)、それは単にシリアライズを使用するより難しいようです。
EDIT:頂点バッファクラスは、ByteBuffer(またはその他の拡張子)にバイトとして頂点データを格納することになっています。頂点データクラスは、頂点バッファにバイトの使用方法を伝える「getVertexDeclaration」メソッドを継承する必要があります。たとえば、次の頂点バッファに渡されたとき
public class ColoredTexturedVertex implements Vertex
{
public Vector3 Position;
public Vector2 TexCoord;
public int Color;
public VertexDeclaration getVertexDeclaration()
{
return VertexDeclaration.createFromArray(new VertexElement[] {
new VertexElement(0, 4 * 3, Usage.Position),
new VertexElement(12, 4 * 2, Usage.TexCoord),
new VertexElement(20, 4 * 1, Usage.Color)
});
}
}
は、このクラスは、テクスチャ座標、色データ、それは位置に頂点であることがバッファを教えてくれます。 VertexDeclarationには、クラスのフィールドが反映されます。最初の12バイト(Vector3)は位置データとして使用されます。次の8バイト(Vector2)はテクスチャ座標として使用されます。最後の4バイトがカラーデータとして使用されます。
私の質問に戻って、私は単に頂点バッファ内のストレージのためにこれらのバイトを分離したいと考えています。私がByteBufferでそれらを必要とする理由は、glDrawElementsが他のパラメータでバッファを渡す必要があるためです。
頂点を元の状態に戻したくないので、バイトを作成するときに直列化が外に出るようなものは一切必要ありません。
私はフロート配列とFloatBufferを使うだけでいいですが、これを理解できれば、さまざまな種類の頂点を使用するプロセスが簡単になります。