Куток

Обкладинка для допису Пригоди розробника ігор 1 - Оптимізація сцени та зворотня сумісність
Alex Radchenko
Alex Radchenko

Додано

Пригоди розробника ігор 1 - Оптимізація сцени та зворотня сумісність

Маємо f2p гру Misland яка вийшла приблизно рік тому, зроблена на рушії Defold
Гра робилась в першу чергу під web платформу, тому має специфічні вимоги до перфомансу.

З'явилось натхнення оптимізувати деякі моменти з перспективою додати контенту.

Misland має лінійну прогресію, потрібно гріндити ресурси та будувати.
Дія відбувається на островах, острова закриті для гравця мостами які він може побудувати відкривши нові ресурси та виробництва.

Image description

Image description

Задача

Гра досить помітно тормозить на слабких телефонах, до того ж довго завантажується що знижує 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)

Куток

Підписуйтеся на наші соціальні мережі:
Telegram
Twitter
Facebook


Тепер у нас також є Youtube канал!