Почему некоторые вызовы gl принимают массивы, а другие принимают только буферы на Android - PullRequest
2 голосов
/ 02 января 2011

Я только начинаю изучать OpenGL на Android и только что заметил, что некоторые вызовы gl, такие как glTexCoordPointer (...) или glVertexPointer (...), принимают данные только в объектах Buffer, другие, такие как glDrawTexvOES (), glTexParameteriv (), также принимают float [].

Мне любопытно, почему это так? :)

1 Ответ

2 голосов
/ 02 января 2011

Основное отличие состоит в том, что входные данные для функций glTexCoordPointer и glVertexPointer используются не сразу, а только после вызова метода glDraw, например, glDrawArrays, glDrawElements.

Поскольку массивы используются не сразу, вам нужно хранить указатель на массив, отправляемый этим функциям, достаточно долго, чтобы процедуры рисования могли получить к нему доступ. Данные должны находиться в собственной куче, в противном случае сборщик мусора может переместить базовый основной указатель, даже если данные не удалены. Чтобы получить указатель на собственную кучу, вам нужно обернуть данные внутри объектов Buffer.

В функциях, похожих на glTexParameteriv, используются значения в массиве, который вы передаете сразу, поэтому не нужно беспокоиться о выходе указателей из-под вызванной функции, и нет необходимости иметь их в собственной куче.

Если вы используете glTexCoordPointer и друзей из нативного кода, вы должны сохранять указатель, по которому отправляете его, до тех пор, пока не вызовете функцию glDraw. Из нативного кода у вас есть преимущество в том, что указатель не нужно заключать в объект, но у вас есть недостаток, заключающийся в том, что вам приходится управлять любым выделением кучи вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...