Официальный сайт движения «Москва без Лужкова!»
Главная Новости Москвы Наши новости Популярное
  • Новости
  • Новости
  • ВХОД В ЛИЧНЫЙ КАБИНЕТ
    логин
    пароль
       
    Новости

    Рішення проблеми продуктивності в Flash

    Спочатку робота над грою «Грибник» йшла швидко і прогресивно. Я дуже радів технології Flash благородія її простоті використання, і був сповнений оптимізму. Але пізніше я з жахом виявив, що Flash насилу видає належну кількість кадрів, коли об'єктів стає більше сотні.

    А в грі повинна бути карта розміром 20х20 клітинок, та й ще з кількома шарами. Тобто об'єктів на карті тільки в одному шарі може бути легко до 300 шт. А деякі об'єкти ще і з анімацією, що ще гірше для продуктивності, тому що анімація типу Motion і Shape Tween програмна. А це означає, що кожен кадр не тільки просто рендерится, але і виробляється ще маса розрахунків за межами мого коду для розрахунку проміжних кадрів в MovieClip`ах. І навіть хитрий рендер в Flash, який перемальовує тільки оновлені ділянки екрану - не рятує ситуацію.

    Ось тут - то мій оптимізм трохи згас. Я був засмучений. Невже така чудова технологія, як Flash, годиться тільки для банерів і примітивних ігор !?

    Векторна графіка сама по собі дуже складна штука. Той, хто хоч якось знайомий з векторною графікою, повинен добре розуміти, що всі криві прораховуються складними математичними формулами. А коли справа ще стосується анімації, то там необхідність не тільки в відображенні масиву точок і побудові між ними кривих, але і в пошуку проміжних положень кривих між ключовими кадрами. І такі розрахунки повинні виконуватися не менше 25 разів на секунду для гри. Тобто, виходить, що витрати на розрахунки максимальні, а результат досить посередній.

    Вихід безумовно є - відмовитися від використання векторної графіки, перевівши всі в растрову графіку. З растровою графікою комп'ютера безумовно легше проводити розрахунки і виконувати рендер, так як це всього лише масив пікселів з найпростішої інформацією. Піймавши себе на цій думці я на мить злякався: «це те, чому пішов, до того в результаті і прийшов». І почав уже було уявляти, як я це все буду експортувати в растр, а потім назад збирати MovieClip'и з растровими картинками вручну. Ось тут-то все основні плюси векторної графіки: якість в будь-якому розмірі і мінімум місця для зберігання даних - починають згасати. Але рішення безумовно має бути.

    У Flash є спеціальна опція «cache as bitmap», яку можна встановлювати для окремих кліпів - це означає, що кліп десь в пам'яті зберігається у вигляді растрової картинки і більш не перераховується як векторне зображення. Мої експерименти показали, що це дає приріст продуктивності, але для повного щастя його явно не достатньо. Причина швидше за все в тому, що час від часу ці «кешированниє» кліпи знову оновлюються за рахунок чого можуть виникати гальма. Та й кількість об'єктів як і раніше залишається колишнім, що продовжує викликати проблеми з продуктивністю.

    Зізнатися я практично не знайомий з внутрішньою будовою Flash але в ході практичних експерементів з'ясувалося що для Flash додатки швидше обробляти одну велику картинку ніж безліч маленьких кліпів. Чому це так, я здогадуюся, але описувати не буду, так як це буде нудно і нудно і можливо я взагалі помиляюся в своїх здогадах. Тільки така велика картинка повинна складатися не з маси вкладених кліпів, а з одного великого бітмапами. Простіше кажучи, якщо в грі планується безліч різних об'єктів (кліпів), то їх варто розділити на групи (передній план, задній план, динамічні об'єкти і т.п.), потім один раз їх все «отрендеріть» в один великий бітмапами, який згодом використовувати як задник, а всі оригінальні об'єкти видалити.

    ), потім один раз їх все «отрендеріть» в один великий бітмапами, який згодом використовувати як задник, а всі оригінальні об'єкти видалити

    Зробити растрову картинку з маси кліпів просто. Складаємо все кліпи в тому порядку і черговості як треба, а потім немов фотоапаратом робимо з них знімок в бітмапами, який далі використовуємо як підкладку у вигляді ігрового рівня. Детально про те, як це зробити, дуже добре розказано в прикладі-уроці у хитрих .

    Це все звичайно здорово і настрій моє вже покращився, адже продуктивність такими, що не хитрими способами вдалося підняти майже в двоє. Але проблема до кінця не вирішена, бо левову частку продуктивності як і раніше їсть «векторна анімація». Починаю вже замислюватися про те, а що якщо приблизно так само, але у вигляді масиву растрових картинок зберігати окремі кадри з MovieClip`ов, а потім їх, як в старі добрі часи, виводити в потрібному місці з потрібним кадром. І не встиг я ще цю думку до кінця перетравити, як виявив, що і цей «велосипед» вже винайдений до мене, йому лише треба відрегулювати «педалі» та «сидушку».

    Тобто, простіше кажучи, я знаходжу кілька класів, які цілком вирішують проблему векторної анімації, конвертуючи кожен кадр зазначеного кліпу в масив растрових картинок. Причому реалізовано все так, що в результаті ми отримуємо нащадка MovieClip`а і працюємо з ним як зі звичайним MovieClip`ом, тільки його наповнення повністю растровое.

    Розібравшись з чужим класом, трохи скорегувавши його під себе і навіть виправивши авторські баги (а може бути це були фичи) - я отримав .swf файл з усією ігровий графікою розміром в 460 кб. і при цьому з хорошою продуктивністю. Вузьке місце цього підходу тільки в тому, що після завантаження флешки йде якийсь час, щоб виконати конвертування всієї векторної графіки в растрову. Але це не страшно, в середньому на це потрібно 5-10 сек. Якщо процес конвертації оформити як завантаження флешки, то користувач зовсім нічого не помітить :)

    І тепер я здається розумію чому так мало хороших Flash платформер і будь-яких інших динамічних ігор з картами більш ніж в один екран. Чи не кожен розробник підходить до процесу оптимізації уважно і як правило користується найпростішим рішенням - ділить гру на екрани або намагається використовувати мінімум об'єктів. Про це, судячи з усього, так само не здогадуються і розробники соціальних ігор, тому-що їх гри в більшості дуже моторошно гальмують навіть на хороших комп'ютерах, через що автори можливо втрачають аудиторію.

    Посилання по темі:

    - З вектора в растр
    - тотальна растеризация


    індикатори: Action Script 3 , уроки
    Постійне посилання


     

    Найди свой район!

    Восточный

    Западный

    Зеленоградский

    Северный

    Северо-Восточный

    Северо-Западный

    Центральный

    Юго-Восточный

    Юго-Западный

    Южный

    Поиск:      


     
    Rambler's Top100
    © 2007 Движение «Москва без Лужкова!»