glDrawArrays: когда это закончилось? - PullRequest
3 голосов
/ 01 мая 2011

псевдокод:

void draw()
{
    Vertex* vertices = scene.GetVertexArray();
    glEnableClientState(...);
    glVertexPointer(..., vertices);
    glDrawArrays(...);
    glDisableClientState(...);
    delete vertices;
}

Я не использую VBO, поскольку хочу поддерживать более старые реализации OpenGL.

После вызова glDrawArrays я хочу:

  • освободить мой массив вершин ("delete vertices;")
  • возможно изменить некоторые вершины

Однако GL может свободно выполнять glDrawArrays асинхронно, и небезопасно освобождать или модифицировать мой массив до его завершения.

Я мог бы сделать glFinish для этого, но это замедлило бы приложение.

Так в какой момент я могу освободить / изменить мой массив вершин?

1 Ответ

6 голосов
/ 01 мая 2011

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

  • glDrawArrays (после его возврата указатель памяти gl {Normal, Color, TexCoord, Attrib, Vertex} может быть настроен на удаление)
  • glDrawElements (послевозвращается, указатель памяти gl {Normal, Color, TexCoord, Attrib, Vertex} был установлен на и массив элементов может быть расположен)
  • glTexImage (данные памяти указывают на)
  • glTexSubImage (данные памяти указывают на)
  • glBufferData (данные памяти указывают на)
  • glBufferSubData (данные памяти указывают на)

Важно знать, что gl {Normal,Color, TexCoord, Attrib, Vertex} Pointer просто установите указатель и не создавайте копию.Однако копия данных сортировки создается с помощью вызовов glDrawElements и glDrawArrays (в зависимости от драйвера физическое копирование выполняется не сразу, а управление памятью настраивается для схемы копирования при записи - на случай, если буфер не изменяетсяили освобождается пользовательской программой, это экономит критически важную пропускную способность и циклы ЦП).

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