PDA

Просмотр полной версии : Код отключает прорисовку


ndiezel
22.10.2013, 10:15
Всем привет.

У меня такая беда: создаю в игре бекграунд программно. Использую метод http://xitri.com/2009/06/24/dynamic-background-for-flash-game.html (генерируется штук 300-400 мувиков, распределяется по экрану, применяются фильтры, а когда готово - всё это перегоняется в битмапу и уже битмапа - добавляется одним мувиком. Все остальные - удаляются.)
Делаю это функцией bg. И когда идёт к ней обращение, вся флешка на пару секунд подвисает.

Выглядит это так: нажимает пользователь на кнопку "Играть", пару секунд ничего не происходит, а потом появляется уровень: с графикой, музыкой и собственно уже игрой. Курсор, при этом, остаётся в виде руки (наведение на кнопку), т.е. всё конкретно подвисает.
Хотя, если идти по логике выполнения, там успевает удалиться экран с меню, и добавиться мувик с игрой, в который, собственно, в это время генерируется и бекграунд, который всё и подвешивает.

Вопрос, собственно, заключается в следующем: как можно убрать эту бешеную нагрузку на флеш и сделать чтоб после нажания появлялась иконка загрузки (крутилась), а в это время - генерировался бы бекграунд?
Я так понимаю, нужно каким-то образом распределить ресурсы между обработкой кода и графики во флешке?

Tails
22.10.2013, 10:29
Хотя, если идти по логике выполнения, там успевает удалиться экран с меню

Удалится то он успевает, но изменения на экране появятся только после обновления экрана, которое, произойдёт после выполнения всего кода.

Да, нужно разбивать загружаемые данные на порций и между загрузками, давать флеш плееру отрисовывать промежуточные кадры.

ndiezel
22.10.2013, 10:33
Удалится то он успевает, но изменения на экране появятся только после обновления экрана, которое, произойдёт после выполнения всего кода.

Да, нужно разбивать загружаемые данные на порций и между загрузками, давать флеш плееру отрисовывать промежуточные кадры.
Как это делается? Пример кода или ссылки на записи или статьи дайте, пожалуйста.

Tails
22.10.2013, 10:44
Для начала, замерьте, какие участки загрузки - самые толстые. Измерить можно с помощью 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();

// ...

Таким образом, узнаете, какие участки необходимо разбить. Как именно разбить загрузку ваших ресурсов - виднее только вам. Но в любом случае, вам понадобиться подписаться на timer, или enterFrame.

Один из вариантов, это последовательный вызов функций, достаточно ламерский способ:
// Start loading
loadingPart1();

function loadingPart1():void{
// ...
setTimeout(loadingPart2, 1000)
}
function loadingPart2():void{
// ...
setTimeout(loadingPart3, 1000)
}
function loadingPart3():void{
// ...
setTimeout(startGame, 1000)
}
function startGame():void{
// Start Game!
}

Хорошим способом, будет подписать порций загрузки к enterFrame или лучше к таймеру. Определённым образом спроектировать игру. Это довольно сложно.

ndiezel
22.10.2013, 11:32
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);
}


Функция place с каждым мувиком - это ещё дополнительные команды: растягивание мувика, прозрачность, расположение.
Т.е. просто одновременно на экран добавляется где-то около 2000 мувиков, которые ещё к тому же и нарисованы в векторе. Это ресурсоёмко. Это и хочу как-то разбить, распределить нагрузку так, чтоб можно было в это время, хотя бы, крутить колёсико "загрузки".

Tails
22.10.2013, 11:57
Словом "загрузка" я обозначил ресурсоёмкий и длительный по выполнению участок кода.
Перечитайте способ ещё раз, там ответ на ваш вопрос.

Ещё для ознакомления, можете почитать Мука, тему про запланированные обновления экрана. В этой (http://www.books.ru/books/actionscript-30-dlya-flash-podrobnoe-rukovodstvo-618282/) книжке
стр. 653

ndiezel
22.10.2013, 13:28
Словом "загрузка" я обозначил ресурсоёмкий и длительный по выполнению участок кода.
Перечитайте способ ещё раз, там ответ на ваш вопрос.

Ещё для ознакомления, можете почитать Мука, тему про запланированные обновления экрана. В этой (http://www.books.ru/books/actionscript-30-dlya-flash-podrobnoe-rukovodstvo-618282/) книжке
стр. 653
Да, сделал, благодарю, тему можно закрывать.
Очень красиво получилось на мой взгляд :)