AS3 Unttyped 변수 효율성
-
19-09-2019 - |
문제
나는 (여전히) 내 프레임 속도가 용납 할 수없는 최저치로 떨어지는 2D 플래시 게임에서 문제를 해결하려고 노력하고 있습니다. 다음 멤버 변수와 메소드가있는 클래스가 있습니다.
protected var value:*;
public function getValue () :* {
return this.value;
}
현재이 방법은 프레임 당 수백 번 겉보기로 불려지고 내 응용 프로그램 시간의 2.23%가 해당 방법에 소비됩니다.
당신은 내가 만들어서 중요한 성능이 증가한다고 생각하십니까? value
유형 변수? 이 변수를 입력하면 응용 프로그램이 나오는 동안 코드가 만들어 지므로 실제로 도움이 될 것입니다.
또한 자체 시간으로 정렬 된 내 응용 프로그램의 성능 프로필에 대한 최고 기록은 다음과 같습니다. getValue()
처음에 방법 :
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%)
해결책
한마디로, 예. 강력한 타이핑은 AS3이 AS2보다 빠른 주요 이유 중 하나입니다 (AS2에서는 모든 변수가 유형이 없기 때문에 Untyped 변수 플래시를 참조 할 때마다 내부적으로 어떤 유형인지 확인해야합니다).
일반적으로 이와 같은 질문의 경우, 나는 성능 튜닝의 함정, 건축 변화가 일반적으로 코드 수준 튜닝보다 더 효과적인 방법, 코드 실행보다는 렌더링에 의해 대부분의 컨텐츠가 병목 현상을하는 방법에 대해 HEM과 HAG와 같은 질문에 대해서는 ... 이 경우 유형 변수를 사용하는 것은 코드가 더욱 강력하고 읽기 쉽고 유지 관리하기 쉽고 버그가 덜하기 때문에 어쨌든 수행해야 할 일입니다.
AS3에서 Untyted 변수를 사용해야할만한 이유는 없습니다. 시간을 내어이 변화를 만들면 성능이 증가하지 않더라도 장기적으로 돈을 지불 할 것입니다 (하지만 당신이 그렇게 할 것이라고 생각합니다).
다른 팁
이미 프로필을 사용하고 있다는 점을 감안할 때, 그냥 시도해보고 보지 않겠습니까?
플래시 게임에서 느린 프레이머는 일반적으로 코드 관련이 아닙니다. "redraw retains"를 켜고 각 프레임에서 무엇이 다시 그려 지는지 확인하십시오. 아마도 너무 많이 그리워 할 것입니다.
주제에 대해서는 당신이 사용할 이유가 없습니다. *
, 상태가 네임 스페이스가 될 수 없다면. 다른 모든 것은 물려받습니다 Object
. 당신의 주에는 공통 조상이나 인터페이스가 없습니까?
편집하다: 사실, 이제 그것에 대해 생각하기 때문에 GetValue를 많이 부릅니다. 당신이 전화한다고 가정합니다 CollisionManager.detectCollisions
프레임 당 한 번, 프레임 당 GetValue를 1356 회 호출합니다.
이 메소드를 하나의 방법 내에서 여러 번 호출하는 경우 값을 한 번 가져 와서 로컬 (함수에 스코어링)에 저장하십시오. 이 함수의 호출 수를 줄이기 위해 값을 다른 방법으로 전달할 수도 있습니다.
먼저 유형 변수를 사용해야합니다. 코드 가독성을 향상시키고 유형 안전을 보장하며 성능을 향상시킬 수 있습니다. 내가 사용해야 할 유일한 상황은 다음과 같습니다.* 컬렉션 클래스를 작성하고 다양한 유형에 대해 재사용 할 수 있기를 원할 때 (Adobe가 제네릭을 가져옵니다!)입니다.
속성이나 기능을 호출하면 오버 헤드가 발생하지만 가변적 인 것을 공개하고 직접 액세스하면 성능을 향상시킬 경우 OOP가 아닙니다.
또한 다른 것이 당신의 프레임 속도가 떨어질 수 있다고 생각합니다. 어떤 종류의 충돌 감지를하고있는 것처럼 보이므로 그렇게하지 않으면 쿼드 트리를 살펴 봐야합니다. 쿼드 트리는 지역을 분리하여 충돌 점검량을 줄일 수 있습니다.
디버거 아래에서 실행할 수 있다면 프레임당 코드를 플랫 아웃 루프에 넣고 이 시도.