Сборник вопросов для аудио- и видеоинтервью, выпуск 18. Практический опыт OpenGL |
Сборник вопросов для аудио- и видеоинтервью, выпуск 18. Практический опыт OpenGL |

Ниже приводится подборка вопросов для интервью из выпуска 18:

  • 1. Давайте поговорим о разнице между OpenGL glFlush и glFinish?
  • 2. Как добиться многопоточной синхронизации OpenGL?
  • 3. Как реализовать совместное использование ресурсов OpenGL?
  • 4. Как спроектировать кэш текстур OpenGL?

1. Давайте поговорим о разнице между OpenGL glFlush и glFinish?

Вообще говоря, мы используем OpenGL когда,Инструкции выполняются не сразу. Сначала они отправляются в буфер инструкций.,Затем он отправляется на оборудование для выполнения.。glFinish и glFlush Все они принудительно отправляют содержимое командного буфера на оборудование для выполнения.

1)glFlush:

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

2)glFinish:

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

Если звонишь glFinish,Обычно приводит к потере производительности。потому чтодляэто будет GPU и CPU Параллельность теряется. Обычно задачи, которые мы отправляем драйверу, группируются, а затем отправляются на оборудование (во время обмена буфера). Если звонишь glFinish,Просто заставьте водителя отправить команду графический процессор. Затем CPU Подождите, пока все переданные команды будут выполнены. Таким образом GPU В течение всего периода работы процессор Не помогло (по крайней мере в этой теме). И в CPU Во время работы (обычно группировки команд) графический процессор Никакой работы. Это приводит к снижению производительности.

3)glFlush и glFinish разница:

общее использование glFlush Цель состоит в том, чтобы гарантировать, что после вызова процессор Нет OpenGL Необходимо выполнить соответствующие действия, и команда будет отправлена ​​на оборудование для выполнения. вызов glFinish Цель состоит в том, чтобы к вашему возвращению работа, связанная с Нетом, осталась невыполненной.

2. Как добиться многопоточной синхронизации OpenGL?

1) Зачем OpenGL нужна синхронизация?

Обычно мы звоним OpenGL После метода он не будет эффективен сразу. B Использование потока A Текстура потока имеет вероятность возникновения исключения, поскольку A Текстура также Нетрендеринг Заканчивать。

2) решение для синхронизации glFinish

Если вы хотите убедиться, что где-то раньше OpenGL После выполнения обычно используется glFinish,Убедитесь, что он работает правильно. но glFinish Он может только гарантировать, что команды в очереди команд, соответствующей этому потоку, будут выполнены, а это значит, что вы не можете ждать другого потока в одном потоке. OpenGL После выполнения команды действуют большие ограничения.

3) Решение для синхронизации ограждения

Напомним, что мы были CPU Синхронные операции, например, мы находимся в потоке подожди, в другой теме notify, легко дождаться в одном потоке завершения заданной задачи другого потока. Для нас это тоже очень распространенная операция, но для. Графический процессор, недоступен glFinish реализовать аналогичную логику. Для OpenGL ES 3.0, мы можем использовать fence Реализация и использование становятся все более простыми, достаточно вставить fence,Потом в другомодиннить Вы можете войтиждатьэтот fence

Например, у нас есть такая логика, в GLThread 0 Рендеринг текстуры в другом потоке GLThread 1 Чтобы использовать эту текстуру, вам необходимо убедиться, что GLThread 1 При использовании этой текстуры GLThread 0 Рендеринг этой текстуры завершен. fence Наконец, мы можем GLThread 0 Вставьте fence,затем в GLThread 1 Если вы хотите использовать эту текстуру, подождите этого fence

вставлять fence код, обычно многопоточный A вставлять:

Язык кода:javascript
копировать
GLsync fenceSyncObject = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
glFlush();

После вызова этого метода он будет добавлен в текущую очередь команд в виде fence и возвращает long введите переменную для кодирования этого fence Синхронизируйте объект, чтобы другие места могли его ждать. гл Флеш Эта функция гарантирована fence Команду необходимо нажать GPU。

ждать fence код, обычно многопоточный B ждать:

Язык кода:javascript
копировать
glClientWaitSync(fence, 0, GL_TIMEOUT_IGNORED);
glDeleteSync(fence);

иметь 2 Методы можно использовать для ожидания, glWaitSync и glClientWaitSync,Разница между ними заключается glWaitSync находится в GPU начальствождать,glClientWaitSync находится в CPU В ожидании. Это преимущество не будет блокироваться CPU , повысить эффективность рендеринга.

3. Как реализовать совместное использование ресурсов OpenGL?

1) Базовое описание совместного использования ресурсов

OpenGL Контекст, связанный с «хаодининить» в рендеринге (Context), OpenGL Созданные ресурсы на самом деле представляют собой лишь контекст, видимый программисту. ID Всё, его содержимое зависит от этого контекста. Для удобства после создания контекста в определённом контексте содержимое контекста зависит от контекста. OpenGL Операции передаются в этот поток для вызова. Таким образом, простым способом 2d/3d Рендеринг — это нормально, но если он включает в себя сложные OpenGL При рендеринге этого может быть недостаточно, фактически OpenGL Рассмотрев это, Контекст может быть разделен между несколькими потоками. eglCreateContext час, Вы можете передать успешно созданный контекст, Таким образом, вы получаете общий контекст (Shared Context).

OpenGL Все команды рисования применяются к текущему Context Вверх, это Current Context это переменная одиннит приват хать (thread-local), то есть если мы рисуем нить, то для этого нить нужно сформулировать один Current Context Да, когда в задаче рисования участвует несколько нить, необходимо отвязать исходную нить и повторно привязать новую нить. Несколько нить не могут одновременно указывать один и тот же один. Context для Current Контекст, иначе это приведет к сбою.

2) Какие ресурсы может использовать OpenGL?

Ресурсы, которыми можно поделиться:

  • текстура;
  • shader;
  • программа-шейдер;
  • Объекты классов буфера, такие как VBO, EBO, RBO и т. д.

Нет Ресурсы, которыми можно поделиться:

FBO объект кадрового буфера (не является частью buffer добрый); VAO объект массива вершин (не является частью buffer добрый). Среди ресурсов, которыми нельзя делиться, FBO и VAO Это объект управления ресурсами, FBO. Отвечает за управление несколькими буферами и не занимает ресурсы VAO. Ответственный за управление VBO или EBO , сам ресурсов не отнимает.

3) Реализация общего контекста OpenGL?

Реализация iOS ShareContext:

Язык кода:javascript
копировать
- (EAGLContext *)shareContext:(nullable EAGLContext *)context {
    EAGLContext *shareContext = [[EAGLContext alloc] initWithAPI:context.API sharegroup:context.sharegroup]; 
    return shareContext;
}

Реализация Android ShareContext:

Язык кода:javascript
копировать
public EGLContext eglCreateContext(EGLDisplay display, EGLConfig config, EGLContext share_context, int[] attrib_list) {
      EGLContext result = mEgl10.eglCreateContext(display, config,
                share_context, attrib_list);
        return result;
}

4) Каковы меры предосторожности в отношении общего контекста OpenGL?

  • Каждый нит может быть привязан только одновременно (eglMakeCurrent)один Context , но может последовательно переключаться между различными Context。
  • многонитьобщий Context Нужно обратить внимание на синхронизацию, вы можете использовать fence или ВОЗ glFinish。
  • FBO и VAO имеют разные контексты и не могут использоваться совместно.

4. Как спроектировать кэш текстур OpenGL?

1) Какова цель кэша текстур OpenGL?

  • Сцена игрока: на экране отображается текстура, декодированная декодером.,В общем, декодированную текстуру можно использовать напрямую.,А вот если в декодированную текстуру добавить кэш-модуль,Кэш-модуль позволяет значительно оптимизировать частоту кадров рендеринга проигрывателя (модель 4K).
  • Сценарий транскодирования: обычно кодирование и декодирование 2 индивидуальныйдругойнить,Для декодирования требуется наличие собственного кэша текстур.,Таким образом, модуль асинхронного кодирования может получить декодированные данные текстуры как можно быстрее.

2) Как спроектировать кэш текстур OpenGL?

  • Требуется многоразовый массив текстур и установлен максимальный верхний предел.
  • Каждая текстура должна быть занята или простаивать и может быть повторно использована в режиме ожидания.
  • FBO часто меняет привязки к различным текстурам и обновляет данные содержимого для указанной текстуры.
  • После использования внешней текстуры статус текстуры устанавливается в состояние ожидания.

3) Как реализовать привязку FBO к указанной текстуре?

Пример кода выглядит следующим образом:

Язык кода:javascript
копировать
void  AttachTextureToFBO (GLuint texId) {
  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0);
  GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
  check(status);
  glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose