2012-04-10 1 views
3

나는 BitmapDisplayObject 개의 그림을 그리기 위해 재활용하고 사용하는 Matrix을 보유하고 있습니다.속성 모음을 재설정하거나 새 인스턴스를 만드는 것이 더 빠릅니까?

_matrix.a = 1; 
_matrix.b = 0; 
_matrix.c = 0; 
_matrix.d = 1; 
_matrix.tx = 0; 
_matrix.ty = 0; 

는 위의 작업을 수행하는 것이 더 있을까, 또는 단순히이

_matrix = new Matrix(); 
을? : 할 :이처럼 각 항목을 렌더링하기 전에 순간

, 나는 Matrix를 재설정

일반적으로 저는 전 (前者)이라고 말할 것입니다. 그러나 Matrix의 경우에 (수학적으로) 재설정 한 각 속성에 대해 진행중인 무거운 것들이 있는지 확실하지 않습니다.

답변

7

나는 같은 시간에 Matrix을 재사용하는 것이 매번 새로운 인스턴스를 만드는 것보다 효율적이라고 생각합니다.

실제로 새 인스턴스를 만드는 것은 상대적으로 많은 작업이므로 캐시를 사용하는 이유는 몇 가지 인스턴스를 생성하고 인스턴스를 많이 생성하는 대신 재사용하는 것입니다.

는 좀 벤치 마크를 실행하고 내 대답 확인 : 마지막으로

var t:Number; 
var i:int; 
var N:int = 10000000; 

t = getTimer(); 
for (i = 0; i < N; i++) { 
    _matrix = new Matrix(); 
} 
trace(getTimer()-t); // 7600 


t = getTimer(); 
for (i = 0; i < N; i++) { 
    _matrix.a = 1; 
    _matrix.b = 0; 
    _matrix.c = 0; 
    _matrix.d = 1; 
    _matrix.tx = 0; 
    _matrix.ty = 0; 
} 
trace(getTimer()-t); // 4162 

를, 차이가 훨씬 크지 않다 있습니다 그리고 그 10000000 새로운 인스턴스를 생성하면 수천을 작성하지 않는 한, 그래서 단지 7600 ms 소요 매트릭스 당 프레임 수는 두 가지 방법 모두 성능에 눈에 띄는 영향을 미치지 않습니다. 두 가지 접근 방식 (단순 및 성능)의 장점이있을 것이다 방법 identity를 사용

:


편집

t = getTimer(); 
for (i = 0; i < N; i++) { 
    _matrix.identity(); 
} 
trace(getTimer()-t); // 4140 
+0

대한 수정은 무한 upvotes 가치가있다. – Marty

+0

감사합니다. 이 [post] (http://jacksondunstan.com/articles/1417)를보십시오. 'BitmapData.draw()'대신'BitmapData.copyPixels()'를 사용하면 성능을 훨씬 향상시킬 수 있습니다. – sch