Эта терминология уходит корнями в историю OpenGL. Важно помнить, что для большинства актуальных здесь версий GL OpenGL развивался поэтапно и добавлял новые функциональные возможности к уже существующему API, а не изменял API.
Первая версия OpenGL не имела ни одного из этих типов объектов. Рисование было достигнуто с помощью нескольких вызовов glBegin / glEnd, и одной из проблем этой модели было то, что она была очень неэффективной с точки зрения затрат на вызов функции.
OpenGL 1.1 предпринял первые шаги для решения этой проблемы, представив массивы вершин. Вместо непосредственного указания данных вершин вы можете теперь получать их из массивов C / C ++ - отсюда и название. Таким образом, массив вершин - это всего лишь массив вершин и состояние GL, необходимое для их определения.
Следующая основная эволюция пришла с GL 1.5 и позволила хранить данные массива вершин в памяти графического процессора, а не в системной («клиентской») памяти. Слабым местом спецификации массива вершин GL 1.1 было то, что полный набор данных вершин должен был передаваться в GPU каждый раз, когда вы хотели его использовать; если он уже был на GPU, то такой передачи можно было бы избежать и добиться потенциального увеличения производительности.
Таким образом, был создан новый тип объекта GL, позволяющий хранить эти данные на графическом процессоре. Так же, как объект текстуры используется для хранения данных текстуры, объект буфера вершин хранит данные вершин. На самом деле это просто особый случай более общего типа объекта буфера, который может хранить неспецифические данные.
API для использования объектов буфера вершин был поддержан уже существующим API вершинных массивов, поэтому вы видите странные вещи, такие как преобразование смещений байтов в указатели в нем. Итак, теперь у нас есть API-интерфейс для массивов вершин, который просто хранит состояние, причем данные поступают из буферных объектов, а не из массивов в памяти.
Это подводит нас почти к концу нашей истории. Получившийся API был довольно многословным, когда дело дошло до определения состояния массива вершин, поэтому еще одним способом оптимизации было создание нового типа объекта, который собирал все это состояние вместе, допускал множественные изменения состояния массива вершин в одном вызове API и разрешал графические процессоры потенциально выполнять оптимизацию из-за возможности знать, какое состояние будет использоваться заранее.
Введите объект массива вершин, который собирает все это вместе.
Итак, подведем итог: массив вершин начал свою жизнь как набор состояний и данных (хранящихся в массиве) для рисования. Буфер вершин заменяет хранение массива в памяти с типом объекта GL, оставляя массив вершин просто быть состоянием. Объект массива вершин - это просто контейнерный объект для этого состояния, позволяющий изменять его проще и с меньшим количеством вызовов API.
char* buffer = socketRead();
(псевдокод). Журнал, с другой стороны, живет в течение всего жизненного цикла приложения. Таким образом, вы создаете массив где-то и начинаете читать сокет, каждый раз, когда вы получаете данные, которые записываете этот кусок в массив, давая вам аккуратный список всех полученных вами данных.