PDA

Просмотр полной версии : beginBitmapFill. Зависимость FPS от А: Размера BitmapData B: размера формы


gr_crd
01.03.2010, 18:23
Суть в следующем.
После многочисленных тестов, выяснился странный факт, что FPS при заливке области методом beginBitmapFill, никак не зависит ни от размеров заливаемой области, ни от размеров битмапы, использующейся для заливки.
Что это? Как-то нелогично получается...


package {

import flash.display.BitmapData;
import flash.display.Sprite;
import flash.events.Event;

public class bbf_test extends Sprite {

var bm10:BitmapData = new x10(10,10);
var bm100:BitmapData = new x100(100,100);
var bm1000:BitmapData = new x1000(1000,1000);

public function bbf_test():void {

addEventListener(Event.ENTER_FRAME, ont);

}//cons

function ont(e:Event):void {
graphics.clear();

for (var i:uint = 0; i < 50000;i++){
graphics.beginBitmapFill(bm10);
}

graphics.drawRect(0, 0, 100, 100);
graphics.endFill();
}

}//bbf_test

}//pack


где bm10 bm100 bm1000 - битмапы размерами соответственно 10х10 100х100 1000х1000

graphics.beginBitmapFill(bm10); - если вместо bm10 использую bm100 bm1000 - никакой разницы - все так же 9 FPS..

graphics.drawRect(0, 0, 100, 100); - пробовал изменять размер области от 10х10 на 1000х1000..... - ничего. Все те же 9 FPS....

Хотел сделать что-то похожее на MipMapping... но выходит, что результаты для любых размеров BitmapData - одинаковые.....

Как так может быть? В чем я заблуждаюсь??

GentleFLASH
03.03.2010, 07:19
По-моему все логично. В данном примере вызывается 50000 раз вызов метода beginBitmapFill, на мой взгляд это равносильно, что сказать устройству - сейчас текстура такая-то. А фактическая отрисовка ее происходит только один раз graphics.drawRect(0, 0, 100, 100); Логичнее было бы 50000 раз вызвать как раз graphics.drawRect(0, 0, 100, 100); а beginBitmapFill(bm10) всего один.

Котяра
03.03.2010, 10:14
отрисовка в graphics.endFill();
в цикл надо ставить всё рисование


for (var i:uint = 0; i < 50000;i++){
graphics.clear();
graphics.beginBitmapFill(bm10);
graphics.drawRect(0, 0, 100, 100);
graphics.endFill();

}

gr_crd
03.03.2010, 14:31
ну это в этом примере так, а в другом коде у меня просто много треугольников и каждому из них соответствует своя текстура.

т.е. допустим есть 3000 треугольников.

каждый из них рисуется методами lineTo.
и заливается текстурой через beginBitmapFill.

beginBitmapFill(BitmapData, Matrix);

в таком случае вызывать graphics.clear() перед отрисовкой каждого треугольника...
для этого примера это подошло бы, но не для отрисовки треугольников так как 2999 предыдущих естесственно очистятся.

мне показалось нелогичным то, что при заливке этих 3000 треугольиков битмапой 10х10 пикс FPS остается таким же как и при заливке битмапой 1000х1000.

от чего зависит скорость метода beginBitmapFill ?

получается что неважен размер области и размер битмапы а только количество вызовов?

Котяра
04.03.2010, 10:29
ну у вас количество вызовов ни на что не влияет.. просто 50000 раз меняется ссылка на битмапу.. какая разница какого она размера? отрисовка то происходит 1 раз.
beginBitmapFill - быстрый метод - это только присвоение ссылки - отрисовка идёт в endFill
graphics.clear();
for (var i:uint = 0; i < 500;i++){

graphics.beginBitmapFill(bm10);
graphics.drawRect(i, i, i+100, i+100);
graphics.endFill();

}

gr_crd
04.03.2010, 16:45
ааа, ну вообшем все прояснилось!)
пасибо!

Psycho Tiger
04.03.2010, 19:39
отрисовка идёт в endFill
Разве? Я endFill бывает не пишу - но ничего, рисует.