Как можно быстро взять пиксель с экрана?

Раздел, посвящённый самому важному - скорости.

Как можно быстро взять пиксель с экрана?

Сообщение [bm] 14 дек 2015, 14:22

Как можно быстро взять пиксель с экрана? Сейчас рендерю в текстуру и читаю через ReadPixel - но это не так быстро, как хотелось бы. Какие еще есть способы?
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Как можно быстро взять пиксель с экрана?

Сообщение Tolking 14 дек 2015, 14:24

Это для чего нужно?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как можно быстро взять пиксель с экрана?

Сообщение [bm] 14 дек 2015, 20:25

Для определения какой объект (меш) под курсором. Рейкаст + жирный мешь коллайдер + скейл = тормоза при анимации или движении. С рендер в текстуру все работает и достаточно быстро (если не каждый фрейм проверять), но хочется избавиться от пиков во время чтения, а на планшетах чуток еще приподнять фпс. Не игра.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Как можно быстро взять пиксель с экрана?

Сообщение Paul Siberdt 14 дек 2015, 21:03

По мне так рендер в текстуру на порядки более тяжелая операция, чем трассировка. А что мешает не в каждом кадре пускать лучик? И не факт, что прям нельзя обойтись коллайдерами-примитивами или оптимизированными конвексами. :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Как можно быстро взять пиксель с экрана?

Сообщение Tolking 14 дек 2015, 21:41

Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Как можно быстро взять пиксель с экрана?

Сообщение [bm] 15 дек 2015, 07:38

Дело не в рейкасте, а в жирных меш коллайдерах + скейл = тормоза при анимации или движении, особенно на скиннед мешах. В Unity 5 значительно улучшили ситуацию, но все равно не то.
В итоге нашли выход: рендерить клоны объектов в небольшую текстуру, где каждый меш рендерится самым простым цветным шейдером (солид колор) и имеет свой цвет. Рендер в текстуру размером 256 гораздо быстрее, как показала практика. И нет фризов при расчете коллайдеров (MeshCollider.Bake), особенно на планшетах.

Но ReadPixels тоже не дешевая операция, поэтому хочется найти еще быстрее вариант, чтобы стало еще лучше.
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Как можно быстро взять пиксель с экрана?

Сообщение jetyb 15 дек 2015, 08:50

Какие вижу варианты:
1. Необходимые данные находятся в текстуре в памяти видеокарты. Проблема лишь в том как их быстро получить. Всю текстуру в данном случае брать необязательно. Можно запустить вычислительный шейдер, который скопирует в буфер (ComputeBuffer) необходимые данные. А из буфера взять 1 число будет намного быстрее. Но вычислительные шейдеры требуют DirectX 11.
2. Первый вариант, но более адаптированный. Как например в технике HDR находят среднюю яркость экрана? Последовательно рендерят текстуру жэкрана в текстуры с все меньшим разрешением, до однопиксельной. А потом берут среднее значение яркости из этого пикселя. И все достаточно резво работает.
В данном же случае можно сразу рендерить текстуру экрана в однопиксельную со значением пикселя под мышкой. Получение данных из текстуры размером в 1 пиксель будет быстрым.
3. Просто оптимизация. Во время приготовления этой особой текстуры необязательно брать исходную камеру. Достаточно камеры с небольшим полем обзора (и выходной тестурой), но видящей небольшую область вокрут требуемого пикселя.

По мне так рендер в текстуру на порядки более тяжелая операция, чем трассировка. А что мешает не в каждом кадре пускать лучик? И не факт, что прям нельзя обойтись коллайдерами-примитивами или оптимизированными конвексами. :)

Ага, ради этого вешать на каждый объект сцены по коллайдеру, следить за этим... Да и не на всё получится навесить коллайдер.
Как по-вашему в unity editore реализован выбор объекта через клик?
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Как можно быстро взять пиксель с экрана?

Сообщение bwolf88 15 дек 2015, 10:00

Как по-вашему в unity editore реализован выбор объекта через клик?

Может проще будет посомтреть как в юнити эдиторе реализована пипетка с выбором цвета пикселя на любой точке экрана.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Как можно быстро взять пиксель с экрана?

Сообщение BenjaminMoore 15 дек 2015, 10:02

читайте сразу нужный пиксель, скорость ReadPixels зависит от количества читаемых пикселей, для RT размером 1024х1024 это занимает около 15мс, если вызвать ReadPixels с Rect(0,0,1,1) это будет менее 1мс
останется посчитать в скрипте где находится ваш курсор в размерах вашей RT и вся магия
обязательно юзайте targetTexture у камеры

ReadPixels в обойти невозможно, потому что текстура хранится в GPU RAM.
можно пошаманить с найтив плагинами через IntPtr, но вы устанете пилить под каждую платформу тем более это не даст столько профита, относительно потраченного времени.
My hands are hard. My mind is core.
ring0x0000 c0x0063 | write code in rust right now
Аватара пользователя
BenjaminMoore
UNITрон
 
Сообщения: 338
Зарегистрирован: 03 янв 2013, 18:07
Skype: benjminmoore

Re: Как можно быстро взять пиксель с экрана?

Сообщение [bm] 15 дек 2015, 10:49

Спасибо jetyb за 3й вариант, думаю это реально выход.

BenjaminMoore, я и так читаю сразу нужный пиксель.

Только что провел тест с ReadPixels:
- если рендертекстура размером 300х180, и читать только нужный пиксель - 50мс на моей машинке.
- текстура размером 2х2 уже почти ничего не стоит.

В итоге 3 вариант от jetyb:
Во время приготовления этой особой текстуры необязательно брать исходную камеру. Достаточно камеры с небольшим полем обзора (и выходной тестурой), но видящей небольшую область вокрут требуемого пикселя.


Остается вычислять позицию камеры, нужный вьюпорт и рендерить в зависимости от позиции курсора.

Всем спасибо!
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск

Re: Как можно быстро взять пиксель с экрана?

Сообщение BenjaminMoore 15 дек 2015, 11:01

[bm] писал(а):
Только что провел тест с ReadPixels:
- если рендертекстура размером 300х180, и читать только нужный пиксель - 50мс на моей машинке.
- текстура размером 2х2 уже почти ничего не стоит.


это тест именно на девайсе? потому что я не билдил на девайс, а смотрел на пк.
тогда интересно, разница точно есть.

тогда уменьшение размера начальной текстуры это правда единственно правильный выход
My hands are hard. My mind is core.
ring0x0000 c0x0063 | write code in rust right now
Аватара пользователя
BenjaminMoore
UNITрон
 
Сообщения: 338
Зарегистрирован: 03 янв 2013, 18:07
Skype: benjminmoore

Re: Как можно быстро взять пиксель с экрана?

Сообщение [bm] 15 дек 2015, 11:07

нет, это тест на не быстром мак мини 2011
Mafia Rush: universal iOS game _https://goo.gl/CKq4D Android _https://goo.gl/slFLXx
Shooter Ball: Android _https://goo.gl/21QyPw
skype: bmindfield
Аватара пользователя
[bm]
UNIверсал
 
Сообщения: 426
Зарегистрирован: 11 май 2010, 22:33
Откуда: Россия, Ижевск


Вернуться в Оптимизация

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3