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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.06.2016, 16:27
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 1  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
По умолчанию Двойная буферизация, возможно ли?

Доброго!
В игре есть раздражающий момент, у меня большой задний фон и он состоит из нескольких кадров(7 кадров). Во время старта игры происходит загрузка каждого кадра в память (как я понимаю) и я получаю 7 рывков (у меня кадр мувика сменяется через каждые 10 кадров флеша), дальше всё идёт гладко. Но потом, переодически снова эти 7 рывков, после начала игры заново (когда как, чаще всго после того, как сделал перерыв в несколько секунд), ссылку на фон не удаляю, так что GC не должен убивать, да и фон не меняется, просто игрок оказывается в другом месте на этом же фоне. Думал как решить проблему, теперь при старте, до начало игры сделал окно загрузки, в это время как раз полностью проигрывается мувик заднего фона и тормоза при первом старте пропали, но что делать, когда периодически при рестарте игры тормоза снова

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Что ты имеешь в виду под двойной буферизацией здесь?
Твой фон, очевидно, глючит из-за ошибки в коде. Рестарт у тебя не правильно делается, вот и все.
__________________
Ко мне можно и нужно обращаться на ты)

Старый 26.06.2016, 18:39
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 3  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Что ты имеешь в виду под двойной буферизацией здесь?
Твой фон, очевидно, глючит из-за ошибки в коде. Рестарт у тебя не правильно делается, вот и все.
буферизация - это вроде, когда картинка заранее готовится в памяти, но могу ошибаться

Не думаю, что ошибка в коде, у мувика размеры 4к на 2.7к пикселей, состоит из 7 картинок. Тормоза появляются при начале проигрывание этого мувика, пока не пройдут все кадры по очереди, потом всё отлично. Но стоит перестать играть на 20-30 сек и начать сначала, то снова будет ровно столько же тормозов, пока кадры не сменят друг друга. Если сменить мувик на меньший размер или вставить пустой, то проблем нету

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

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Никогда не встречал подобного. У меня анимация из 40 кадров, каждый кадр размером 1024х1024, размер картинки огромный, режу её на кадры и просто меняю bitmapdata у bitmap никаких рывков никогда нет. Аналогичные результаты и с любыми другими размерами, никакая буферизация здесь не нужна.
__________________
Я заклинаю вас действовать иначе.

Старый 26.06.2016, 23:22
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 5  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от Bletraut Посмотреть сообщение
Никогда не встречал подобного. У меня анимация из 40 кадров, каждый кадр размером 1024х1024, размер картинки огромный, режу её на кадры и просто меняю bitmapdata у bitmap никаких рывков никогда нет. Аналогичные результаты и с любыми другими размерами, никакая буферизация здесь не нужна.
при разрешении 1024х1024 проблем нема, если более подробно, то использую несколько таких текструр 4000х2700(есть копии и есть нет), скаут показывает, что тормоза из-за рендера изображения, да я и сам вижу, все скачки точно совпадают, когда должен сменить кадр и ровно один раз, следующие тормоза возникают, после того, как игрок временно перестанет играть или постаивть игру на паузу. Мне кажется, что GC удаляет из памяти все кадры мувика, кроме текущего, а когда снова запускается игра, по новой рендериться. Думаю можно попробовать сделать 7 спрайтов и потом просто менять их глубину отображения(хз как называется), создавая аналог мувика

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

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Какая еще глубина отображения? Просто менять битмапдату у битмап. Баг явно в коде, либо корявой реализации. Никаких рывков не должно быть.
__________________
Я заклинаю вас действовать иначе.

Старый 27.06.2016, 22:48
neonoviiwolf вне форума Посмотреть профиль Отправить личное сообщение для neonoviiwolf Найти все сообщения от neonoviiwolf
  № 7  
Ответить с цитированием
neonoviiwolf

Регистрация: Jun 2014
Сообщений: 558
Цитата:
Сообщение от Bletraut Посмотреть сообщение
Какая еще глубина отображения? Просто менять битмапдату у битмап. Баг явно в коде, либо корявой реализации. Никаких рывков не должно быть.
да как может быть реализация кривая, если я просто добавляю мувик на сцену и он просто играет

Добавлено через 3 минуты
Код AS3:
package classesGame.addActionUnits.addAction
{
	import classesGame.options.OptionsUnits;
	import classesGame.userEvent.UserEvent;
	import flash.events.Event;
	import nape.phys.Body;
	import singleton.sFloor.SFloor;
 
	public class AddActionCover extends IParentCommon
	{
 
		public function AddActionCover()
		{
		}
 
		private var cover1:cover_mc = new cover_mc();
		private var cover2:cover_mc = new cover_mc();
 
		override public function init(e:Event):void
		{
			super.init(e);
 
			stage.addEventListener(UserEvent.START_FLAG_1, userEvent);
			stage.addEventListener(UserEvent.START_FLAG_3, userEvent);
			stage.addEventListener(UserEvent.PAUSE, userEvent);
			stage.addEventListener(UserEvent.PLAY, userEvent);
			stage.addEventListener(UserEvent.EMERGING_WALL, userEvent);
			stage.addEventListener(UserEvent.SHOT_WALL, userEvent);
 
			this.addChild(cover1);
			this.addChild(cover2);
			this.addEventListener(Event.ENTER_FRAME, driveAway);
		}
 
		private function driveAway(e:Event):void
		{
			if (cover1.totalFrames > cover1.currentFrame)
				stage.dispatchEvent(new UserEvent(UserEvent.CREATE_SEGMENT, true, false));
			else
			{
				stage.dispatchEvent(new UserEvent(UserEvent.CREATE_ALL, true, false));
				this.removeEventListener(Event.ENTER_FRAME, driveAway);
				cover1.visible = cover2.visible = false;
			}
		}
 
		private function userEvent(e:UserEvent):void
		{
			switch (e.type)
			{
			case "startFlag1": 
			case "emergingWall":
				this.removeEventListener(Event.ENTER_FRAME, updateCover);
				startFlag1();
				break;
			case "shotWall":
			case "startFlag3": 
				this.addEventListener(Event.ENTER_FRAME, updateCover);
				break;
			case "pause": 
				this.removeEventListener(Event.ENTER_FRAME, updateCover);
				break;
			case "play": 
				this.addEventListener(Event.ENTER_FRAME, updateCover);
				break;
			}
		}
 
		private function updateCoverOffset(e:Event):void 
		{
			cover1.y = cover2.y = bodyFloor.position.y - 2651.4;
		}
 
		private function startFlag1():void
		{
			cover1.visible = cover2.visible = true;
			cover1.gotoAndStop(1);
			cover2.gotoAndStop(1);
			//!!!
			OptionsUnits.positionWall_1 = cover1.width * 2;
			//
			cover1.y = cover2.y = -cover1.height + stage.stageHeight;
			cover1.x = 0;
			cover2.x = cover1.x + cover1.width;
			this.addEventListener(Event.ENTER_FRAME, updateCoverOffset);
		}
 
		private var bodyFloor:Body = SFloor.getSFloor.getFloor.getBody;
		private var step:uint = 0;
 
		private function updateCover(e:Event):void
		{
			cover1.x -= OptionsUnits.tempGameSpeed ;
			cover2.x -= OptionsUnits.tempGameSpeed;
 
			if (cover1.x < -cover1.width)
				cover1.x = cover2.x + cover2.width;
			if (cover2.x < -cover2.width)
				cover2.x = cover1.x + cover1.width;
 
			if (step < 51)
			{
				++step;
				cover1.gotoAndStop(uint(step / 10 + 1));
				cover2.gotoAndStop(uint(step / 10 + 1));
			}
			else step = 0;
		}
	}
}

Старый 28.06.2016, 19:49
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Тормоза из-за растеризации могут быть. Попробуйте cacheAsBitmap, если не предполагается менять мувику цветовую и геометрическую трансформацию.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 28.06.2016, 19:58
Bletraut вне форума Посмотреть профиль Отправить личное сообщение для Bletraut Найти все сообщения от Bletraut
  № 9  
Ответить с цитированием
Bletraut
 
Аватар для Bletraut

Регистрация: Mar 2013
Адрес: Вне пространства.
Сообщений: 566
Отправить сообщение для Bletraut с помощью ICQ Отправить сообщение для Bletraut с помощью Skype™
Цитата:
Сообщение от neonoviiwolf Посмотреть сообщение
да как может быть реализация кривая, если я просто добавляю мувик на сцену и он просто играет

Добавлено через 3 минуты
Код AS3:
package classesGame.addActionUnits.addAction
{
	import classesGame.options.OptionsUnits;
	import classesGame.userEvent.UserEvent;
	import flash.events.Event;
	import nape.phys.Body;
	import singleton.sFloor.SFloor;
 
	public class AddActionCover extends IParentCommon
	{
 
		public function AddActionCover()
		{
		}
 
		private var cover1:cover_mc = new cover_mc();
		private var cover2:cover_mc = new cover_mc();
 
		override public function init(e:Event):void
		{
			super.init(e);
 
			stage.addEventListener(UserEvent.START_FLAG_1, userEvent);
			stage.addEventListener(UserEvent.START_FLAG_3, userEvent);
			stage.addEventListener(UserEvent.PAUSE, userEvent);
			stage.addEventListener(UserEvent.PLAY, userEvent);
			stage.addEventListener(UserEvent.EMERGING_WALL, userEvent);
			stage.addEventListener(UserEvent.SHOT_WALL, userEvent);
 
			this.addChild(cover1);
			this.addChild(cover2);
			this.addEventListener(Event.ENTER_FRAME, driveAway);
		}
 
		private function driveAway(e:Event):void
		{
			if (cover1.totalFrames > cover1.currentFrame)
				stage.dispatchEvent(new UserEvent(UserEvent.CREATE_SEGMENT, true, false));
			else
			{
				stage.dispatchEvent(new UserEvent(UserEvent.CREATE_ALL, true, false));
				this.removeEventListener(Event.ENTER_FRAME, driveAway);
				cover1.visible = cover2.visible = false;
			}
		}
 
		private function userEvent(e:UserEvent):void
		{
			switch (e.type)
			{
			case "startFlag1": 
			case "emergingWall":
				this.removeEventListener(Event.ENTER_FRAME, updateCover);
				startFlag1();
				break;
			case "shotWall":
			case "startFlag3": 
				this.addEventListener(Event.ENTER_FRAME, updateCover);
				break;
			case "pause": 
				this.removeEventListener(Event.ENTER_FRAME, updateCover);
				break;
			case "play": 
				this.addEventListener(Event.ENTER_FRAME, updateCover);
				break;
			}
		}
 
		private function updateCoverOffset(e:Event):void 
		{
			cover1.y = cover2.y = bodyFloor.position.y - 2651.4;
		}
 
		private function startFlag1():void
		{
			cover1.visible = cover2.visible = true;
			cover1.gotoAndStop(1);
			cover2.gotoAndStop(1);
			//!!!
			OptionsUnits.positionWall_1 = cover1.width * 2;
			//
			cover1.y = cover2.y = -cover1.height + stage.stageHeight;
			cover1.x = 0;
			cover2.x = cover1.x + cover1.width;
			this.addEventListener(Event.ENTER_FRAME, updateCoverOffset);
		}
 
		private var bodyFloor:Body = SFloor.getSFloor.getFloor.getBody;
		private var step:uint = 0;
 
		private function updateCover(e:Event):void
		{
			cover1.x -= OptionsUnits.tempGameSpeed ;
			cover2.x -= OptionsUnits.tempGameSpeed;
 
			if (cover1.x < -cover1.width)
				cover1.x = cover2.x + cover2.width;
			if (cover2.x < -cover2.width)
				cover2.x = cover1.x + cover1.width;
 
			if (step < 51)
			{
				++step;
				cover1.gotoAndStop(uint(step / 10 + 1));
				cover2.gotoAndStop(uint(step / 10 + 1));
			}
			else step = 0;
		}
	}
}
Нужно не мувиклип отображать, а bitmap и менять у неё bitmapdata.
__________________
Я заклинаю вас действовать иначе.

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

Регистрация: Jun 2014
Сообщений: 558
Bletraut покажите как, ни разу не задумывался

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

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

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


 


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


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