1. Использование Статических переменных
При использовании JavaScript наиболее важной оптимизацией является использование статических типов вместо динамических. Unity использует метод, который называется type inference, для автоматической конвертации переменных JavaScript к статическому коду, для этого вам ничего не понадобиться делать.
- Код: Выделить всё
1. var foo = 5;
var foo = 5;
В приведенном выше примере foo автоматически распознается как переменная типа integer. Таким образом Unity может применить множество оптимизаций времени компиляции, без затратных динамических поисков имени переменной и тд. Это одна из причин, почему Unity JavaScript в среднем в 20 раз быстрее чем какие либо другие реализации JavaScript.
Единственная проблема – не все типы возможно распознать, в таких случаях Unity вернётся обратно к динамическому типу для этих переменных. Использование динамических типов на JavaScript было бы проще для написания кода, тем не менее это бы замедлило его выполнение кода.
Рассмотрим несколько примеров:
- Код: Выделить всё
1. function Start () {
2. var foo = GetComponent(MyScript);
3. foo.DoSomething();
4. }
function Start () {
var foo = GetComponent(MyScript);
foo.DoSomething();
}
В данном варианте foo будет динамически определено, таким образом вызов функции DoSomething длится дольше чем нужно, потому что тип foo неизвестен, и вначале нужно выяснить, поддерживает ли foo функцию DoSomething, и если поддерживает то вызвать её.
- Код: Выделить всё
1. function Start () {
2. var foo : MyScript = GetComponent(MyScript);
3. foo.DoSomething();
4. }
function Start () {
var foo : MyScript = GetComponent(MyScript);
foo.DoSomething();
}
Здесь foo у нас имеет определённый тип. Производительность в данном случае будет гораздо лучше.
2. Используйте #pragma strict
Конечно, сейчас проблема состоит в том, что вы обычно не замечаете использование динамической вёрстки. #pragma strict сможет вам помочь. Просто добавьте в начало кода #pragma strict и Unity отключит динамическую вёрстку в данном скрипте, вынуждая вас использовать статическую. Там где тип будет неизвестен, Unity сообщит нам про ошибки компиляции. В этом случае foo будет выдавать ошибку на этапе компиляции:
- Код: Выделить всё
1. #pragma strict
2. function Start () {
3. var foo = GetComponent(MyScript);
4. foo.DoSomething();
5. }