glbuffersubdata со смещением в буфер, не вызывая мусора

1

G'day,

Я пытаюсь обновить часть VBO с вызовом glBufferSubData(). Когда я обновляю с начала (0) моего существующего теневого буфера, нет проблем, так как буфер начинает отсчет с 0. Следующее будет читать от 0 до y из буфера и поместить его в 0 до y в VBO:

gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, 0, y, mPositionBuffer);

Однако, если я хочу обновить часть VBO (не от 0), я столкнулся с проблемой; Следующее не работает, поскольку оно будет записывать значения с начала буфера (от 0 до y) в положение x до x + y VBO:

gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer);

Изменение позиции с использованием buffer.position(x) не имеет никакого эффекта:

gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer.position(x));

Решением является срез() буфера, который отлично работает:

mPositionBuffer.position(x);
gl.glBufferSubData(GL11.GL_ARRAY_BUFFER, x, y, mPositionBuffer.slice());

Но это вызывает мусор, поскольку новый буфер генерируется с помощью среза, хотя он использует тот же хранилище данных.

Вопрос: есть ли способ получить желаемый результат (заменить смещенную часть VBO с использованием смещения в буфер) без создания мусора? Как вы, наверное, догадались, это для игры в андроид, а сборка мусора в игре - не-нет.

Спасибо! Aert.

Теги:
opengl-es

2 ответа

1

Ну, я думаю, можно использовать статический буфер в качестве ссылки и иметь slicer для операции io. Тогда он не будет вызывать сборщик мусора, который долгое время проживает в классе.

1

похоже, что у меня та же проблема.

Единственное решение, которое мне пришло в голову, - использовать android ndk для создания альтернативной реализации glBufferSubData, которая добавляет смещение к указателю (полученному из mPositionBuffer), прежде чем передавать его в фактическую функцию opengl.

Это звучит слишком плохо, я надеюсь, что есть лучшее решение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню