我想把一個對象放到ByteBuffer中無濟於事。把一個對象放入一個ByteBuffer而沒有序列化它
我想爲Android創建一個模仿DirectX/XNA頂點緩衝區的VertexBuffer類。我的意思是我想要允許任何類型的頂點結構(實現某個接口/擴展某個類)。爲了做到這一點,我需要將該對象轉換爲byte []。
我看了一下Serializable,ByteArrayOutputStream和ObjectOutputStream,它給了我太多的字節。防爆。對於x,y和z具有3個浮點數的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)
});
}
}
當傳遞到頂點緩衝器,這個類會告訴緩衝器,它是與位置爲頂點,紋理座標,和色彩數據。頂點聲明反映了該類的字段。前12個字節(Vector3)將用作位置數據。接下來的8個字節(Vector2)將被用作紋理座標。最後4個字節將用作顏色數據。
回到我的問題,我只是想隔離這些字節存儲在頂點緩衝區內。我在ByteBuffer中需要它們的原因是因爲glDrawElements需要使用其他參數傳入緩衝區。
我不想將頂點恢復到原始狀態,所以當創建字節時,我不需要額外的序列化輸出。
我可以只使用浮點數組和FloatBuffer,但如果我可以想出這將簡化使用不同類型的頂點的過程。