|
|
|||||
тормозит beginBitmapFill
Привет!
Вообщем делаю игру 3D, заметил странную штуковину - при повороте на 90 градусов камеры FPS резко падает. Сначала подумал что где то в моем двиге не так, все перекопал - все отлично. Начал копать глубже. Выяснилось что даже на простом примере тормозит без причины. И вина этому beginBitmapFill а именно определенная ситуация с этой функцией. Если передавать матрицу трансформации повернутую на 90 градусов то будет тормозить. И вот вам пример. Запускаем свф, смотрим сколько выдает FPS, затем жмем SPACE - матрица поворачивается на 90 градусов и смотрим на FPS. package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageQuality; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.KeyboardEvent; import flash.geom.Matrix; import flash.ui.Keyboard; import stats.FPSViewer; /** * ... * @author */ public class Main extends Sprite { [Embed(source='../lib/image.jpg')] private static const Image:Class; private var _bitmapData:BitmapData; private var _rotate:Boolean; private var _matrix:Matrix; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point //создаем битмапу 1024х1024 _bitmapData = Bitmap(new Image()).bitmapData; //создаем матрицу _matrix = new Matrix(); //флаг поворота на 90 градусов - отключен _rotate = false; //настраиваем стейдж stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.quality = StageQuality.LOW; stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown); stage.addEventListener(Event.ENTER_FRAME, enterFrame); //добавляем профайлер stage.addChild(new FPSViewer()); } private function enterFrame(e:Event):void { //центрируем матрицу (можно отключить) _matrix.tx = stage.stageWidth / 2; _matrix.ty = stage.stageHeight / 2; //если флаг поворота на 90 градусов включен if (_rotate) { //то устанавливаем поворот матрице 90 градусов _matrix.a = 0; _matrix.b = 1; _matrix.c = -1; _matrix.d = 0; } else//иначе { //устанавливаем поворот в ноль градусов _matrix.a = 1; _matrix.b = 0; _matrix.c = 0; _matrix.d = 1; } //рисуем graphics.clear(); graphics.beginBitmapFill(_bitmapData, _matrix, true, false); graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight); } private function keyDown(e:KeyboardEvent):void { switch(e.keyCode) { case Keyboard.SPACE: _rotate = !_rotate; break; } } } }
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
блогер
Регистрация: Oct 2005
Адрес: Днепродзержинск - город Брежнева и других логопедов
Сообщений: 1,421
Записей в блоге: 4
|
Ага, тормоза есть. В 800х600 не заметно (разве что по загрузке процессора), но если, например, сделать рендер в битмапу, а не beginBitmapFill даже (столько раз, сколько надо) - то вылезет.
__________________
Бобры отвечают на вопросы не потому, что знают на них ответы; они отвечают потому, что их спрашивают. |
|
|||||
Сделал немного другой тест. Теперь рисуется все в bitmapData несколько раз.
Можете выставлять константу NUM по своему вкусу. Жаль конечно адобы опять подводят... Что делать? Есть идеи?
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
дык это как бы совсем другой тест
для bitmapData.draw есть разница, а для graphics.beginBitmapFill мизерная (~1.1 раз), при том что сам он быстрее в сотни раз откуда вдруг bitmapData.draw взялся, может скрипач и не нужен совсем? |
|
|||||
Наверно все зависит от кофигурации компа(проц / память).
У меня что beginBitmapFill, что bitmapData.draw - все равно - сильно неоправданно тормозит.
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
|
|||||
УРА!!! Проблема решилась )))
Случайно заметил что на меньших разрешениях поворот на 90 не сказывается(не тормозит). Я решил потестить разные разрешения. Оказалось что тормозят только 1024, 1536, 2048 и т.д. Возможно флеш плеер как то оптимизирует к таким разрешениям... Самый прикол в том что поставив 1024-1 или 1024+1 т.е. "не стандартное" разрешение то глюк исчезает сам собой. Пути флеша неисповедимы! ))) Всем доброго дня!
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир... |
Часовой пояс GMT +4, время: 18:08. |
|
« Предыдущая тема | Следующая тема » |
|
|