Создание асинхронной загрузки текстур GL и выяснение того, когда загрузка будет завершена - PullRequest
1 голос
/ 14 октября 2019

Я столкнулся с проблемой, когда моему приложению требуется динамическая загрузка изображений во время выполнения. Это становится проблемой, потому что невозможно загрузить их все сразу, так как я не могу знать, какие из них будут использованы ... в противном случае я должен загрузить все. Проблема в том, что некоторые люди не имеют хороших ПК и жалуются, что загрузка всех изображений в графический процессор занимает у них много времени из-за плохого оборудования.

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

Я исследовал, как обойти это, и у меня есть идея: пользователи хотят гладкого опыта и все в порядке, если текстуры загружаются не сразу, а вместо этого. Это облегчает задачу, так как я могу загрузить в фоновом режиме, а затем просто ничего не рисовать для того, где должен быть объект, и затем привести его в действие после того, как это будет сделано. Это приемлемо, потому что загрузка в любом случае обычно довольно быстрая, но она достаточно медленная, поэтому у некоторых людей она падает ниже 60 кадров в секунду, что вызывает некоторое заикание. В среднем это вызывает примерно 1-3 кадра заикания, поэтому загрузка разрешается быстро и в среднем менее 50 мс.

Мое решение состояло в том, чтобы попытаться что-то с помощью PBO получить некоторую асинхронную загрузку. Проблема в том, что я не могу найти в Интернете, как я могу узнать, когда загрузка будет завершена. Есть ли способ сделать это?

Я полагаю, есть четыре варианта:

  1. Есть способ сделать то, что я хочу с OpenGL 3.1 и далее, и это будет
  2. Невозможно сделать (1), но я мог бы поставить забор, а затем проверить, выполнен ли забор, однако мне никогда не приходилось делать это раньше, поэтому я не уверен, сработает ли он вэтот случай
  3. Это невозможно, но я могу предположить, что все будет загружено через <50 мс, и использовать некоторую временную метку, чтобы определить, можно ли это сделать, или нет, и просто надеяться, что это так (и есливремя <50 мс с момента отправки загрузки, затем ничего не рисовать) </li>
  4. Это невозможно сделать для загрузки текстуры, и я застрял

Это приводит меня кмой вопрос: Могу ли я узнать, когда будет выполнена асинхронная загрузка пикселей в текстуру?

1 Ответ

2 голосов
/ 14 октября 2019

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

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

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