Пятница, 29 Ноября 2024, 12:59

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Жрёт ли GetActive() ресурсы системы?
alexsilentДата: Среда, 03 Апреля 2019, 12:40 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
Я раньше всегда, для проверки, активен ли объект создавал дополнительные boolean переменные,
ибо боялся, что GetActive() эта сложная функция, которая жрёт ресурсы, что-то дополнительно проверяя каждый кадр!
Жрёт ли GetActive() ресурсы системы или это работает также быстро, как проверка boolean?

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


Сообщение отредактировал alexsilent - Среда, 03 Апреля 2019, 12:43
martukДата: Среда, 03 Апреля 2019, 12:45 | Сообщение # 2
заслуженный участник
Сейчас нет на сайте
Не знаю как в Unity, но быстрее всех будет перебирать все объекты и проверять boolean через switch а не через условия.

Добавлено (03 Апреля 2019, 12:47)
---------------------------------------------
А если дело идет об очень большом количестве объектов, а активных перечислить можно, то заведи отдельный массив только активных объектов и работой только с ним.

Добавлено (03 Апреля 2019, 12:52)
---------------------------------------------
Если ты паришься о производительности, то могу предположить что счет объектов у тебя там за несколько тысяч. Не знаю что конкретно у тебя за ситуация, но можешь копнуть в систему чанков. Если вкратце: зачем перебирать все объекты на сцене, если можно перебрать только те, которые ближе к игроку и являются частью "зоны", где находится сейчас игрок.


Сообщение отредактировал martuk - Среда, 03 Апреля 2019, 12:59
drcrackДата: Среда, 03 Апреля 2019, 13:41 | Сообщение # 3
старожил
Сейчас нет на сайте
у тебя в юнити профайлер не работает или в чем вообще смысл этой темы

Цитата
Оптимизация очень важна.

так может попробуй для начала оптимизировать свое время, перестав писать лишний код, просто потому что "ибо боялся"?

Цитата
Если ты паришься о производительности, то могу предположить что счет объектов у тебя там за несколько тысяч. Не знаю что конкретно у тебя за ситуация, но можешь копнуть в систему чанков. Если вкратце: зачем перебирать все объекты на сцене, если можно перебрать только те, которые ближе к игроку и являются частью "зоны", где находится сейчас игрок.

когда обьектов так много что их становится сложно обрабатывать, надо переходить на ECS и Job system, а не придумывать костыли

Цитата
Не знаю как в Unity, но быстрее всех будет перебирать все объекты и проверять boolean через switch а не через условия.

че?)


Сообщение отредактировал drcrack - Среда, 03 Апреля 2019, 13:45
alexsilentДата: Среда, 03 Апреля 2019, 14:03 | Сообщение # 4
почти ветеран
Сейчас нет на сайте
Цитата drcrack ()
у тебя в юнити профайлер не работает или в чем вообще смысл этой темы


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


Сообщение отредактировал alexsilent - Среда, 03 Апреля 2019, 14:03
drcrackДата: Среда, 03 Апреля 2019, 14:54 | Сообщение # 5
старожил
Сейчас нет на сайте
Цитата
мне просто бы поточнее узнать как работает функция GetActive, с вычислениями или без

начнем с того что такой функции нет :D

Цитата
профайлер такие мелкие вычисления не делает,

так запусти их миллион раз

Цитата
скажет что норм в любом случае

круто, мой почему-то не разговаривает
seamanДата: Среда, 03 Апреля 2019, 16:30 | Сообщение # 6
старожил
Сейчас нет на сайте
Твои булевы переменные или могут врать, или будут медленней чем встроенные.
Почему?
Потому что можно выключить где-то parent в иерархии. Тогда, чтобы твои булевы не врали тебе придется при этом пройти по всей иерархии вниз и изменить их. Думаю это будет дольше, чем использовать https://docs.unity3d.com/ScriptReference/GameObject-activeInHierarchy.html
pixeyeДата: Четверг, 04 Апреля 2019, 11:08 | Сообщение # 7
Red Winter Software
Сейчас нет на сайте
Цитата alexsilent ()
Жрёт ли GetActive() ресурсы системы или это работает также быстро, как проверка boolean?

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


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

Прежде чем ты будешь говорить об оптимизации - оптимизации чего? Памяти, быстродействия или твоего воркфлоу? Ведь оптимизированный код как правило далеко не самый читабельный и удобный в работе.
Ты создаешь вот bool - а зачем? это 1 байт.

Вместо кучи булевых переменных почему бы не сделать bitarray ?

Чтобы не мучаться вопросами как делает это юнити надо смотреть на методы юнити : )

Да - это тоже прослойка, обращение через нее будет ЧУТЬ медленее но настолько ли чтобы ты парился об этом? Если тебе интересно узнать об этом больше, почитай статьи этого мужика.

Ссылка на тесты быстродействия if

В общем вот тебе совет
1) знай проблему в лицо.
2) всегда проводи тесты сам. Сомневаешься в чем-то - протестируй. Как это лучше всего сделать?
Скачай профайлер. Это два скрипта.
После этого ты сможешь делать так

В твою консоль в редакторе будет выдаваться время за которое операция между start и end произошла. В райнтайме записывается в лог. Оч удобно.
3) Тестируй всегда на собранном проекте, тесты в редакторе не дадут точных значений. В редакторе можно тестить только относительно старого результата ( типа быстрее/медленее )
4) Удобство работы важнее оптимизации.
5) Оптимизируй только узкие места к которым ты потом будешь оч редко возвращаться. Как правило это относится к системам, движкам и прочим подобным штукам. Оптимизировать кучу игровых скриптов чтобы потом из-за изменений в дизайне их выбросить малоприятное занятие ;)
6) Это не значит что надо писать треш. Многие мелочи которые ты бы назвал оптимизацией я бы пометил как понимание инструмента с которым работаешь.
7) Код логики игры как правило последнее что создает проблемы для производительности. Особенно если твоя игра несложная и содержит мало элементов.


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Четверг, 04 Апреля 2019, 12:11
drcrackДата: Четверг, 04 Апреля 2019, 12:01 | Сообщение # 8
старожил
Сейчас нет на сайте
А мне вот до сих пор интересно что значит "перебирать все объекты и проверять boolean через switch а не через условия."
martukДата: Четверг, 04 Апреля 2019, 12:39 | Сообщение # 9
заслуженный участник
Сейчас нет на сайте
drcrack, имелось в виду если уж он и хочет свои булки использовать, то пусть постарается меньше условий задействовать. Люди игнорируют switch конструкции там, где они реально нужны. Опять же, все зависит от конкретных задач.

Добавлено (04 Апреля 2019, 12:42)
---------------------------------------------
Условие - сама по себе тяжелая операция для процессора. Если их много, то в некоторых случаях можно обойтись switch т.к. процессорного времени будет тратиться гораздо меньше.


Сообщение отредактировал martuk - Четверг, 04 Апреля 2019, 12:44
drcrackДата: Четверг, 04 Апреля 2019, 12:51 | Сообщение # 10
старожил
Сейчас нет на сайте
Цитата
Условие - сама по себе тяжелая операция для процессора. Если их много, то в некоторых случаях можно обойтись switch т.к. процессорного времени будет тратиться гораздо меньше.

все современные компиляторы сами замечают последовательность if else if else и применяют необходимые оптимизации (но это актуально в основном для строк или диапазонов)
в случае проверки одного boolean никакой разницы не будет, а будет одинаковый код с точностью до байта
seamanДата: Четверг, 04 Апреля 2019, 23:40 | Сообщение # 11
старожил
Сейчас нет на сайте
Цитата
После этого ты сможешь делать так

Если все происходит в одном кадре, как на скрине, то ничего качать не надо.
Есть такая штука:
https://docs.microsoft.com/ru-ru/dotnet/api/system.diagnostics.stopwatch?redirectedfrom=MSDN&view=netframework-4.7.2

Цитата
но это актуально в основном для строк или диапазонов

Важное замечание.
В Cil есть специнструкция switch. Чем хороша. В проге указывается таблица адресов перехода. И переход осуществляется вычислением, как в массиве, в этой таблице - адреса перехода. Т.е. по сути никаких if не делается. Что, естественно быстрее чем куча if.
НО! Это только для тех случаев, когда можно вычислить индекс в массиве адресов! В общем случае такого не получится. И, естественно, если у вас один-два if-а, то ускорения тоже не будет.
Т.е., если Вы можете вместо кучи if написать switch, и в этом switch 4-5 и более case, то лучше думаю использовать switch, а не кучу if-ов.
Компиляторы развиваются, и, возможно смогут заменить кучу if на switch из CIL, но я пока такого не замечал.

С другой стороны не надо забывать про дальнейшую судьбу нашего кода.
Во первых. Сейчас CIL код в чистом виде в Юнити уже почти не используется, а скоро вообще исчезнет. Он тут же компилируется в C++/JS и что там еще?.. И как он там компилируется и какие оптимизации используются - непонятно.
Во вторых. Даже если он все же CIL - он рантайм компилируется в нативный код платформы. И там тоже свои оптимизации и заморочки.

Поэтому -да здравствует профайлеры, бенчмарки и иже с ними!
pixeyeДата: Пятница, 05 Апреля 2019, 08:46 | Сообщение # 12
Red Winter Software
Сейчас нет на сайте
Цитата seaman ()
Если все происходит в одном кадре, как на скрине, то ничего качать не надо.
Есть такая штука:


Чтобы пользоваться этой штукой надо кучу строчек написать и еще в конце вызвать дебаг лог. Я же предлагаю это в три строчки :)


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю

drcrackДата: Пятница, 05 Апреля 2019, 08:46 | Сообщение # 13
старожил
Сейчас нет на сайте
ну прямо битва профайлеров
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг