![]() |
|
||||||||||
|
|||||
|
Всем привет.
У меня такая беда: создаю в игре бекграунд программно. Использую метод http://xitri.com/2009/06/24/dynamic-...lash-game.html (генерируется штук 300-400 мувиков, распределяется по экрану, применяются фильтры, а когда готово - всё это перегоняется в битмапу и уже битмапа - добавляется одним мувиком. Все остальные - удаляются.) Делаю это функцией bg. И когда идёт к ней обращение, вся флешка на пару секунд подвисает. Выглядит это так: нажимает пользователь на кнопку "Играть", пару секунд ничего не происходит, а потом появляется уровень: с графикой, музыкой и собственно уже игрой. Курсор, при этом, остаётся в виде руки (наведение на кнопку), т.е. всё конкретно подвисает. Хотя, если идти по логике выполнения, там успевает удалиться экран с меню, и добавиться мувик с игрой, в который, собственно, в это время генерируется и бекграунд, который всё и подвешивает. Вопрос, собственно, заключается в следующем: как можно убрать эту бешеную нагрузку на флеш и сделать чтоб после нажания появлялась иконка загрузки (крутилась), а в это время - генерировался бы бекграунд? Я так понимаю, нужно каким-то образом распределить ресурсы между обработкой кода и графики во флешке? |
|
|||||
|
Цитата:
Да, нужно разбивать загружаемые данные на порций и между загрузками, давать флеш плееру отрисовывать промежуточные кадры.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Как это делается? Пример кода или ссылки на записи или статьи дайте, пожалуйста.
|
|
|||||
|
Для начала, замерьте, какие участки загрузки - самые толстые. Измерить можно с помощью getTimer():
var time:Number = getTimer(); // Big loading resources 1 trace('Loading 1, duration:', getTimer() - time); time = getTimer(); // Big loading resources 2 trace('Loading 2, duration:', getTimer() - time); time = getTimer(); // ... Один из вариантов, это последовательный вызов функций, достаточно ламерский способ: Хорошим способом, будет подписать порций загрузки к enterFrame или лучше к таймеру. Определённым образом спроектировать игру. Это довольно сложно.
__________________
Дети не должны знать о своих родителях Последний раз редактировалось Tails; 22.10.2013 в 11:14. |
|
|||||
|
Tails, боюсь способ, описанный вами - не подойдёт - я ничего не загружаю (или я чего-то не понял).
Вот функция: private function createTextures(m:MovieClip):void { var bm:MovieClip; // заполняем первый этаж "мусором" for (var i:int = 1; i < 300; i++) { bm = new bgSpot01; place(bm,"bg"); m.addChild(bm); bm = new bgSpot02; place(bm,"bg"); m.addChild(bm); } var v:int; for (i = 1; i < 800; i++) { v = 1+Math.random()*4; if(v==1) { bm = new bgStone01; } if(v==2) { bm = new bgStone02; } if(v==3) { bm = new bgStone03; } if(v==4) { bm = new bgStone04; } place(bm,"stone"); m.addChild(bm); } for (i = 1; i < 50; i++) { v = 1+Math.random()*3; if(v==1) { bm = new bgGrass01; } if(v==2) { bm = new bgGrass02; } place(bm,"grass"); m.addChild(bm); } var bmpd:BitmapData = new BitmapData(Gbv.SCR_W,Gbv.SCR_H,true,0); bmpd.fillRect(bmpd.rect,0); bmpd.draw(m,new Matrix(1,0,0,1,m.x,m.y)); var bmm:Bitmap = new Bitmap(bmpd); while (m.numChildren) { m.removeChildAt(0); } m.addChild(bmm); } Т.е. просто одновременно на экран добавляется где-то около 2000 мувиков, которые ещё к тому же и нарисованы в векторе. Это ресурсоёмко. Это и хочу как-то разбить, распределить нагрузку так, чтоб можно было в это время, хотя бы, крутить колёсико "загрузки". |
|
|||||
|
Словом "загрузка" я обозначил ресурсоёмкий и длительный по выполнению участок кода.
Перечитайте способ ещё раз, там ответ на ваш вопрос. Ещё для ознакомления, можете почитать Мука, тему про запланированные обновления экрана. В этой книжке стр. 653
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Цитата:
Очень красиво получилось на мой взгляд ![]() |
![]() |
![]() |
Часовой пояс GMT +4, время: 05:54. |
|
|
« Предыдущая тема | Следующая тема » |
|
|