Unity3D, iOS и AOT: Что нужно иметь ввиду

Привет. На своем проекте пришлось переводить код c Android на iOS, который не был заранее под это дело рассчитан. В чем проблема?

AOT + Mono 2.6


Ahead of Time(AOT) компиляция — это когда компиляция выполняется всей программы перед ее использованием. Это значит, что все типы должны быть заранее известны.

Юнити использует версию Mono 2.6 + допилы с их стороны. В этой версии есть баги, которые делают разработку тем еще квестом.

Типичные факапы


0. Читаем офф справку

1. Interlocked.CompareExchange<>() — об этом можно прочесть тут.

Вариант решения — использовать перегрузку, которая принимает object тип.

2. Dictionary<ValueType,...>() — да-да. Если использовать в словаре значимый тип как ключ, то будет креш. Я с этим столкнулся при использовании json десериализатора. Проблема описана тут.

Вариант решения — реализовать интерфейс IEqualityComparerи подставить объект типа в конструктор словаря Dictionary<TKey, TValue> (объект).

3. PropertyInfo.GetValue() — «немного рефлексии не помешает» думаете вы. И получаете значение свойства… Фиг вам:) Краш! На эти грабли я вступил, когда мой JsonFX упал в попытках десериализовать класс из строки. Используйте JSON.NET for Unity

Вариант решения — использовать метод PropertyInfo.GetGetMethod().Invoke(obj,null); Говорят, что он в несколько раз медленнее, но что поделать.

4. LINQ — не все экстеншен методы работают гладко. Читаем коммент.

Вариант решения — использовать плагин.

5. Ran out of trampolines of type xxx — это когда много генериков у вас в коде, насколько я понял. Описано в офф справке.

Вариант решениячитать

Third Party


Очень рекомендую вам проверить, поддерживают ли ваши либы AOT. Так, мне пришлось выкинуть на своем проекте StackService(.NET), JsonFX.

Лучше сразу прощупайте почву и выберите правильный инструмент.

the end


Вот и все, чем я хотел с вами поделиться. Что продублировал из справки, чтобы показать вариант решения. Продуктивной разработки вам!

P.S. Если есть что добавить — прошу комменить. Спасибо AGulev за LINQ

2 комментария

avatar
Только что попробовал собрать проект с JsonFX под ios — все собралось отлично. Но только с использованием il2cpp
avatar
Леша, читал по ссылке?
To summarize, JsonFX works fine if you use ".NET 2.0 Subset". If not, it exhibits that «attempting to JIT compile» error.
Дело не в бэкенде, а в платформе
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.