Процесс ТРИ. Текстура у веб-работников - PullRequest
0 голосов
/ 29 июня 2018

Я бы хотел обработать THREE.Texture для веб-работников, чтобы помочь постобработке эффектов, таких как цветение. Например, для эффекта цветения я сначала нарисовал бы сцену на объекте THREE.Texture, а затем я бы хотел обработать процесс размытия в веб-работнике. Каков будет самый эффективный способ передачи данных THREE.Texture работнику и создания новой текстуры THREE.Texture из данных, полученных от работника. Поскольку в идеале я делал бы это 60 раз в секунду, мне нужен быстрый и дружественный к памяти способ сделать это (дружественный к памяти: не создавать новые объекты в цикле, а скорее повторно использовать существующие объекты).

Я знаю, что canvas2DContext.getImageData может быть полезен, но это, вероятно, не лучший способ, так как я буду рисовать на холст 60 раз в секунду, и это замедлит ход событий.

Спасибо!

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

1 Ответ

0 голосов
/ 29 июня 2018

Передача текстуры на основе графического процессора веб-работнику ничего не ускорит, на самом деле это будет значительно медленнее.

Передача памяти из графического процессора в ЦП (и ЦП в ГП) также происходит очень медленно по сравнению с выполнением всех операций на ГП. Единственный способ передать содержимое текстуры работнику - попросить WebGL скопировать из графического процессора в ЦП (используя gl.readPixels в трех, независимо от того, является ли это оболочкой для gl.readPixels), а затем передать результат работнику. , Тогда на рабочем месте все, что вы могли бы сделать, - это медленное размытие на основе ЦП (медленнее, чем это было бы на GPU), затем вам пришлось бы перенести его обратно в основной поток, только чтобы загрузить его снова через gl.texImage2D или сказать Three.js сделать это для вас, что также является медленной операцией копирования данных из ЦП обратно в графический процессор.

Самый быстрый способ применить размытие - это сделать это на GPU.

Кроме того, нет возможности совместно использовать ресурсы WebGL между основным потоком и рабочим, и вряд ли это произойдет в ближайшее время. Даже если бы вы могли совместно использовать ресурс, а затем от работника, попросите графический процессор сделать размытие, которое не сэкономило бы время, а также, по большей части, графические процессоры не выполняют разные операции параллельно (обычно не многопроцессорные, как процессоры), поэтому все, что вам нужно сделать, это попросить графический процессор выполнить тот же объем работы.

...