Hello, this is HoneyBadger speaking.
As you may have guessed, this release was all about mobile development. It was a new experience for me, but it turned out to be far less intimidating than expected. Modern Android app development is quite accessible to any programmer - most of the rough edges have long been smoothed out.
In the end, I managed to create a native wrapper for our game with no fewer than three rendering modes. Completely overkill! I’ll be removing all experimental modes soon and rewriting everything for a standard WebView - it handles the job just fine. Still, we had to go through quite a number of beta versions while fixing issues caused by adapting the game to its new environment.
Memory and CPU limitations turned out to be the main challenge. I went through all rendering and game object update operations with a fine-tooth comb. We also had to introduce a platform-specific asset build pipeline earlier than expected. For example, many textures used in Spine animations had to be converted into compressed formats to reduce memory usage.
We also needed to implement a new system for loading and unloading unused assets. This resulted in a three-tier memory management system:
Load all assets into memory for smoother gameplay, at the cost of longer initial loading times.
Load assets on demand (the current default behavior).
Or switch to an aggressive memory-saving mode, unloading everything unnecessary at the earliest opportunity. Naturally, this is the only available option for mobile devices. I also enabled this option by default for PCs with 8GB of RAM or less.
Overall, these changes have also improved the performance of the desktop version (if anyone was even having issues with it).
And of course, there are platform-specific quirks to deal with:
Android constantly tries to kill background apps, but now the game manages to save progress before that happens.
Full UI adaptation for touchscreens will take more time, but the virtual gamepad with auto-hide already covers most needs.
I decided to request as few permissions as possible, so players now choose a specific directory on startup where the game can store its files. This also solved the issue of save files being lost in other potentially accessible storage locations.
For minimum hardware requirements, we used the Redmi 10C as a baseline device, which also served as our main testing platform. You can compare its specs with your own device. Pay special attention to the single-core score - it’s the main bottleneck for our game on mobile.
As you can see, this phone is far from a flagship. Yet even on it, we managed to achieve a stable (if not perfectly smooth) 60 FPS. The device no longer overheats, and the app doesn’t crash due to memory shortages. And we’re not done optimizing yet.
P.S. I’d also like to highlight the heroic effort of our dear friend 워터딥치, who suddenly appeared in the translators’ chat and casually announced that he had translated the entire game into Korean. All five thousand lines. That’s how it goes.
Привет, HoneyBadger на связи.
Как вы уже догадались, этот релиз прошёл под флагом мобильной разработки. Это был новый для меня опыт, но всё оказалось далеко не так страшно. Современная разработка приложений на андроид вполне доступна любому программисту. Все острые углы давно сглажены.
В итоге мне удалось создать нативную обёртку для нашей игры аж с тремя видами рендера. Это было полностью избыточно! Чуть позже я избавлюсь от всех экспериментальных режимов и перепишу всё для стандартного WebView, он вполне справляется. И всё же потребовалось выпустить большое количество бета-версий, во время исправления проблем, вызванных адаптацией игры к новой среде обитания.
Ограничения памяти и процессора стали главным испытанием. Я прошёлся с лупой по всем операциям рендера и обновления игровых объектов. Раньше времени пришлось создавать схему сборки ассетов под различные платформы. Например множество текстур для spine-анимаций пришлось конвертировать в компрессионные, чтобы снизить нагрузку на память.
Также появилась необходимость создать новую схему загрузки и выгрузки неиспользуемых ассетов. Что привело к появлению опции трёхуровневого контроля над использованием памяти:
Загрузить все ассеты в память и увеличить плавность игры, за счёт увеличенного времени первичной загрузки.
Загружать по требованию, как сейчас.
Или перейти в режим жёсткой экономии и утилизировать всё ненужное, при первом удобном случае. Естественно, это единственная доступная опция для мобильных устройств. Эту опцию я так же включил по умолчанию для ПК с 8гб оперативной памяти и меньше.
В конце концов всё это положительно сказалось и на производительности десктопной версии (если у кого-то вообще могут быть с ней проблемы)
И конечно нельзя обойти стороной прочие особенности платформы:
Андроид всегда стремится убить любое приложение в фоновом режиме, но теперь игра успевает сохраниться до того как это произойдёт.
Полная адаптация интерфейсов под тачскрин потребует ещё много времени, но виртуальный геймпад с функцией автоскрытия покрывает большинство нужд уже сейчас.
Я решил что чем меньше прав мы запрашиваем - тем лучше, поэтому игрок при старте выбирает конкретную директорию, к которой у игры будет доступ и где она будет хранить свои файлы. Что также решило проблему утери файлов сохранений из прочих, потенциально доступных приложению, хранилищ.
В качестве образца для минимальных аппаратных требований был выбран Redmi 10C и он же стал основной тестовой платформой. Можете сравнить его характеристики со своими. Обратите внимание на single-core score, это основное бутылочное горлышко для нашей игры на мобильных девайсах.
Как видите, этот телефон мягко говоря не флагман. Но даже на нём нам удалось поддерживать, может и не совсем плавные, но стабильные 60 FPS. Телефон больше не перегревается и приложение не падает от нехватки памяти. А возможности оптимизации ещё не исчерпаны.
P.S. Отдельно хочу отметить героизм нашего дорогого друга 워터딥치즈. Который внезапно ворвался в чат переводчиков и заявил, что перевёл всю игру на корейский. Все пять тысяч строк. Такие дела.
List of changes 0.9.0 version:
add: android; mobile version
add: event; alien abduction
add: localization; full translation into korean (tnx 워터딥치즈)
add: items; multiple throwable items
add: items; random maps rocks
add: input; cheat menu touch zone
add: visual; common endings screen
add: visual; water bottle bust sprite
add: mechanics; damage types basic support
add: system; async user data handling
add: system; compressed textures support
add: system; auto save improvements
add: backward compatibility; safe character images
add: optimization; global asset/memory priority manager
add: optimization; three-level memory management settings
add: optimization; improved culling
add: optimization; disabled updating of game object logic during full-screen blur
add: optimization; remove unneseccary blending/clear render calls
add: optimization; overlay containers idle rendering
add: optimization; window layer idle rendering
add: optimization; map spriteset is a regular container now
add: optimization; remove pixi-picture dependency
add: optimization; spines binary format
add: optimization; prevent background update/render on fullscreen images
add: optimization; clear sound presets duplicates
add: optimization; remove unused sound files
add: misc; additional information option for the fps counter (electron)
fix: event logic; mr. fredricksen door text and lust requirements
fix: event logic; mr. fredricksen events return zoom to default
fix: event logic; cazador scene loincloth/naked handling
fix: event logic; bandits loose scene naked/loincloth partial handling
fix: electron; local config handling
fix: out of bounds; global map
fix: input; scene save input box special keys
fix: input; allow touch outside canvas for event fast forward/msg close
fix: input; FPS counter canvas interactivity
fix: mechanics; obsessive repetition of random encounters
fix: passability; gym event dumbbells/rope stuck
fix: game logic; the lack of ability to use brass knuckles in combat
fix: game logic; memory autosave
fix: visual; missed bust presets
fix: visual; main overlay effect
fix: visual; loincloth map character boots
fix: visual; battle clothing destruction
fix: visual; mr. fredricksen dream spine
fix: visual; battle health indicator status icons offset
fix: visual; shady sands tile map
fix: visual; the busts in some scenes did not remain on screen
fix: visual; shady sands sleep memory lights
fix: backward compatibility; 0.3.6 and below
fix: backward compatibility; problem with patches, especially 0.7.0
fix: misc; missing localization examples
fix: misc; missing troubleshooting readme
fix: misc; launch from network SMB storage
fix: misc; debug report error logging
fix: misc; remove windows build launcher
List of changes 0.9.1 version:
fix: visual; compression artifacts in the alien abduction spine
List of changes 0.9.2 version:
fix: alien abduction scene on android crash
fix: resize during scene loading crash