Шаг 1: Аудит и профилирование. Нельзя оптимизировать то, что нельзя измерить. Начните с инструментов. Используйте встроенный в Titanium Studio/CLI профилировщик для анализа потребления памяти и процессорного времени. Для анализа UI-производительности (частоты кадров) на Android включите опцию "Profile GPU Rendering" в настройках разработчика, на iOS — инструмент "Core Animation" в Xcode Instruments. Зафиксируйте ключевые метрики: время запуска приложения (cold/warm start), FPS на сложных экранах, потребление памяти на типичных сценариях. Это будет ваш baseline.
Шаг 2: Оптимизация времени запуска (Startup Time). Холодный старт в Titanium часто страдает из-за инициализации большого количества native-модулей и загрузки тяжелых библиотек (например, Alloy). Действия:
- Отложите загрузку не критичных для старта модулей. Вместо глобального объявления `require('ti.map')`, делайте это лениво, непосредственно перед открытием карты.
- Проанализируйте файл `tiapp.xml`. Уберите из него неиспользуемые модули, разрешения (permissions) и конфигурации.
- Если используете Alloy, проверьте, не перегружен ли файл `alloy.js` или `app/alloy.js` логикой, которую можно вынести или загрузить асинхронно.
- Рассмотрите возможность использования легковесной альтернативы Alloy для простых проектов или перепишите ключевые экраны на "классическом" Titanium API для полного контроля.
- Везде, где это возможно, используйте Web Workers (модуль `ti.worker`) для обработки данных, парсинга JSON, сложных математических расчетов.
- Минимизируйте количество вложенных View. Каждый лишний слой вёрстки (особенно с закругленными углами и тенью) дорого обходится рендереру. Используйте простые структуры.
- Для списков используйте компонент `ListView` вместо старого `TableView`. `ListView` реализует паттерн виртуализации, создавая элементы только для видимой области, что критично для длинных списков.
- Оптимизируйте изображения. Используйте форматы WebP для Android и HEIC/PNG для iOS, уменьшайте физические размеры до необходимых. Не загружайте полноразмерные изображения для иконок в табах.
- Кэшируйте данные и даже простые View, если они используются повторно (например, ячейки списка с сложной вёрсткой).
- Четко следите за жизненным циклом окон и контроллеров. Удаляйте слушатели событий (event listeners) при закрытии окон, используя методы `removeEventListener` или, что лучше, именованные функции.
- Избегайте циклических ссылок между объектами, которые могут помешать сборщику мусора.
- Для работы с большими объемами данных используйте потоковое чтение/запись, а не загрузку всего массива в память.
- Регулярно проводите тестирование с помощью профилировщика памяти, имитируя типичные пользовательские сценарии (открытие/закрытие окон, навигация).
- Внимательно изучите содержимое папки `modules` в корне проекта. Удалите все неиспользуемые native-модули.
- Используйте возможности SDK для включения только необходимых архитектур (например, только `arm64-v8a` для Android вместо всех `armeabi-v7a`, `x86`).
- Применяйте инструменты для очистки ресурсов (например, для Android можно настроить ProGuard/R8, хотя с Titanium это требует осторожности). Удалите неиспользуемые assets (изображения, шрифты).
- Рассмотрите возможность разделения кода на платформенные версии, если логика сильно отличается, чтобы не тащить неиспользуемый код.
Для стартапа эти шаги позволяют значительно продлить жизнь проекта на Titanium, улучшить пользовательский опыт и выиграть время для накопления ресурсов. Конечная цель — либо довести оптимизированное приложение до стабильного состояния, либо спланированный, а не аварийный, переход на React Native, Flutter или нативную разработку с четким пониманием узких мест старой архитектуры.
Комментарии (7)