2011-08-15 3 views
2

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를 사용할 수 있지만, 다른 유형의 정점을 사용하는 과정을 간소화 할 수있는 경우이를 이해할 수 있습니다.

답변

1

Java 직렬화는 Java에서 읽도록 만들어진 특수한 형식을 사용하며 작성된 것과 동일한 구조 (및 내용)의 객체를 복원 할 수 있습니다. 특정 수신기를 염두에두고 여기에 원하는 것이 아닙니다. (귀하의 질문은 여기에 분명하지 않습니다.)

"정점 버퍼"가 무엇을해야할지 모르지만 "임의의 정점 구조"개체를 저장하는 방법에 대한 프로토콜을 설계해야합니다. 일부 인터페이스에서이를 제공하는 경우이 인터페이스의 메소드를 사용하여 데이터를 저장하십시오.

죄송합니다. 다소 모호하지만 질문이 너무 모호합니다.

1

직렬화는 출력 스트림에 수레 만 넣지 않으며 직렬화가 발생할 때 어떤 클래스가 인스턴스화되어야 하는지를 JVM이 알 수 있도록 Vertex 클래스에 대한 정보도 넣습니다.

관련 문제