Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.10.2013, 10:15
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 1  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
По умолчанию Код отключает прорисовку

Всем привет.

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

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

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

Старый 22.10.2013, 10:29
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от ndiezel Посмотреть сообщение
Хотя, если идти по логике выполнения, там успевает удалиться экран с меню
Удалится то он успевает, но изменения на экране появятся только после обновления экрана, которое, произойдёт после выполнения всего кода.

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

Старый 22.10.2013, 10:33
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 3  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
Цитата:
Сообщение от Tails Посмотреть сообщение
Удалится то он успевает, но изменения на экране появятся только после обновления экрана, которое, произойдёт после выполнения всего кода.

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

Старый 22.10.2013, 10:44
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Для начала, замерьте, какие участки загрузки - самые толстые. Измерить можно с помощью getTimer():
Код AS3:
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.

Один из вариантов, это последовательный вызов функций, достаточно ламерский способ:
Код AS3:
// 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 или лучше к таймеру. Определённым образом спроектировать игру. Это довольно сложно.
__________________
Дети не должны знать о своих родителях


Последний раз редактировалось Tails; 22.10.2013 в 11:14.
Старый 22.10.2013, 11:32
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 5  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
Tails, боюсь способ, описанный вами - не подойдёт - я ничего не загружаю (или я чего-то не понял).

Вот функция:
Код AS3:
		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 мувиков, которые ещё к тому же и нарисованы в векторе. Это ресурсоёмко. Это и хочу как-то разбить, распределить нагрузку так, чтоб можно было в это время, хотя бы, крутить колёсико "загрузки".

Старый 22.10.2013, 11:57
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 6  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Словом "загрузка" я обозначил ресурсоёмкий и длительный по выполнению участок кода.
Перечитайте способ ещё раз, там ответ на ваш вопрос.

Ещё для ознакомления, можете почитать Мука, тему про запланированные обновления экрана. В этой книжке
стр. 653
__________________
Дети не должны знать о своих родителях

Старый 22.10.2013, 13:28
ndiezel вне форума Посмотреть профиль Отправить личное сообщение для ndiezel Посетить домашнюю страницу ndiezel Найти все сообщения от ndiezel
  № 7  
Ответить с цитированием
ndiezel
 
Аватар для ndiezel

Регистрация: Mar 2009
Адрес: Из города на Ингуле
Сообщений: 116
Отправить сообщение для ndiezel с помощью ICQ
Цитата:
Сообщение от Tails Посмотреть сообщение
Словом "загрузка" я обозначил ресурсоёмкий и длительный по выполнению участок кода.
Перечитайте способ ещё раз, там ответ на ваш вопрос.

Ещё для ознакомления, можете почитать Мука, тему про запланированные обновления экрана. В этой книжке
стр. 653
Да, сделал, благодарю, тему можно закрывать.
Очень красиво получилось на мой взгляд

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:54.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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