Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопросы оптимизации игры (http://www.flasher.ru/forum/showthread.php?t=129064)

enepx 24.08.2009 08:05

Вопросы оптимизации игры
 
Привет всем,
мы создаем мультиплеер-файт игру. У меня есть пара общих вопросов по оптимизации:

1. Загрузка ресурсов (раскадрованные PNG одинакового размера по ширине и высоте). Игрок настраиваемый, т.е. состоит из разных частей, каждая из которых отдельный PNG файл с прозрачностью. Композиция частей это обычное наложение в нужном порядке, например: тело (1), волосы (2), шорты (3) и т.д. Сейчас мы имеем 12 действий игроков (действие - это набор фреймов (не флешевых :) ), фрейм - набор PNG файлов) по 4 части в каждом (тело, волосы, шорты, футболка), получается 908 PNG-файлов.
Я реализовал так, что все эти файлы грузятся последовательно, но хоть они небольшие, получается очень-очень долго :( раз в 5-10 медленне, чем один файл.
Заказчик предоставляет ресурсы в PNG файлах, все действия и части описаны в XML, который отдает сервер. Относительно этих XML я формирую пути для загрузки PNG-файлов. Понимаю, что запихать все в одну SWF-библиотеку было бы выходом, но потеряем гибкость. Что можете посоветовать по этому поводу?

2. 908 PNG файлов занимают чуть более 1 Гб в оперативной памяти :(
Фрейм я делаю так: Bitmap, в него я отрисовываю (draw()) DisplayObjectContainer, который содержит битмапы PNG. Думал, что это самый оптимальный способ. Но я так думаю, что эти PNG продолжают висеть в памяти, а мне нужно хранить лишь композицию этих PNG, т.е., например, вместо 4 PNG (тело, волосы, шорты, футболка) хранить одну (одетый волосатый чувак с телом). Что можете посоветовать по этому поводу тоже?

Заранее спасибо за помощь! :victory:

Добавлено через 45 минут
Еще про пункт (2):
Сейчас я делаю примерно так:
Код AS3:

var container:Sprite = new Sprite();
var element:DisplayObject;
 
for (var i:uint = 0; i < _loader.getBinariesArray().length; i++) {
        element = _loader.getBinariesArray()[i];
        container.addChild(element);
}
 
var bmpData:BitmapData = new BitmapData(GlobalSettings.CHARACTER_IMAGE_WIDTH, GlobalSettings.CHARACTER_IMAGE_HEIGHT, true, 0);
bmpData.draw(container);
bitmapData = bmpData;

Мне кажется, что у меня element, в котором PNG, хранится очень долго, они ведь мне не нужны, мне нужна лишь БитмапДата.
Вызов GarbageCollector не помогает.

etc 24.08.2009 09:20

Не надо грузить png по одному, надо грузить либу с картинками.
И да, пока у вас в коде такие ужасные циклы, говорить о производительности не приходится.

enepx 24.08.2009 09:25

Про циклы - понял, спасибо.
Но я не смогу грузить либу, как можно будет пачкой загрузить оттуда 908 картинок? Это поможет в экономии памяти или только в скорости загрузки?

etc 24.08.2009 09:45

Поможет и в памяти и в особенности скорости загрузки.

enepx 24.08.2009 09:53

Про скорость загрузки это понятно на 100%.
Про память, я сделал оптимизацию в 5(!) раз, теперь вместо 1100Мб, всего 250Мб в памяти ест. Я просто сделал BitmapData.dispose() ненужным PNG (отдельным частям игрока). Ура! :)

iflamberg 24.08.2009 14:34

делайте не секвенцию png, а avi с прозрачностью. Можно выиграть неплохо в размерах.

Dezar 24.08.2009 14:40

Цитата:

делайте не секвенцию png, а avi с прозрачностью. Можно выиграть неплохо в размерах.
и сильно потерять в качестве(пиксели полезут).

у меня такая же беда была..я вышел из ситуации тем..что оптимизировал пнг(до импорта)
вместо 30 кб(к примеру) 1 пнг весил 5 кб.
потрея качества конечно была..НО..елезаметная...просто отсеиваются цвета,которые нам не нужны.

+ благодаря ухудшение качества..игра стала куда быстрее...

wvxvw 24.08.2009 16:10

ИМО, самым практичным было бы наделать несколько библиотек, к примеру, разделить по персонажам. Все ПНГ относящиеся к одному персонажу - запихать в 1 ПНГ файл, а потом его же импортировать во флеш (чтобы сразу использовать уже конвертную флешевую битмапдату, а не конвертировать на ходу). Возможно, практичнее будет не 1 персонаж = 1 файл, а по движениям разбить... надо уже смотреть по обстоятельствам.
Ну и соответственно, не компилировать картинки Флексовым компилятором... у флеша и опций больше, и файлы меньшими получаются.

enepx 24.08.2009 16:20

Так сгруппировать не получится, потому что понятия персонажа как такового нет, есть объекты: тело, волосы, очки, трусы и т.д. У каждого обыекта есть свой тип, например, красные трусы, синие трусы, розовые трусы и т.д. Каждый тип - это набор PNG. Можно сделать отдельную либу на каждый тип каждого объекта.
Частичное решение проблемы - это кэш браузера, после первого раза все грузится довольно быстро.
Еще придумал решение - ZIP-файл, благо либы для этого есть.

Dezar 24.08.2009 16:21

в таком случае если в игре будет одновременно 5 разных игроков..суть не изменится..
выше описанный вариант хорош, если играют 5 персов одной масти и одинаково одетые.так как мы будет грузить 1 флэшку, а потом ее дублировать

enepx 24.08.2009 16:23

у меня ровно 2 игрока, составленных из разных объектов разных типов.

wvxvw 24.08.2009 16:30

Ну вам виднее, как сгруппировать.

Dezar 24.08.2009 16:53

Цитата:

у меня ровно 2 игрока, составленных из разных объектов разных типов.
я имел ввиду 2перса абсолютно одинаковых.

мои вам совет.
ухудшите качество(убейте лишние пиксели) в пнг+уменьшите раскадровку...
я использовал 15 кадров анимации изначально.
потом дошел до 8.
вес файла удара был 35 кб(грубо)

enepx 24.08.2009 16:56

Спасибо, все буду пробовать попозже, на данном этапе (начальная разработка) пойдет как сейчас, потом, думаю, добавлю ZIP-архивы с PNG-файлами вместо SWF.

BlooDHounD 24.08.2009 16:58

enepx, что бы весило побольше, парсилось подольше и обрабатывалось потруднее?

enepx 24.08.2009 17:01

Цитата:

Сообщение от BlooDHounD (Сообщение 845212)
enepx, что бы весило побольше, парсилось подольше и обрабатывалось потруднее?

сдаюсь, что же? :taunt:

random13 24.08.2009 17:11

zip-архив

enepx 24.08.2009 17:14

ZIP будет парситься намного быстрее, чем скачка кучи файлов. Запаковать и закачать ZIP админу будет намного проще, чем сделать SWF-либу.

random13 24.08.2009 17:16

парсится быстрее чем что???? если swf или swc то нет а если кучка отдельных файлов то наверное да)) меньше запросов прежде всего

Добавлено через 2 минуты
а по хорошему можно вообще сделать как правильные версталы делают: простыню из спрайтов ну и плюс для того чтоб это хорошо работало какой нить небольшой xml или массивчик с указанием последовательности в данной простыне

enepx 24.08.2009 18:05

Имел в виду, что парсится быстрее, чем кучка :) Про SWF вопросов нет.
Простыня - выход, но у меня уже есть 908 файлов, и их уже вряд ли кто-то переделает.

random13 24.08.2009 18:09

ну тогда да, тем более раз 908 файлов, вряд ли они у тебя по 1 пикселю, я конечно не помню спецификации png но он помойму тож по разрешению ограничен, так что действительно не выход

BlooDHounD 24.08.2009 19:40

я к тому, что глупо смотреть с торону зипа, когда под рукой есть swf, который между прочим тоже зипуется сам по себе.

enepx 24.08.2009 19:42

как я буду добавлять большие массивы файлов в swf в одно касание?

dimarik 24.08.2009 19:53

jsfl.

BlooDHounD 24.08.2009 20:46

или взять CS4, взять нужные файлы перетащить в библиотеку, и одним касанием проставить линкэдж совпадающий с именем файла.

etc 24.08.2009 21:32

Цитата:

Сообщение от BlooDHounD (Сообщение 845283)
или взять CS4, взять нужные файлы перетащить в библиотеку, и одним касанием проставить линкэдж совпадающий с именем файла.

Угу, раза три испортив либу из-за глюкавости CS4. :quiet:
Но всё быстрее, чем ручками.

BlooDHounD 24.08.2009 22:03

ну я пока ни разу не сломал.

etc 24.08.2009 22:10

Цитата:

Сообщение от BlooDHounD (Сообщение 845294)
ну я пока ни разу не сломал.

А ты кнопки дави сильнее! :D

Котяра 25.08.2009 15:54

Цитата:

Сообщение от enepx (Сообщение 845264)
как я буду добавлять большие массивы файлов в swf в одно касание?

вот скриптик:
http://www.flasher.ru/forum/showpost...35&postcount=3

random13 25.08.2009 16:14

дааа действительно вариант, не знал про такую штуку, очень логичное и хорошее решение, явно лучше чем zip

enepx 17.09.2009 22:34

опять проблема
 
Привет.
Я переписал всю структуру под загрузку SWF, на данном этапе у меня получилось 48 SWF-библиотек. В SWF-ке у меня только наборы сжатых PNG-шек, которые экспортируются как BitmapData.
Теперь у меня почему-то очень сильно расходуется память :( Думаю или из-за того, что у меня где-то висит BitmapData ненужная (мне не нужны эти BitmapData из этих SWF, я их использую для только один раз для отрисовки многослойного изображения) или из-за того, что SWF'ки продолжаю висеть в памяти. Вообще, все 48 SWF весят менее 5Мб, а в памяти получается более гигабайта :(
Как посоветуете корректно выгрузить их из под FP9?

P.S. Дальше будет только больше SWF, ибо кол-во слоев (элементов) будет только расти.

wvxvw 17.09.2009 22:51

Взять профайлер и посмотреть что занимает сколько памяти.

enepx 17.09.2009 22:58

Цитата:

Сообщение от wvxvw (Сообщение 851666)
Взять профайлер и посмотреть что занимает сколько памяти.

Дайте наводку что это, я такого никогда не использовал. Это с FDT заработает или без разницы? Щас попробую сам найти.
Спасибо.

wvxvw 17.09.2009 23:09

Я не знаю, есть ли в ФДТ профайлер... но он есть в билдере. У билдера триал 2 месяца... так что я думаю, для решения одноразовой задачи должно хватить :)

enepx 17.09.2009 23:26

Чего-то я уже перестаю думать, в Омске ночь давно.
Может кто-нить знает про FDT + Profiler? Завтра попробую FB.

etc 18.09.2009 02:03

Профайлер в FDT, как и дебаггер в текущей доступной версии не работают. Во всяком случае у меня.

enepx 18.09.2009 05:06

Цитата:

Сообщение от etc (Сообщение 851713)
Профайлер в FDT, как и дебаггер в текущей доступной версии не работают. Во всяком случае у меня.

Ок, я думал, что только у меня не работает дебаггер :quiet:

morgenshtern 18.09.2009 05:14

Цитата:

Сообщение от enepx (Сообщение 845264)
как я буду добавлять большие массивы файлов в swf в одно касание?

Напиши скрипт (бат/шел, смотря где swf собираешь), который обходит папки с картинками и формирует swfml.
После чего компилит swf.
И быстро, и удобно, и, главное, бесплатно.
И действительно в одно касание.

enepx 18.09.2009 07:04

Доброе утро,
профайлер показал, что всю память "едят" BitmapData из подгружаемых SWF.
Вопрос: можно ли как-нибудь после того, как я создал экземпляр BitmapData из подгруженной SWF сделать ее dispose()? Точнее dispose() экземпляру я как раз делаю, можно ли как-нибудь выгрузить SWF-ки?
Возможно, я не так понимаю.

Добавлено через 1 минуту
Цитата:

Сообщение от morgenshtern (Сообщение 851730)
Напиши скрипт

Спасибо, я пока сделал все либы вручную.
Как понадобится обязательно попробую эти скрипты, я так никогда не делал :umnik2:

Добавлено через 1 час 47 минут
Все, ребята, разобрался откуда были ненужные экземпляры. Я когда добавлял в FLA картинки, то делал Add to Stage..., а потом с поля не удалял. Теперь даже файлы обрабатываются раза в 2 быстрее, а все весит в 5 раз меньше.
Только на утро дошло!
Всем спасибо.

Котяра 18.09.2009 10:47

ссылка на тему оптимизации игр - обрезка и склейка простыней:
http://www.flasher.ru/forum/blog.php?b=111


Часовой пояс GMT +4, время: 22:23.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.