Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Однако и в текущем варианте получен ценный опыт оптимизации под Unity3d и результирующий прирост производительности более чем в 300% на интегрированном GPU.
Забыл, кстати, среди CPU оптимизаций упомянуть лямбда выражения, каждый вызов которых также выливается в дополнительные аллокации в памяти.
Почему свойства на столько не производительны что стоит от них отказаться?
float Mathf::Sin(float v) {
return (float)System.Math.Sin((double)v);
}
дело в алокации памяти типом строка
«Самым плохим моментом оптимизаций является то, что ваш структурированный и „идеальный“ код растекается в местами не очень читабельное нечто. К сожалению, это неизбежно. Главное помнить о том, что это жертва в угоду производительности.»
Инстанциирование объектов является очень тяжелой операций, поэтому стоит для частых созданий использовать пул объектов и затем их переиспользовать.
Мне, честно говоря, страшно представить, что вы делали в своей игре, если вам пришлось оптимизировать отказом от использования foreach, свойств
Мне страшно, если вы прийдете в мобильный геймдев
В таком случае прячьтесь под кровать — мы в компании выпустили около 15 мобильных игр и приложений
При работе с массивами компилятор развернет foreach в обычный for loop.
ВООБЩЕ отказаться от строк и свойств» — это ахинея и за такие советы надо просто бить по рукам.
Ахинея — использование автосвойств без ограничения доступа. По сути — просто увеличение вычислительной нагрузки без логического обоснования. Свойства нужны исключительно для вычисляемых полей и ограничения доступа.
Ну так и есть, лаги-фризы, как и говорил, ничего нового.
с переходом на личности.
без компиляции кода в dll
Как компиляция кода во внешнюю сборку связана с геймдевом?
коротинах
подхачивание
Это никак не означает, что геймдев разработка как-то отличается от любой другой в этом плане.
ынтерпрайз
Просто не использовать foreach — это самое простое и правильное что можно сделать.
Нет единого верного решения, серебряной пули, в каждом конкретном случае требуется адаптированное решение.
поэтому foreach не нужно использовать никогда… В 99% случаев никакого прироста производительности это не даст
В оставшихся 1% случаев требуется
В Unity 5.5 обновили версию компилятора, и в будущих версиях будут обновлять версию runtime
У меня один вопрос — что вы делаете в мире C#? Пишите игры на С++
Ещё можно похоливарить на тему того, что по хорошему можно обойтись без List, и он работает медленнее, чем массивы, так что давайте везде юзать массивы.
Просто если вы знаете, что форичи аллоцируют лишнего в юнити и заставляют GC запускаться чаще — вот это уже хорошо. Так как если возникнет проблема, что игра по какой-то причине фризится, то вы знаете где это можно искать, а это главное.
Об особенностях юнити нужно думать не только в foreach, но и вообще.
нужно взять хешсет и ходить по нему форичем, так как хешсет на поиск нам даст О(1).
private readonly List<MyClass> myList = new List<MyClass>();
private Action InvokeMyFunc = delegate { };
public void Add(MyClass entity)
{
myList.Add(entity);
InvokeMyFunc += entity.MyFunc;
}
public void Remove(MyClass entity)
{
myList.Remove(entity);
InvokeMyFunc -= entity.MyFunc;
}
public void InvokeAllMyFunc()
{
InvokeMyFunc();//Вместо foreach цикла
}
public class MyClass
{
public void MyFunc() { }
}
Почему так не делают?
В некоторых местах можно же обойтись без foreach и for и сделать на делегатах?
interface IMyAsync {
void MyAsyncMethod();
}
class MyClass : IMyAsync {
public void MyAsyncMethod() {
}
}
public void InvokeAllMyFunc() {
for (var i = myList.Count - 1; i >= 0; i--) {
myList[i].MyAsyncMethod();
}
}
var value = new string(' ', 100);
fixed (char* valuePtr = value)
valuePtr[0] = '1'; // ..
Первые шаги в оптимизации и полировке игры на Unity3d