Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   тормозит beginBitmapFill (http://www.flasher.ru/forum/showthread.php?t=167579)

DEAFFF 11.09.2011 23:48

тормозит beginBitmapFill
 
Вложений: 1
Привет!

Вообщем делаю игру 3D, заметил странную штуковину - при повороте на 90 градусов камеры FPS резко падает. Сначала подумал что где то в моем двиге не так, все перекопал - все отлично.

Начал копать глубже. Выяснилось что даже на простом примере тормозит без причины. И вина этому beginBitmapFill а именно определенная ситуация с этой функцией. Если передавать матрицу трансформации повернутую на 90 градусов то будет тормозить.

И вот вам пример. Запускаем свф, смотрим сколько выдает FPS, затем жмем SPACE - матрица поворачивается на 90 градусов и смотрим на FPS.

Код AS3:

 
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;
                        }
                }
        }
}


silin 12.09.2011 00:14

может от плеера зависит, но не удалось увидеть разницу
(дебаговые WIN 10.3.181.26 и 11.0.1.98)

-De- 12.09.2011 09:45

Ага, тормоза есть. В 800х600 не заметно (разве что по загрузке процессора), но если, например, сделать рендер в битмапу, а не beginBitmapFill даже (столько раз, сколько надо) - то вылезет.
Код AS3:

_bitmapDataScreen.draw(_bitmapData, _matrix);


DEAFFF 12.09.2011 15:39

Вложений: 1
Сделал немного другой тест. Теперь рисуется все в bitmapData несколько раз.

Можете выставлять константу NUM по своему вкусу.

Жаль конечно адобы опять подводят... Что делать? Есть идеи?

silin 12.09.2011 16:23

дык это как бы совсем другой тест
для bitmapData.draw есть разница,
а для graphics.beginBitmapFill мизерная (~1.1 раз), при том что сам он быстрее в сотни раз
откуда вдруг bitmapData.draw взялся, может скрипач и не нужен совсем?

DEAFFF 12.09.2011 17:05

Наверно все зависит от кофигурации компа(проц / память).

У меня что beginBitmapFill, что bitmapData.draw - все равно - сильно неоправданно тормозит.

DEAFFF 08.10.2011 14:43

УРА!!! Проблема решилась )))

Случайно заметил что на меньших разрешениях поворот на 90 не сказывается(не тормозит). Я решил потестить разные разрешения. Оказалось что тормозят только 1024, 1536, 2048 и т.д. Возможно флеш плеер как то оптимизирует к таким разрешениям... Самый прикол в том что поставив 1024-1 или 1024+1 т.е. "не стандартное" разрешение то глюк исчезает сам собой. Пути флеша неисповедимы! )))

Всем доброго дня!


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

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