ByteBuffer에 객체를 넣으려고하지 않습니다.ByteBuffer에 직렬화하지 않고 객체 넣기
DirectX/XNA 정점 버퍼를 모방 한 Android 용 VertexBuffer 클래스를 만들려고합니다. 나가 말하고 싶은 것은 모든 타입의 버텍스 구조 (특정 인터페이스를 구현/특정 클래스를 확장)를 허용하고 싶다는 것이다. 이것을하기 위해서, 나는 그 객체를 byte []로 변환해야 할 것이다.
나는 Serializable, ByteArrayOutputStream 및 ObjectOutputStream을 살펴 봤는데, 너무 많은 바이트를주고있다. 전의. 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 바이트가 색상 데이터로 사용됩니다.
제 질문으로 돌아가서 간단히 정점 버퍼 내에 이러한 바이트를 저장하려고합니다. glDrawElements는 Buffer가 다른 매개 변수와 함께 전달되어야하기 때문에 ByteBuffer에서 필요로하는 이유가 있습니다.
정점을 원래 상태로 복원하고 싶지 않으므로 바이트를 만들 때 직렬화가 밖으로 나가는 모든 추가 물건이 필요하지 않습니다.
플로트 배열과 FloatBuffer를 사용할 수 있지만, 다른 유형의 정점을 사용하는 과정을 간소화 할 수있는 경우이를 이해할 수 있습니다.