Добавлен , опубликован

Заметки по Unity3D

Содержание:

Скрипты

  1. Не стоит использовать GetComponent слишком часто - это довольно затратная функция, поэтому старайтесь избегать её применения, но бояться её не нужно :) Если все же есть такая необходимость, то получайте нужный скрипт заранее внутри Start, если не планируете добавлять его динамически.
  2. Кэшируйте переменные внутри Update! К примеру возьмём два блока кода:
privat int i;
void Update() {
	for (i = 0; i < 10; i++) {
		...
	}
}
void Update() {
	for (int i = 0; i < 10; i++) {
		...
	}
}
Оба примера идентичны по функционалу, но первый вариант является более грамотным.
  1. Использование Co-routines. Насколько мы знаем, Update() функция вызывается каждый кадр, поэтому если нам позволяет вызывать функцию каждые 5 секунд, лучше использовать Co-routines.
  2. GUI - дорогое удовольствие, особенно для мобильных устройств. Не злоупотребляйте рисованием GUI.
  3. Создавать новые переменные(прим. new Rect) в циклах - опасно.
  4. CompareTag быстрее чем прямое сравнение(object.tag == "nametag")
Пруф (English)
CompareTag compiles to fewer CIL instructions than the direct comparison, for sure: it probably results in a single call to the CompareTag internal function, while the other alternative will need a call to the tag getter function (to get the tag string) and another call to the string comparison function, all of this in CIL (the interpreted language used in .NET applications). Since the tag string must be returned by the getter function, space must be allocated, what takes extra time.
Anyway, the difference probably is very small, but may become significant if a lot of CompareTags is used in Update or OnCollision/TriggerStay, and/or the target machine is a mobile device.

Сцена

  1. Туман жрёт очень много ресурсов.
  2. Большой ландшафт тоже дорогой. 200х200 вполне хватает. Увеличение параметра PixelError увеличит и производительность.
  3. Освещение тоже сильно давит на процессор, особенно на мобильных устройствах.
  4. Старайтесь сделать так, чтобы у вас было как можно меньше материалов и текстур.
  5. Использование физики отъедает значительный кусок пирога памяти - это и ежу понятно.
  6. Ресурсы(Шейдеры, текстуры, модели...), адаптированные под мобильные устройства неплохо экономят FPS и память.
  7. Отключайте события/физику/циклы вне поля зрения игрока. Отследить это можно функциями OnBecameVisible и OnBecameInvisible.
P.S. Помимо всего этого можно играться с настройками графики, крутить ползунки, сжимать текстуры, и т.д.

`
ОЖИДАНИЕ РЕКЛАМЫ...
0
5
10 лет назад
0
Ты еще забыл про Ambient Occlusion, LODGroup и пост-обработку для камеры.
0
26
10 лет назад
0
xDanteZx, что значит "забыл"? Товарищ советует то, что использует сам. Некоторые из его советов могут оказаться менее очевидными, чем то, что ты указал. Кстати, раз уж на то пошло, есть еще батчинг и куллинг.
0
5
10 лет назад
0
lentinant:
Некоторые из его советов могут оказаться менее очевидными, чем то, что ты указал.
Но это тоже оптимизация.
2
27
10 лет назад
2
  • Не ясен смысл кеширования int во втором примере. Абсолютно надуманный пример
  • Не раскрыта тема как лучше использовать GetComponent. Обращение к компонентам может оказаться на стороне редакторе где никакой Start не выполнялся. Или создан посреди сцены.
А самый частый пример - кеширование компонента при первом обращении к нему. Например:
private MyComponent _mycomponent;
public MyComponent mycomponent 
{
   get 
   { 
      if (_mycomponent == null)
         _mycomponent = GetComponent<MyComponent>();
      return _mycomponent;
   }
}
  • Насчет создания Rect в циклах - чушь. Rect представлен struct, что по дефолту является легковесным, так как не требует ссылок. Даже если вы закешируете Rect в отдельное поле, вы все равно при использовании будете просто копировать значение, как и при операторе new. А вот постоянные перерасчеты того что можно посчитать один раз - губительны, здесь спору нет. Уж тем более - ЧЕМ опасно создание переменных в цикле? Что за ересь? Вы можете создавать тысячи переменных в цикле, это абсолютно безопасно! Даже могилки не ощутят эту операцию.
0
29
10 лет назад
0
private MyComponent _myComponent;
public MyComponent MyComponent 
{
     get { return _myComponent ?? (_myComponent = GetComponent<MyComponent>()); }
}
Так короче)
0
37
10 лет назад
0
оптимизатор плохо работает чтоли? посмотрите байткод)
0
27
10 лет назад
Отредактирован Devion
0
alexprey, так нельзя писать. Забудьте про использование оператора "=" в функциях и коротких записях. Да, решарпер их предлагает как "улучшения", но единственное на что вы наткнетесь - баг юнити. Компиляция в Unity не переваривает "=" правильно, если вы используете его в выражениях такого вида. Например, в вашем коде объект при первом обращении вернет null, несмотря на то что по логике он должен вернуть компонент.
Пруф как тестили (здесь можно нажать)
Случай такой как оказалось потом не только с Transfrom, но отлавливать ноги у таких багов, где весь код по логике - дико и не нужно. Та же херня и с телами методов и еще кучей классов.
0
29
10 лет назад
0
alexprey, так нельзя писать. Забудьте про использование оператора "=" в функциях и коротких записях
мдаа... раз уж на то пошло, то тут косяк не в операторе присвоения, а в операторе ?? он видимо в юньке работает криво, ибо
return component ? component : (component = GetComponent<Component>()); 
работает замечательно
0
9
10 лет назад
0
Случай такой как оказалось потом не только с Transfrom, но отлавливать ноги у таких багов, где весь код по логике - дико и не нужно. Та же херня и с телами методов и еще кучей классов.
Вот это в заметочки бы)
0
27
10 лет назад
Отредактирован Devion
0
alexprey, не всегда и не везде. И почему я грешу на присвоение - в функциях, например, когда указываешь что то аля
CallFunction(component = GetComponent<Component>());
тоже работает не всегда и не везде. Отлавливать какие-то точные правила - трудно, но косяк такой у юньки наблюдается.
0
29
10 лет назад
0
Extravert, даже и не знаю, кто так юзает. А вообще да в юнити полно костылей из-за недоразвитого моно. Ну мб вскоре появиться что то дельное, после открытия исходников компилятора
Чтобы оставить комментарий, пожалуйста, войдите на сайт.