Помещение объекта в ByteBuffer без его сериализации - PullRequest
2 голосов
/ 16 августа 2011

Я пытаюсь поместить объект в ByteBuffer безрезультатно.

Я пытаюсь создать класс VertexBuffer для Android, который имитирует буфер вершин DirectX / XNA. Я имею в виду, что я хочу разрешить структуру вершин любого типа (которая реализует определенный интерфейс / расширяет определенный класс). Для этого мне нужно преобразовать этот объект в byte [].

Я изучил Serializable, ByteArrayOutputStream и ObjectOutputStream, байт дает мне слишком много байтов. Ex. класс Vertex, имеющий 3 числа с плавающей запятой для x, y и z, должен иметь размер около 3 * 4 или 12 байт, но полученный массив имеет длину 51! Я почти уверен, что дополнительные байты являются результатом сериализации, и что я, вероятно, мог бы просто взять байты конца массива, но это медленнее, и если есть более простой способ, я бы предпочел это.

Я также изучил использование метода getClass и рекурсивно перебираю поля, пока не доберусь до примитивных данных. С примитивными данными я могу поместить их непосредственно в ByteBuffer, используя соответствующий метод put. На мой взгляд, это самый надежный метод, но он кажется более сложным, чем просто использование сериализации.

РЕДАКТИРОВАТЬ: Предполагается, что класс буфера вершин хранит данные вершин в виде байтов в 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, но если я смогу это выяснить, это упростит процесс использования различных типов вершин.

Ответы [ 2 ]

1 голос
/ 16 августа 2011

Сериализация не помещает в выходной поток только плавающие числа: она также помещает некоторую информацию о классе Vertex, чтобы JVM знала, какой класс должен быть создан при выполнении десериализации.

1 голос
/ 16 августа 2011

Java Сериализация использует специальный формат, который предназначен для чтения Java, и который позволяет восстанавливать объекты той же структуры (и содержимого), что и написанные.Это не то, что вы хотите здесь, если вы имеете в виду какой-то конкретный приемник.(Ваш вопрос здесь не совсем понятен.)

Я действительно не знаю, что должен делать ваш "буфер вершин", но вы должны разработать протокол о том, как вы хотите хранить "произвольную структуру вершин".объект.Если это задано некоторым интерфейсом, используйте методы этого интерфейса для хранения данных.

Извините, это немного расплывчато, но ваш вопрос тоже расплывчат.

...