Совсем недавно ко мне обратился коллега с просьбой помочь с ошибкой, когда json не мог распаковаться и падал с ошибкой примерно такой по смыслу:

"Не могу найти конструктор с передаваемыми параметрами", а стек показывает, что где-то там через рефлексию создается инстанс (через Activator) и при вызове конструктора чет все падает.

И тут знаете, как в шуточках за 300, люди делятся на несколько групп:

  • Неопытные с ужасом идут гуглить ошибку, ничего не находят, идут дергать вторую группу;
  • Более опытные понимают, что тут как-то не очень все тривиально, идут в место где рефлексией создается какой-то объект и пытаются понять как же можно было накосячить создателям плагина, что оно не работает;
  • Ну и такие как мы с вами, которые в принципе уже понимают, что билд скорее всего il2cpp, что рефлексия - это плохо, что il2cpp ничего об этом знать не знает, а значит проблема просто в том, что метода нет после компиляции.

К чему я это все. Для исправления подобных ситуаций, il2cpp нужно "подсказать", что существует метод (или конструктор), для чего я обычно делаю в проекте файл AOT.cs:

public static class AOT {
    [Preserve]
    public static void Dummy() {
       new SomeClass().Method(); // не вырезаем конструктор и метод из билда
       ...
    } 
} 

Т.е. мы никогда не вызываем этот метод, но при сборке эти методы будут добавлены.

Вообще это касается всех вызовов через reflection и когда в проекте не указывается вызов.

Read More  

Их нет, да, но как тогда работают дженерики, которые мы делаем в C#? Там то они есть;) а мы используем il2cpp почти всегда для продакшена. В итоге под каждый тип, который мы вызываем, будет создан метод. Это стоит учитывать, когда вы создаете дженерик метод и делаете миллион разных вариантов вызовов, то ожидайте код в размере миллиона копипастных методов;)

Read More  

Для того, чтобы ускорить выполнение кода в райнтаме при компиляции через IL2CPP, можно воспользоваться аттрибутом Il2CppSetOptionAttribute:

https://pastebin.com/6gdiGwde

Его не существует в Unity, поэтому его нужно объявить самостоятельно, Unity сама найдет его по имени. Аттрибут можно использовать для одного класса/структуры/метода несколько раз с разными значениями.

Производительность повышается тем, что при генерации кода C++ мы убираем из кода лишние проверки. Можно использовать в тех местах, где мы уверены, что не будет случайного null или мы точно не выходит за рамки массива. Проще говоря все те исключения, на которые в обычной жизни мы повлиять никак не могли.

Read More