Асинхронный ComputeBuffer.GetData с помощью native plugin?

Программирование на Юнити.

Асинхронный ComputeBuffer.GetData с помощью native plugin?

Сообщение Zolden 11 дек 2016, 02:02

ComputeBuffer.GetData - синхронный метод, и ждёт, пока графический девайс дойдёт до запроса. Это дропает фпс довольно сильно.

Но в 5.5 появилась вот эта штука: ComputeBuffer.GetNativeBufferPtr. Вопрос: возможно ли асинхронно получать данные из GPU в CPU, используя функциональность нативных плагинов и API directx?

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

С виду самое близкое, что удалось нагуглить - это вот это: https://msdn.microsoft.com/en-us/librar ... 28(v=vs.85).aspx

Как думаете, это оно? Можно через него асинхронно прочитать из GPU и доставить в юнити?
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Асинхронный ComputeBuffer.GetData с помощью native plugin?

Сообщение zameran 11 дек 2016, 10:13

Посмотрев документацию https://docs.unity3d.com/550/Documentation/ScriptReference/ComputeBuffer.GetNativeBufferPtr.html - и почитав внимательно:

Note that calling this function when using multi-threaded rendering will synchronize with the rendering thread (a slow operation), so best practice is to set up needed buffer pointers only at initialization time.

Кажется ничего не выйдет...

РЕД: А хотя, может что-то и получится, если нативный плагин будет полностью асинхронный. Собстно я в нативных такой же нуб. Но по логике всё так.
"Не уходи смиренно, в сумрак вечной тьмы..."
Аватара пользователя
zameran
UNIт
 
Сообщения: 58
Зарегистрирован: 16 июл 2011, 15:09
Откуда: Крым, Евпатория
Skype: zameran9

Re: Асинхронный ComputeBuffer.GetData с помощью native plugin?

Сообщение Zolden 12 дек 2016, 01:41

Ну, получить этот пойнтер можно и в инициализации, а потом юзать асинхронно уже плагин, передавай в него этот пойнтер.

Спросил на форуме сотрудника юнити. Говорит, кто-то уже работает непосредственно над асинхронной версией ComputeShader.GetData. И подтвердил, что плагин может читать данные из гпу асинхронно.

Так что буду с нативными плагинами теперь разбираться.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Асинхронный ComputeBuffer.GetData с помощью native plugin?

Сообщение Zolden 23 дек 2016, 13:40

Если кому интересно, вот чувак с форума юнити сделал плагин:

https://github.com/SlightlyMad/AsyncTextureReader

Работает отлично. Хотя данные приходят с задержкой в пару фреймов, но в каждом апдейте тратится не больше 1мс. Это огромный выигрыш по сравнению с синхронным методом ComputeBuffer.GetData, на который тратились десятки миллисекунд.
Аватара пользователя
Zolden
UNITрон
 
Сообщения: 156
Зарегистрирован: 29 мар 2014, 19:05
Откуда: Москва

Re: Асинхронный ComputeBuffer.GetData с помощью native plugin?

Сообщение zameran 27 дек 2016, 11:48

Интересно.
Нужно ещё к OpenGL 4.2 - 4.5 прикрутить и будет круто!

Они и будут приходить с задержкой. Ведь в это время пайплайн нагружен работой.
Зато в это время не падает в клин пайплайн самой юнити.
"Не уходи смиренно, в сумрак вечной тьмы..."
Аватара пользователя
zameran
UNIт
 
Сообщения: 58
Зарегистрирован: 16 июл 2011, 15:09
Откуда: Крым, Евпатория
Skype: zameran9


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 7