Як стиснути ігровий кадр за допомогою анімації кадрів до мінімуму на диску


19

Я розробляю таку гру, як Епоха імперії (будівлі на карті), і для кожної будівлі маю спрайтовий аркуш для її анімації. Я використовую кадр за кадром для анімації будівлі (не знаю жодного іншого способу). Зауважую, що папка моїх ресурсів стає надзвичайно великою завдяки зображенням, які я розміщую в ній.

Як такі ігри, як CoC та Age of Empires, зберігають розмір apk до 50 Mg? Чи щось мені тут не вистачає, коли мова йде про розвиток ігор

Дякую

EDIT: Більше інформації про проблему, з якою я стикаюся

У мене багато об’єктів анімаційних малюнків. Я вибрав цей шлях, тому що це був найшвидший і він давав результати, які я хочу. По суті, кожна будівля - це анімація, яка складається з 8 файлів (8 зображень = 8 файлів). Усі вони є PNG завдяки прозорості. Оскільки у мене понад 200 зображень, розмір apk становить 120 Мб (і я ще не зробив копіювання половини файлів). Ось що підкаже, має бути спосіб вирішити це. Допоможіть іншим розробникам


Стиснення зображень або відокремлення ігрового вмісту від apk може бути те, що ви шукаєте.
János Turánszki

Ви маєте на увазі файли розширення? Проблема в тому, що файли розширення не мають папок для малювання різної щільності. Це те, що роблять ігри? Я роблю кадр за кадром анімації (повне зображення зображення). Або я зовсім не в тому шляху
Змія

На всякий випадок я намагаюся допомогти і поставив відповідь, що стосується економії місця для ваших зображень. Однак ваше запитання заплутане: незрозуміло, чи хочете ви насправді знати такі прийоми, як "пов'язані з тим, як такі ігри, як CoC та Age of Empires, зберігають розмір apk менше 50 Mg?" або якщо ви хочете просто перевірити, чи є менше анімованих способів анімації, які прослуховують дисковий простір (як підказує ваша назва). Будь ласка, уточніть, тому я можу видалити свою відповідь, якщо це так, а також ви зможете отримати більш точні відповіді.
MAND

@MAі я відредагував свою відповідь, щоб далі подумати над проблемою
Змія

2
Для Age of Empires це, мабуть, комбінація низької роздільної здатності (IIRC розроблена для 640x480) та індексованих зображень (не повний RGB).
користувач253751

Відповіді:


24

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

Отож, я відповім цю відповідь тут, намагаючись бути корисною щодо економії місця, коли у вас багато зображень. Якщо вас цікавить лише техніка анімації, яка може допомогти вам економити місце на диску, будь ласка, повідомте мене, тоді я можу видалити відповідь.


Це означає, що в подібній ситуації я бачив (і використовував один раз) два рішення з точки зору економії місця на диску:

1) об'єднати окремі образи всередині одного і того ж зображення. Іноді це може допомогти. Отже, замість того, щоб зберегти 4 окремих файли для кожного з наступних кольорових квадратів, я зберігаю всі вони поруч у межах одного зображення (і розділяю їх лише за допомогою ігрового коду):

введіть тут опис зображення

У цьому прикладі збереження кожного у 4 різних файлах PNG становить 1255 байт, тоді як один файл із усіма об'єднаними - 451 байт. Звичайно, наскільки це може допомогти, залежить від конкретного випадку, і вам слід перевірити, чи може це допомогти вам залежно від ваших зображень.

2) для стиснення папки ресурсів. Це часто може бути дуже корисним для економії місця на диску. Тоді, коли гра запускається, ви або розпаковуєте або витягуєте потрібне зображення зі стисненого файлу - залежно від формату стиснення, який ви використовуєте. Дивіться цю минулу відповідь, яка стала вікі цього сайту: /gamedev//a/37649/72423

Але також пам’ятайте, що кожен тип стиснення може бути більш-менш вигідним, залежно від типу файлу зображення, який ви використовуєте : уникайте подвійного стиснення ресурсів

Детальніше про стиснення: сучасне стиснення зображення?


Нарешті, вам також може бути цікаво подумати, які типи зображень використовувати для кожної ситуації: який формат зображення є більш ефективним для пам'яті: PNG, JPEG або GIF?


Спасибі за інформацію. Дивно, що вам вдалося розрізати розмір файлу навпіл, помістивши речі в один файл. Я подумав наприкінці дня, це та сама кількість пікселів та використаний простір. Я відредагував своє запитання для кращої відповіді
Змія

@Snake Отже, згідно редакції, яку ви зробили, я думаю, що моя відповідь справді може бути корисною. Об’єднання зображень + стискання може зменшити розмір вашої папки на величезну кількість. Обидві методики регулярно використовуються в деяких видах ігор. Щодо конкатенації, це завжди дивовижна хитрість. Спробуйте самостійно: покладіть зображення з послідовності однієї анімації вашої поруч і порівняйте кінцевий розмір із сумою окремих зображень. Тоді ви можете побачити, чи це допомагає у вашому випадку. Що стосується стиснення, для PNG файлів він має тенденцію бути менш ефективними, але все ж варті того , щоб скоротити розмір вашої останньої папки
MAND

@ Зрозумійте одне спостереження, проте: об'єднання іноді не варто або навіть збільшує остаточний розмір крихітного шматочка. Але часто це може призвести до бажаного зменшення. Все залежить від ваших зображень
MAND

Пам’ятаю, спробували і техніку, і зниження було менше 10%. Я точно знаю, що стиснення не має значення з PNG, але я спробую об'єднати. Ось чому я запитав, як це роблять інші ігри, тому що, очевидно, у них набагато більше графіки, ніж у мене
Snake

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

9

Я б запропонував спробувати TexturePacker

  • ви можете просто перетягнути всі свої зображення та упакувати їх
  • Ви можете застосовувати різні стиснення - наприклад, використовувати індексовані PNG, які споживають набагато менше пам'яті - до 70% менше порівняно зі стандартним файлом PNG
  • ви можете створити файли даних файлів, які містять ім’я + положення кожної вашої будівлі
  • безкоштовної версії вже може бути достатньо для створення спрайтових аркушів для вас

Ви використовуєте рамки для розробки ігор, як AndEngine, Cocos2d-x або LibGdx? => Немає

Чи потрібні всі ваші зображення завантажені одночасно? Це здається, що у вас виникнуть великі проблеми з оперативною пам’яттю на цільових пристроях.


Оновлення: Змія надіслала мені кілька зображень. Як було обіцяно, тут вони не будуть оприлюднюватися, тому я створив собі мистецтво, щоб продемонструвати, як зменшити використання пам'яті.

У оригінальному зображенні рухалася лише одна частина зображення. Я помістив птицю на будинок, щоб продемонструвати це:

введіть тут опис зображення

В основному упаковка цілої анімації в аркуш - це велика трата пам’яті. Ви повинні розділити статичні та рухомі частини:

Статичний:

введіть тут опис зображення

Anim01:

введіть тут опис зображення

Anim02:

введіть тут опис зображення

Зберігайте початкове положення птаха на зображеннях . Ось чому вище такого порожнього простору. Це вам потрібно для вирівнювання анімації.

Тепер перетягніть зображення на TexturePacker і виберіть наступні параметри

  • Формат даних: хеш JSON (або XML, якщо ви бажаєте цього)
  • TrimMode: обрізка (це створює прямокутники)
  • Формат пікселів: INDEXED 8bit - для створення 8-бітних PNG (приблизно на 70% менше пам'яті)
  • Дозволити обертання: помилково
  • Введіть ім'я файлу для даних

TexturePacker упаковує зображення

У результаті ви отримаєте 2 файли: спрайтовий лист та файл опису JSON.

"house_anim_01.png":
{
    "frame": {"x":351,"y":246,"w":110,"h":79},
    "rotated": false,
    "trimmed": true,
    "spriteSourceSize": {"x":67,"y":8,"w":110,"h":79},
    "sourceSize": {"w":400,"h":400},
    "pivot": {"x":0.5,"y":0.5}
},

Важливими частинами є кадр і spriteSourceSize .

Кадр дає розташування вихідного спрайту в спрайт листа.

spriteSourceSize дає зсув для малювання зображення - частини зображення, які залишилися поза обрізкою:

Простий розпорядок малювання псевдокодом виглядає так:

drawImage(spritename, posX, posX)
{
    data    = sheetData[spritename]
    offsetX = data.spriteSourceSize.x
    offsetY = data.spriteSourceSize.y
    frameX  = data.frame.x
    frameY  = data.frame.y
    width   = data.frame.w
    height  = data.frame.h
    screen.draw(sheetImage, posX+offsetX, posY+offsetY, width, height)
}

Можливо, вам доведеться скорегувати розрахунок зміщення залежно від точки зведення / початку в графічній системі. Звичайна схема передбачає систему координат, походження якої вліво вліво.

Потім просто намалюйте будинок за 2 проходи:

draw("background", 100, 100);
draw("anim_01", 100, 100);

Не потрібно дбати про компенсації - оскільки зображення вже вирівняні.


+1 за спостереження про використання оперативної пам’яті, яке інші люди ігнорують
Ден Халм

@Andreas Я перевірю це. Дякую. Не смійся з мене, але я не використовую двигун. В основному це робиться за допомогою анімації та малюнків, і це працює як шарм. Я не завантажую всі зображення в пам'ять, не маючи інших помилок. Він просто завантажує зображення, необхідні для відображення на даний момент .. Ви вважаєте, що вищенаведена пропозиція буде працювати зі стандартним Android SDK?
Змія

1
Так це буде. TexturePacker має 2 режими для обрізки спрайтів: Прямокутники та багатокутники. Якщо ви використовуєте ізометричні зображення, ви можете отримати велику перевагу від багатокутних сіток з точки зору упаковки. Питання в тому, чи вдалося б ви намалювати текстуровані трикутники - або прямокутники за допомогою маски. Якщо це не так, ви все одно можете використовувати прямокутники. Ви можете надіслати мені деякі ваші зображення, якщо ви хочете скористатися папкою "Надіслати" та надіслати посилання на -> підтримку на codeandweb. ком. Я не буду їм ділитися - просто цікаво подивитися, що ми можемо зробити для покращення упаковки.
Андреас Льов

@ AndreasLöw Мені так шкода, що я не отримав повідомлення про ваш коментар. Я щойно це побачив. Я дуже буду вдячний за допомогу. Я надішлю вам щось, і, можливо, ви зможете пролити світло на те, що я повинен. ..кінда зациклюватися на чомусь, що я маю на увазі, і, можливо, ти можеш пролити світло. Я зв’яжуся з вами незабаром
Змія

7

Ось кілька покажчиків, якими ви можете скористатися

  1. Спробуйте переконатися, що всі фонові та непрозорі зображення не у форматі PNG
  2. Постарайтеся, щоб усі анімаційні цикли вміли, тобто якщо анімація 1,2,3,4,5,6, спробуйте зробити так, як 1,2,3,4,3,2,1, де ці числа - номер кадру анімації, це дуже допомагає
  3. якщо багато зображень однакові і відрізняються лише кольори (як правило, кнопки інтерфейсу користувача, анімація частинок, ігрові монети), спробуйте зробити одне біле зображення та змінити його колір динамічно
  4. Спробуйте зробити свій .apk лише тими зображеннями, які є надзвичайно важливими, а потім завантажте все з сервера і зберігайте в пам'яті телефону

Сподіваюся, ці покажчики допоможуть

PS Я даю лише узагальнене уявлення, оскільки я не знаю вашого точного вмісту гри та вибачення, якщо ці вказівки не корисні


Ви також можете: 1) стиснути всі свої зображення 2) використовувати плитки якомога частіше 3) конкретизувати зображення на більшому зображенні та використовувати це як карту для текстурування
Ентоні Раймондо

Це чудові пропозиції. Дякую. Я думаю, що найважливіший момент - це 4. Однак якщо це так, то як я їх розміщую в різних папках, що малюються, і посилати їх на зразок R.dravable.image1? Ось де я плутаюсь
Змія

4

Багато ігор не зберігають свої графічні активи в .apk; вони включають лише такі основи, як графіка інтерфейсу користувача та ігровий код, а решту активів завантажують після встановлення гри. Особливо це стосується ігор, які використовують різні графічні ресурси залежно від роздільної здатності дисплея, щоб у .apk не було необхідності містити як низькі, так і високочастотні активи.

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


У мене немає проблем із отриманням графіки з сервера (або навіть з файлами розширення), але як їх помістити в папку, що виводиться, щоб я міг посилатися на них R.dravable.x Оскільки більшість моїх (багато багатьох) xmls посилаються на них за допомогою R .dravable
Змія

AFAIK, ти не можеш. Одним із варіантів є збереження хеш-таблиці файлових імен ресурсів, пов'язаних з ідентифікаторами ресурсів, і використовувати AssetManager для захоплення файлів на основі цих ідентифікаторів, але вам, можливо, доведеться переробити ваші .xml файли, якщо ви йдете цим маршрутом.
Сандалфут

4

Я зайшов на цей сайт, шукаючи подібне запитання, і справді є кілька хороших ресурсів, вказаних як у відповідях на ваше запитання, так і в інших питаннях.

Вам, мабуть, варто поглянути на 2D-анімацію: анімовані 3D-моделі чи спрайти з анімаційними кадрами? для дебатів про різні види анімації. Це допомогло мені оптимізувати свою гру. Крім того, ви не кажете нам, який API ви використовуєте або який двигун ви використовуєте. Це одне може дуже змінити: Android кадр за кадром PNG анімація

Крім того, майте на увазі, що якщо ви підете шляхом стиснення, можуть бути важливі відмінності між способом стиснення. Зокрема, існує досить багато відмінностей між видами стиснення, і існує певна спеціалізована дискусія щодо того, який маршрут є найбільш підходящим для мобільних пристроїв. Особливо якщо врахувати, що для мобільних пристроїв, використання оперативної пам’яті та відходів процесора для завантаження також є першорядним. Дивіться: http://www.gamasutra.com/blogs/AlexandruVoica/20130419/190833/Why_efficiency_is_key_in_texture_compression_standards_for_mobile_graphics.php?print=1


Дякую Бентон, я насправді новачок у розробці ігор. Я розробив безліч додатків, які ґрунтуються на інструментах / продуктивності. Але жоден з іграми. Тож я роблю свою першу гру, і я не використовую двигун. Я використовую лише AnimationDrawables, і все чудово працює. Саме розмір apk виходить з рук
Змія

Бентон, остання запропонована вами посилання особливо цікава. Дякую за те, що поділилися цим! Переконайтеся, що ви подивитесь на останню з моєї відповіді, яка також торкається питання різного стиснення для різних типів файлів. Насправді, схоже, існують типи стиснення, які краще працюють із уже стислими типами зображень, такими як PNG, або краще з нестисненими типами зображення. Експерименти для кожного випадку - це завжди найкращий спосіб перевірити, що найкраще підходить для кожної ситуації.
MAND
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.