2009-09-30 6 views
1

나는 (여전히) 내 프레임 속도가 허용 할 수없는 최저치로 떨어지는 2D 플래시 게임에서 문제를 해결하려고합니다. AS3 유형 지정되지 않은 변수 효율성

protected var value:*; 
public function getValue() :* { 
    return this.value; 
} 

는 지금, 그 방법은 그 방법에 소요되는 프레임 당 백 겉으로는 몇 번 내 응용 프로그램 시간의 2.23 %를 호출되고 : 나는 다음과 같은 멤버 변수와 방법으로 클래스를 가지고있다.

value을 입력 변수로 지정하면 유의성이 향상되는 것을 알 수 있습니까? 이 변수를 타입 화하면 응용 프로그램이 중단되어 실제로 도움이 될 것입니다. 이미 사용하고있는 점을 감안

Method        Calls Self Time (ms) 
------        ----- -------------- 
[pre-render]      0  2137 (19.68%) 
[reap]        0  727 (6.7%) 
[enterFrameEvent]     0  464 (4.27%) 
[mouseEvent]      0  352 (3.24%) 
[mark]        0  327 (3.01%) 
State.getValue      792356 242 (2.23%) 
[verify]       0  209 (1.93%) 
[render]       0  159 (1.46%) 
CollisionManager.detectCollisions 584  156 (1.44%) 
Entity.updateAllStates    30227 154 (1.42%) 
Entity.getStateValue    392412 143 (1.32%) 
GSVector.set y      156244 141 (1.3%) 
State.update      659738 123 (1.13%) 

답변

4

단어 . 강력한 타이핑은 AS3이 AS2보다 빠르다는 원칙적인 이유 중 하나입니다. AS2에서는 모든 변수가 유형이 지정되지 않았고 유형이 지정되지 않은 변수를 참조 할 때마다 Flash에서 내부적으로 어떤 유형인지를 확인해야하기 때문입니다.

일반적으로 이와 같은 질문에 대해서는 성능 튜닝의 함정, 아키텍처 변경이 코드 수준 튜닝보다 일반적으로 효과적이며 코드 실행이 아닌 렌더링으로 병목 현상이 발생하는 방식에 대해 질문했습니다. ..하지만이 경우 입력 된 변수를 사용하면 코드를보다 강력하고 읽기 쉽고 유지 보수하기 쉽고 버그가 적어 지므로 어쨌든해야 할 일입니다.

AS3에서 유형이 지정되지 않은 변수를 사용할 이유가 없습니다. 이 변화를 위해 시간을내어 성능 향상이 보이지 않더라도 장기적으로 성과를 낼 것입니다.

1

:

또한, 여기 처음에이 getValue() 방법을 의심하는 나를 이끌었다 자체 시간으로 분류 내 응용 프로그램의 성능 프로필, 상단의 몇 가지 기록을의 프로필, 왜 그냥 해보고 보지 그래?

플래시 게임에서 느린 프레임 속도는 일반적으로 코드 관련이 없습니다. "영역 다시 그리기"를 켜고 각 프레임에서 다시 그려지는 부분을 확인하십시오. 아마 너무 많이 다시 그려야 할 것입니다.

상태가 네임 스페이스가 될 수 없다면 *을 사용할 이유가 없습니다. 다른 모든 것은 Object에서 상속됩니다. 귀하의 주에는 일반적인 조상 또는 인터페이스가 없습니까?

편집 : 사실, 이제 생각해 보면 getValue를 많이 호출하고 있습니다. 프레임 당 한 번 CollisionManager.detectCollisions을 호출한다고 가정하면 프레임 당 getValue가 1356 회 호출됩니다.

한 메서드 내에서이 메서드를 여러 번 호출하는 경우에는 값을 한 번 가져 와서 함수에 적용되는 로컬 변수에 저장해보십시오. 값을 다른 메서드로 전달하여이 함수의 호출 횟수를 줄일 수도 있습니다.

+0

변경 사항을 적용하는 데 많은 시간이 걸릴 수 있으므로 투표를 통해 여러분 모두가 생각하는 것을 볼 수 있습니다. 다시 그리기에 대한 팁을 보내 주셔서 감사합니다! – Kai

0

디버거에서 실행할 수있는 경우 프레임 단위 코드를 플랫 루프에 넣고 try this을 입력하십시오.

1

먼저 입력 된 변수를 사용해야합니다. 코드 가독성을 개선하고 유형 안전성을 보장하며 성능을 향상시킬 수 있습니다. 내가 사용할 필요성을 발견 한 유일한 상황은 * 컬렉션 클래스를 작성하고 다양한 유형의 다양한 재사용이 필요할 때입니다 (Adobe에서 제네릭을 가져옵니다!).

속성이나 함수를 호출하면 오버 헤드가 발생하지만 변수를 공개로 설정하고 직접 액세스하면 성능이 향상되는 경우 큰 OOP가 아닙니다.

나는 또한 다른 것이 당신의 프레임 속도 하락을 설명한다고 의심합니다. 어떤 종류의 충돌 감지를하고 있기 때문에 그렇게하지 않으면 쿼트 트리를 살펴 봐야합니다. 쿼드 트리는 영역을 분할하여 충돌 검사의 양을 줄일 수 있습니다.

+0

컬렉션 시나리오에서 Object를 사용해야합니다. 내 대답에서 언급했듯이 *는 네임 스페이스 같은 것을 추가합니다. –

+0

AS3의 Array 및 Dictionary 클래스 모두 반환 유형이 * 인 것으로 보이므로 컬렉션 클래스와 일관되게 유지합니다. 객체를 정의 할 수 없으므로 이것을 테스트 할 수 있습니다. Dictionary 및 Array는 undefined를 반환 할 수 있으므로 반환해야합니다. * – Allan

관련 문제