Маємо f2p гру Misland яка вийшла приблизно рік тому, зроблена на рушії Defold
Гра робилась в першу чергу під web платформу, тому має специфічні вимоги до перфомансу.
З'явилось натхнення оптимізувати деякі моменти з перспективою додати контенту.
Misland має лінійну прогресію, потрібно гріндити ресурси та будувати.
Дія відбувається на островах, острова закриті для гравця мостами які він може побудувати відкривши нові ресурси та виробництва.
Задача
Гра досить помітно тормозить на слабких телефонах, до того ж довго завантажується що знижує C2P(convertion to play)
Рішення
Простого рішення тут бути не може, але маємо очевидну ідею для оптимізації.
Річ у тому, що всі будівлі, ресурси та інші об'єкті вантажаться
одразу з першої секунди гри, а оскільки прогресія лінійна ми можемо спробувати заховати як мінімум ще не відкриті об'єкти на островах
Я згрупував об'єкти по островах і написав логіку яка вантажить їх рівно тоді, коли це потрібно. Це зменшить час на ініціалізацію і підвищить швидкодію, як мінімум до моменту, коли гравець відкриє більше контенту, але отримав наступну проблему.
Проблема
Раніше всі об'єкти були на сцені завжди, тому мали статичні Url's(специфічне для Дефолда поняття, сприймайте його як ID) і по цім урлам інформація про них зберігалась в сейв, а після того як вони мігрували в систему яка їх динамічно створює, Url's стали динамічними
Рішення
Створювати айді в більш прозорий спосіб, тип_будівлі + індекс (більшість будівель має 1 унікальний екземпляр)
Проблема
У старих користувачів скинеться прогрес побудови будівель
Рішення
Тут я пробував різні варіанти, але нічого кращого ніж створити масив де новий ID відповідає старому URL я не придумав 🐒
Але наче працює :)
В коді це виглядає так (це Lua не лякайтесь, мова дуже проста для розуміння):
Якщо інформації про будівлю немає, робимо спробу дістати її по старому Url
if state.buildings[self.id] == nil then
state.buildings[self.id] = try_backwards_compatibility_get(self, self.id)
end
Реалізація функції яка намагається дістати дані з сейву, якщо нічого немає повертає пустив масив
local try_backwards_compatibility_get = function(self, new_id)
local old_id = old_buildings_map[new_id]
if not old_id then
return {}
end
return state.buildings[old_id] or {}
end
Власне це спрацювало, на тестовому телефоні, перфоманс на початку гри виріс у 2 рази
Як це вплине на C2P поки не знаю, треба пофіксити ще пару проблем, які внесло оновлення рушія, протестувати та тоді відправити нову версію гри в реліз
Це мій перший пост "Пригоди розробника ігор", якщо ви дочитали аж сюди і вам було цікаво, дайте будь ласка про це знати лайком чи коментарем, це збілшить шанси появи нових постів про мої пригоди =)
Всі удачі, Alex Radchenko
Топ коментарі (0)