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