2011-08-15 2 views
2

私は、オブジェクトを無駄に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を使うだけでいいですが、これを理解できれば、さまざまな種類の頂点を使用するプロセスが簡単になります。

答えて

1

Javaシリアライゼーションは、Javaで読み取られる特殊なフォーマットを使用しており、書かれたものと同じ構造(およびコンテンツ)のオブジェクトをリストアすることができます。特定の受信者を念頭に置いている場合、これはあなたがここで必要なものではありません。 (あなたの質問はここではっきりしていません)

"頂点バッファ"が何をすべきかは本当に分かりませんが、 "任意の頂点構造"オブジェクトをどのように保存するかについてのプロトコルを設計する必要があります。これがあるインタフェースによって与えられる場合、このインタフェースのメソッドを使用してデータを格納します。

申し訳ありませんが、これは少し曖昧ですが、あなたの質問もあいまいです。

1

シリアライズでは出力ストリームにフロートだけが置かれるわけではありません。また、デシリアライゼーションが発生したときにインスタンス化されるべきクラスをJVMが知るように、Vertexクラスについての情報も表示されます。

関連する問題