Показать сообщение отдельно
Старый 11.09.2011, 23:48
DEAFFF вне форума Посмотреть профиль Отправить личное сообщение для DEAFFF Посетить домашнюю страницу DEAFFF Найти все сообщения от DEAFFF
  № 1  
Ответить с цитированием
DEAFFF
 
Аватар для DEAFFF

Регистрация: Feb 2004
Адрес: Россия, В. Новгород
Сообщений: 255
Отправить сообщение для DEAFFF с помощью ICQ
По умолчанию тормозит beginBitmapFill

Привет!

Вообщем делаю игру 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;
			}
		}
	}
}
Вложения
Тип файла: zip test.zip (381.4 Кб, 61 просмотров)
__________________
зная будущее, хотя бы, на 10 минут вперед, можно покорить весь мир...