PDA

Просмотр полной версии : тормозит beginBitmapFill


DEAFFF
11.09.2011, 23:48
Привет!

Вообщем делаю игру 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;
}
}
}
}

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

-De-
12.09.2011, 09:45
Ага, тормоза есть. В 800х600 не заметно (разве что по загрузке процессора), но если, например, сделать рендер в битмапу, а не beginBitmapFill даже (столько раз, сколько надо) - то вылезет.
_bitmapDataScreen.draw(_bitmapData, _matrix);

DEAFFF
12.09.2011, 15:39
Сделал немного другой тест. Теперь рисуется все в 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 т.е. "не стандартное" разрешение то глюк исчезает сам собой. Пути флеша неисповедимы! )))

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