2

オブジェクトを ByteBuffer に入れようとしていますが、役に立ちません。

DirectX/XNA 頂点バッファーを模倣する Android 用の VertexBuffer クラスを作成しようとしています。つまり、任意のタイプの頂点構造 (特定のインターフェイスを実装する/特定のクラスを拡張する) を許可したいということです。これを行うには、そのオブジェクトを byte[] に変換する必要があります。

Serializable、ByteArrayOutputStream、および ObjectOutputStream を調べましたが、バイト数が多すぎます。元。x、y、z の 3 つの float を持つ Vertex クラスは、約 3 * 4 または 12 バイトになるはずですが、結果の配列の長さは 51 になります! 余分なバイトはシリアル化の結果であり、おそらく配列の最後のバイトを取ることができると確信していますが、それは遅く、より簡単な方法があれば、それを好むでしょう。

getClass メソッドの使用についても調査し、プリミティブ データに到達するまでフィールドを再帰的にループします。プリミティブ データを使用して、それぞれの put メソッドを使用して ByteBuffer に直接配置できます。これは (私の意見では) 最も堅牢な方法ですが、シリアル化を使用するよりも難しいようです。

編集: 頂点バッファー クラスは、頂点データをバイトとして 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 が他のパラメーターと共に Buffer を渡す必要があるためです。

頂点を元の状態に復元したくないので、バイトを作成するときにシリアル化によって大量に発生する余分なものはすべて必要ありません。

float 配列と FloatBuffer を使用するだけでうまくいきますが、これを理解できれば、さまざまな種類の頂点を使用するプロセスが簡素化されます。

4

2 に答える 2

1

シリアライゼーションは、float だけを出力ストリームに配置するだけではありません。逆シリアル化が発生したときにどのクラスをインスタンス化する必要があるかを JVM が認識できるように、Vertex クラスに関する情報も配置します。

于 2011-08-15T21:52:33.467 に答える