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

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

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

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
По умолчанию как закешировать качественно графику в LOW качестве

Привет!

Вообщем делаю игруху, а там много векторной графики, она естественно тормозит.

Сначала попробовал убогий cashAsBitmap который годится тока для статики наверное, а в игре все движется анимируется. А при движении с помощью cashAsBitmap элементы даже как то скачат по пикселям.

Вообщем решил вопрос путем создания своей системы кеширования(с помощью BitmapData) - все стало лучше - анимации стали быстрее.

Но еще быстрее было бы при LOW качестве, но в этой ситуации BitmapData.draw() вектора рисует убого(впрочем как и на экране выглядит при LOW качестве).

Вопрос - можно ли в LOW качестве качественно отрисовать векторную графику?

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

Вариант с быстрым изменением качества не прокатит:

Код AS3:
stage.quality = StageQuality.HIGHT;
 
bitmapData.draw(displayObject);
 
stage.quality = StageQuality.LOW;
Есть идеи?
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...

Старый 12.11.2010, 11:34
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 2  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Объясните пожалуйста, почему не прокатывает?

Старый 12.11.2010, 12:09
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 3  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Кажется качество влияет только на векторные объекты, поэтому если вы всё превратите в bitmap, то какое качество не выставляй, всё равно ничего не изменится.

Старый 12.11.2010, 12:53
-De- вне форума Посмотреть профиль Отправить личное сообщение для -De- Найти все сообщения от -De-
  № 4  
Ответить с цитированием
-De-
 
Аватар для -De-

блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
Отправить сообщение для -De- с помощью ICQ Отправить сообщение для -De- с помощью Skype™
Ох, вы хотите в низком качестве рисовать в высоком качестве %)
Тут интересно, да, "Объясните пожалуйста, почему не прокатывает?"
А ещё расскажу про cacheAsBitmap=true. При нём соответствующий displayObject рендерится в битмапу и эта битмапа уже отображается. При необходимости битмапа тормозно перерендеривается. Эта необходимость возникает, если обьект скейлится, крутится, в нем меняется графика. Т.е. только параллельный перенос. Мувику с кадрами ставить не надо (графика меняется при смене кадров), надо ставить его кадрам.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают.

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

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
Цитата:
Объясните пожалуйста, почему не прокатывает?
Ну я думаю потому что работа флеш плеера разделена на три части(читал в одной официальной доке):

1. выполнение кода по событиям
2. выполнение события ENTER_FRAME
3. рендеринг

Дак вот, качество оно влияет на третий этап - рендеринг. Поэтому где бы ты не менял качество в этапе 1 или 2 реальное изменение будет тока на этапе 3 - рендеринга.

Цитата:
Кажется качество влияет только на векторные объекты, поэтому если вы всё превратите в bitmap, то какое качество не выставляй, всё равно ничего не изменится.
Из доков:
StageQuality.LOW — низкое качество визуализации. Графика не сглаживается, растровые изображения также не смягчаются. Этот параметр не поддерживается в Adobe AIR.
StageQuality.MEDIUM — среднее качество визуализации. Графика сглаживается по сетке 2 x 2 пиксела, растровые изображения не смягчаются. Этот параметр подходит для роликов, не содержащих текста. Этот параметр не поддерживается в Adobe AIR.
StageQuality.HIGH — высокое качество визуализации. Графика сглаживается по сетке 4 x 4 пиксела, растровые изображения смягчаются, если ролик статичен. Этот параметр качества визуализации используется проигрывателем Flash Player по умолчанию.
StageQuality.BEST — Очень высокое качество визуализации. Графика сглаживается по сетке 4 x 4 пиксела, растровые изображения всегда смягчаются.

Мне надо отрисовать в битмапу при хорошем качестве, затем переключиться на плохое. Все объекты двигаются без вращения и скейлинга, так что особо визуальной разницы нету - разница в производительности.

Цитата:
Ох, вы хотите в низком качестве рисовать в высоком качестве %)
Тут интересно, да, "Объясните пожалуйста, почему не прокатывает?"
А ещё расскажу про cacheAsBitmap=true. При нём соответствующий displayObject рендерится в битмапу и эта битмапа уже отображается. При необходимости битмапа тормозно перерендеривается. Эта необходимость возникает, если обьект скейлится, крутится, в нем меняется графика. Т.е. только параллельный перенос. Мувику с кадрами ставить не надо (графика меняется при смене кадров), надо ставить его кадрам.
Про cacheAsBitmap все понятно и так, тока при движении несколько закешированных объектов они дергаются относительно друг друга, и к тому же неадекватно тормозит иногда.

Вообщем меня интересует есть ли трюк какой(может с фильтрами что то, или с пиксель бендером) с помощью которого можно в LOW качестве нарисовать так же как в HIGHT. Кстати возможно с помощью пиксель бендера, написать там сглаживание точек 4х4.

Добавлено через 1 час 13 минут
Вот нашел пример сглаживания с помощью пиксель бендера.
http://www.smart-page.net/blog/2010/...-pixel-bender/
Попробовал на своих объектах - сглаживаются тока внутренние части, остаются зазубренные края с альфа каналом... Да и долго как то он делает это )
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...


Последний раз редактировалось DEAFFF; 12.11.2010 в 13:39.
Старый 12.11.2010, 14:49
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 6  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Млин, специально сейчас проверил.
Ваш код в первом посте работает как надо:
Код AS3:
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageQuality;
	import flash.events.Event;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
 
	public class Main extends Sprite {
 
		public function Main() {
			super();
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init)
 
			var veryDifficultShape:Shape = new Shape();
			var gr:Graphics = veryDifficultShape.graphics;
			gr.lineStyle(1, 0xFF0000);
			gr.drawCircle(0, 0, 50);
 
			addChild(veryDifficultShape);
			veryDifficultShape.x = 100;
			veryDifficultShape.y = 100;
			// рисуем с хорошим качеством
			stage.quality = StageQuality.HIGH;
			var b:Rectangle = veryDifficultShape.getBounds(null);
			var bmd:BitmapData = new BitmapData(Math.ceil(b.width), Math.ceil(b.height), true, 0);
			bmd.draw(veryDifficultShape, new Matrix(1, 0, 0, 1, -b.x, -b.y));
			var bm:Bitmap = new Bitmap(bmd);
			bm.x = 300;
			bm.y = 100;
			addChild(bm);
			stage.quality = StageQuality.LOW;
		}
	}
}

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

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
Цитата:
Сообщение от zuxul Посмотреть сообщение
Млин, специально сейчас проверил.
Ваш код в первом посте работает как надо:
Код AS3:
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageQuality;
	import flash.events.Event;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
 
	public class Main extends Sprite {
 
		public function Main() {
			super();
			addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init)
 
			var veryDifficultShape:Shape = new Shape();
			var gr:Graphics = veryDifficultShape.graphics;
			gr.lineStyle(1, 0xFF0000);
			gr.drawCircle(0, 0, 50);
 
			addChild(veryDifficultShape);
			veryDifficultShape.x = 100;
			veryDifficultShape.y = 100;
			// рисуем с хорошим качеством
			stage.quality = StageQuality.HIGH;
			var b:Rectangle = veryDifficultShape.getBounds(null);
			var bmd:BitmapData = new BitmapData(Math.ceil(b.width), Math.ceil(b.height), true, 0);
			bmd.draw(veryDifficultShape, new Matrix(1, 0, 0, 1, -b.x, -b.y));
			var bm:Bitmap = new Bitmap(bmd);
			bm.x = 300;
			bm.y = 100;
			addChild(bm);
			stage.quality = StageQuality.LOW;
		}
	}
}
))) прикол в том что так будет работать, потому что изначально у флешки стоит качество StageQuality.HIGH, вы его делаете StageQuality.HIGH(т.е. не меняете), затем после операции меняете на StageQuality.LOW. Все логично.

StageQuality походу дела "для кода" меняется тока с предыдущего кадра, т.е. если я установил качество StageQuality.HIGH - то оно будет применимо для кода тока в следующем кадре.

Вы попробуйте сделать так:
1. Запустить флешку, установив ей сразу качество StageQuality.LOW.
2. Затем подождать секунду-две.
3. Поставить качество StageQuality.HIGH затем закешировать и затем вернуть на качество StageQuality.LOW.

Мне надо в реал тайм делать перекеширование, если бы вопрос был только о предварительном кешировании я бы не писал этот пост.
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...

Старый 12.11.2010, 15:07
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 8  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Код AS3:
package {
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Graphics;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.display.StageQuality;
	import flash.events.Event;
	import flash.events.TimerEvent;
	import flash.geom.Matrix;
	import flash.geom.Rectangle;
	import flash.utils.Timer;
 
	public class Main extends Sprite {
 
		public function Main() {
			super();
			addEventListener(Event.ADDED_TO_STAGE, init);
 
		}
 
		private function init(e:Event):void {
			removeEventListener(Event.ADDED_TO_STAGE, init)
			stage.quality = StageQuality.LOW;
			var timer:Timer = new Timer(2000, 1);
			timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteListener);
			timer.start();
		}
 
		private function timerCompleteListener(e:TimerEvent):void {
			Timer(e.target).removeEventListener(TimerEvent.TIMER_COMPLETE, timerCompleteListener);
 
			var veryDifficultShape:Shape = new Shape();
			var gr:Graphics = veryDifficultShape.graphics;
			gr.lineStyle(1, 0xFF0000);
			gr.drawCircle(0, 0, 50);
 
			addChild(veryDifficultShape);
			veryDifficultShape.x = 100;
			veryDifficultShape.y = 100;
			// рисуем с хорошим качеством
			stage.quality = StageQuality.HIGH;
			var b:Rectangle = veryDifficultShape.getBounds(null);
			var bmd:BitmapData = new BitmapData(Math.ceil(b.width), Math.ceil(b.height), true, 0);
			bmd.draw(veryDifficultShape, new Matrix(1, 0, 0, 1, -b.x, -b.y));
			var bm:Bitmap = new Bitmap(bmd);
			bm.x = 300;
			bm.y = 100;
			addChild(bm);
			stage.quality = StageQuality.LOW;
		}
	}
}
Видимо, у Вас где-то косяк...

Старый 12.11.2010, 15:20
DEAFFF вне форума Посмотреть профиль Отправить личное сообщение для DEAFFF Посетить домашнюю страницу DEAFFF Найти все сообщения от DEAFFF
  № 9  
Ответить с цитированием
DEAFFF
 
Аватар для DEAFFF

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
да вы правы - накосячил )))
спасибо!
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...

Старый 13.11.2010, 09:14
f.g.programmer вне форума Посмотреть профиль Отправить личное сообщение для f.g.programmer Найти все сообщения от f.g.programmer
  № 10  
Ответить с цитированием
f.g.programmer
 
Аватар для f.g.programmer

блогер
Регистрация: Sep 2010
Адрес: Россия
Сообщений: 137
Записей в блоге: 3
можно попробовать не совсем в реалтайме,
установить stage.quality = StageQuality.HIGH;
добавить обработчик на ENTER_FRAME, и в нем уже рисовать
Код AS3:
stage.addEventListener(Event.ENTER_FRAME, onEnterFrame);
 
private function onEnterFrame(e:Event):void {
	stage.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
	bitmapData.draw(displayObject);
	stage.quality = StageQuality.LOW;
}

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

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

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


 


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


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