![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Привет!
Вообщем делаю игруху, а там много векторной графики, она естественно тормозит. Сначала попробовал убогий cashAsBitmap который годится тока для статики наверное, а в игре все движется анимируется. А при движении с помощью cashAsBitmap элементы даже как то скачат по пикселям. Вообщем решил вопрос путем создания своей системы кеширования(с помощью BitmapData) - все стало лучше - анимации стали быстрее. Но еще быстрее было бы при LOW качестве, но в этой ситуации BitmapData.draw() вектора рисует убого(впрочем как и на экране выглядит при LOW качестве). Вопрос - можно ли в LOW качестве качественно отрисовать векторную графику? Вопроса не возникло если бы можно было бы всю графику перед игрой закешировать потом поставить LOW качество и все дела, но суть в том что некоторые элементы придется перекешировать "на лету". Вариант с быстрым изменением качества не прокатит: Есть идеи?
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
|
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Ох, вы хотите в низком качестве рисовать в высоком качестве %)
Тут интересно, да, "Объясните пожалуйста, почему не прокатывает?" А ещё расскажу про cacheAsBitmap=true. При нём соответствующий displayObject рендерится в битмапу и эта битмапа уже отображается. При необходимости битмапа тормозно перерендеривается. Эта необходимость возникает, если обьект скейлится, крутится, в нем меняется графика. Т.е. только параллельный перенос. Мувику с кадрами ставить не надо (графика меняется при смене кадров), надо ставить его кадрам.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
|
Цитата:
1. выполнение кода по событиям 2. выполнение события ENTER_FRAME 3. рендеринг Дак вот, качество оно влияет на третий этап - рендеринг. Поэтому где бы ты не менял качество в этапе 1 или 2 реальное изменение будет тока на этапе 3 - рендеринга. Цитата:
StageQuality.LOW — низкое качество визуализации. Графика не сглаживается, растровые изображения также не смягчаются. Этот параметр не поддерживается в Adobe AIR. StageQuality.MEDIUM — среднее качество визуализации. Графика сглаживается по сетке 2 x 2 пиксела, растровые изображения не смягчаются. Этот параметр подходит для роликов, не содержащих текста. Этот параметр не поддерживается в Adobe AIR. StageQuality.HIGH — высокое качество визуализации. Графика сглаживается по сетке 4 x 4 пиксела, растровые изображения смягчаются, если ролик статичен. Этот параметр качества визуализации используется проигрывателем Flash Player по умолчанию. StageQuality.BEST — Очень высокое качество визуализации. Графика сглаживается по сетке 4 x 4 пиксела, растровые изображения всегда смягчаются. Мне надо отрисовать в битмапу при хорошем качестве, затем переключиться на плохое. Все объекты двигаются без вращения и скейлинга, так что особо визуальной разницы нету - разница в производительности. Цитата:
Вообщем меня интересует есть ли трюк какой(может с фильтрами что то, или с пиксель бендером) с помощью которого можно в LOW качестве нарисовать так же как в HIGHT. Кстати возможно с помощью пиксель бендера, написать там сглаживание точек 4х4. Добавлено через 1 час 13 минут Вот нашел пример сглаживания с помощью пиксель бендера. http://www.smart-page.net/blog/2010/...-pixel-bender/ Попробовал на своих объектах - сглаживаются тока внутренние части, остаются зазубренные края с альфа каналом... Да и долго как то он делает это )
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... Последний раз редактировалось DEAFFF; 12.11.2010 в 13:39. |
|
|||||
|
Млин, специально сейчас проверил.
Ваш код в первом посте работает как надо: 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 походу дела "для кода" меняется тока с предыдущего кадра, т.е. если я установил качество StageQuality.HIGH - то оно будет применимо для кода тока в следующем кадре. Вы попробуйте сделать так: 1. Запустить флешку, установив ей сразу качество StageQuality.LOW. 2. Затем подождать секунду-две. 3. Поставить качество StageQuality.HIGH затем закешировать и затем вернуть на качество StageQuality.LOW. Мне надо в реал тайм делать перекеширование, если бы вопрос был только о предварительном кешировании я бы не писал этот пост.
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
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; } } } |
|
|||||
|
да вы правы - накосячил )))
спасибо!
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
|
можно попробовать не совсем в реалтайме,
установить stage.quality = StageQuality.HIGH; добавить обработчик на ENTER_FRAME, и в нем уже рисовать |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:15. |
|
|
« Предыдущая тема | Следующая тема » |
|
|