문제

나는 (여전히) 내 프레임 속도가 용납 할 수없는 최저치로 떨어지는 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가 아닙니다.

또한 다른 것이 당신의 프레임 속도가 떨어질 수 있다고 생각합니다. 어떤 종류의 충돌 감지를하고있는 것처럼 보이므로 그렇게하지 않으면 쿼드 트리를 살펴 봐야합니다. 쿼드 트리는 지역을 분리하여 충돌 점검량을 줄일 수 있습니다.

디버거 아래에서 실행할 수 있다면 프레임당 코드를 플랫 아웃 루프에 넣고 이 시도.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top