Исправление ошибок (Patching) в выпуске для iOS / Android (включая изменения скомпилированного скрипта) в Unity - PullRequest
1 голос
/ 09 мая 2019

Мне нужно найти решение для оперативного исправления сборок игры после их выпуска, чтобы пользователям не приходилось переустанавливать весь .apk / .IPA на своих устройствах, и, тем не менее, патч применяется, если это новая сборка.на удаленном сервере.Следовательно, только обновленные сценарии и ресурсы пропатчены, а не вся сборка перезагружена и переустановлена.

Так что я какое-то время искал "Конвейеры сборки после выпуска", "Автоматические механизмы исправления »,« Hot Fix / Patch »и т. Д. Я обнаружил некоторые активы в магазине активов:

1. PATCH - Ультимативная система исправления [ПОЛНАЯ]

2. Система автоматической установки кофе

3. Final Patch - Hot Update Pro

Проблема существует со всеми этими:

  1. Они либо не поддерживаются для iOS/ Android или;
  2. Они исправляют только изменения активов, используя пакеты ресурсов, и не исправляют скомпилированные сценарии .

Я натолкнулся на два предложенных решения.который я понятия не имею, будет ли он работать или нет:

  1. Интерпретация сценариев во время выполнения с использованием скомпилированных сценариев в качестве текстовых активов внутри пакетов ресурсов (поскольку они не поддерживают изменения сценариев) и использование чего-то вроде MoonSharp для компиляции среды выполнения.
  2. Использование пользовательских пакетов ресурсов с обновленными сценариями для импорта в игру.

Я открыт для любых решений, ресурсов / плагинов /инструменты предложения.Заранее спасибо.

1 Ответ

0 голосов
/ 13 мая 2019

Загрузка других ресурсов, кроме скомпилированного кода, возможна с помощью методов класса AssetBundle: https://docs.unity3d.com/ScriptReference/AssetBundle.html

Теперь о возможностях исправления кода на мобильных устройствах:

На перекомпиляции во время выполнения iOS, изменение собственного кода или испускание кода (например, Reflection.Emit) запрещено, фактически ядро ​​не позволяет этого.Поэтому попытка использовать такие вещи, как функция C # компилятор как услуга, не будет работать.Вероятно, это причина того, что PATCH не поддерживается на мобильных платформах.

С другой стороны, возможно использование intepreter (например, Moonsharp), но для этого потребуется несколько крепких орешков:

  • Выполнение интерпретатора в главном потоке в Unity сильно замедлит его.Я сам провел пару тестов производительности, и MoonSharp по крайней мере в 100 раз медленнее, чем нативные вызовы в IL2CPP, и производит приличное количество garbadge, которое gc придется время от времени чистить.Это может быть все еще хорошо, если вы не планируете делать высокоскоростной FPS и делать самую важную логику родной.Вы должны будете выбрать, что это за логика или как распараллелить выполнение вашего скрипта.

  • Чем больше возможностей вы дадите сценариям, выставляя внутренние типы, тем больше будут риски для безопасности,Особенно в отношении ввода / вывода.Вы уверены, что хотите взять на себя ответственность за то, что кто-то похитил интерпретатор lua в вашем приложении?

  • Конфликт попыток ускорить выполнение ваших скриптов с использованием нескольких ядер и Unity не является нитью-безопасность также может быть одной из тех вещей.Очередь действий или шаблон прерывателя (https://github.com/disruptor-net/Disruptor-net) может помочь вам с перенаправлением команд в основной поток.

  • Больше вещей, о которых я не могу думать сейчас, ноэто определенно есть.

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

...