타워 디펜스 게임에서 A * 구현시 성능 저하


9

사전 정의 된 경로없이 Flash에서 Tower Defense 게임을 만들고 있습니다.

그리드가 40x40 (소?)이지만 매번 다시 계산할 때 A *가 어려움을 겪고 있습니다. 그래서 나는 재 계산을 용이하게하기 위해 나 자신의 수정을했고 만지는 세포 수는 약 900으로 떨어졌습니다 (근근 근처에서 수정 할 때). 새 타워를 놓을 때 여전히 매우 짧지 만 감지 가능한 시간 동안 정지됩니다.

이것은 구현 문제입니까, 아니면 40x40입니까?

편집하다:

내 코드의 구조 :

  • 모든 데이터는 2 차원 셀 배열에 저장됩니다.
  • 각 셀은 경로 방향 (1-8 시계 방향)으로 부모를 포함하고 경로에서 해당 자식의 비트 단위 인코딩 배열을 포함합니다 (모든 비트는 자식을 나타냄).
  • 검색은 유클리드 거리의 추정치와 함께 A *로 수행됩니다.

여기에서 훨씬 더 구체적이어야합니다. 우리는 코드가 어떻게 생겼는지, 어떻게 구성되는지 등을 알지 못하므로 느리게 만드는 것에 대한 결론을 그릴 수 없습니다.
Sean James

1
마지막으로 A *를 구현했을 때 최대 1ms 동안 64x64 그리드를 통해 실행되는 것을 기억합니다 . 예, 구현에 문제가있는 것 같습니다. 귀하의 코드 또는 코드의 요지를 게시하여 추가 도움을받을 수 있습니다.
Marc Müller

내가 추가 한 수정 사항보기
Dani

1
40x40이 너무 느리면 매우 잘못된 일을하고있을 가능성이 높습니다. 코드를 게시하거나 프로파일 링하십시오. 또는 80x80 격자의 길이가 4 배 이상 걸리면 무언가가 심하게 파손 된 것입니다.
ZorbaTHut

제목이 좀 더 유익 할 수 있습니까?
tenpn

답변:


4

주석을 달 수는 없지만 Flex의 첫 번째 프로필입니다. 다른 모든 것은 추측입니다.


Flex 프로젝트에서 플래시 프로젝트를 어떻게 프로파일 링 할 수 있습니까?
Dani

예, 아니오 플래시 프로젝트를 직접로드한다고 생각하지 않습니다. 소스없이 swf를 프로파일 링하고 여전히 기능 수준 정보를 얻을 수 있다고 생각합니다. "플렉스에서 플래시 프로젝트 프로파일 링"등에 대한 Google 검색을 수행합니다. 내가 그랬어이있어 : flexblog.edchipman.ca/... 약속 보인다.
Jonathan Fischoff

감사합니다, 정말 문제가되는 부분을 찾는 데 도움이되었습니다 (알고리즘에 없었습니다, 질문에 대한 의견 참조)
Dani

13

TD가 'Tower Defence'라고 가정합니다.

나는 A *가 이것에 대해 다소 선을 넘어 가고 있다고 생각합니다.

게임 시작시, 출구에서 게임 영역을 플러딩하여 무브먼트 맵을 만듭니다 :

 |---------|
 |5|4|3|3|3|
 |5|4|3|2|2|
->5|4|3|2|1->
 |5|4|3|2|2|
 |5|4|3|3|3|
 |---------|

움직임은 항상 더 낮은 값을 가진 정사각형을 향합니다.

플레이어가 타워를 배치 할 때 인접한 8 개의 사각형을 각각 업데이트하십시오. 각 사각형에 대해 이동 값을 가장 낮은 인접 값보다 1 이상 높게 설정하십시오. 값이 변경되면 업데이트 된 사각형을 중심으로 프로세스를 반복하십시오. 그런 다음 출구로가는 경로가 막히지 않았는지 확인하려면 모든 사각형이 낮은 값의 사각형에 인접 해 있는지 확인하십시오.

플레이어가 타워를 제거 할 때 이동 값을 가장 가까운 인접한 사각형보다 하나 더 설정하고 위의 과정을 반복하십시오.

더 간단한 방법은 플러드 필을 다시 실행하는 것입니다.


6
플러드 필을 다시 실행하는 것은 최소한 알고리즘 용어로 보드의 길이와 같은 소수의 장치에 대해 A *를 수행하는 것보다 비용이 많이 듭니다 (이는 플래시이므로 메모리 레이아웃과 같은 비 알고리즘 상수는 아마도 매우 효과적으로 사용하십시오). 그러나,이 많은 통신 장치를위한 아주 좋은 모델이며, 협력 확산이라고합니다 - scalablegamedesign.cs.colorado.edu/wiki/Collaborative_Diffusion .

@ 조 Wreschnig : 와우 ​​좋은 링크. 나는 그 기술을 전에 사용했지만 그 기술이 무엇인지 몰랐다. 감사.
tenpn

@ 조,지도에 최소한 몇 개의 장벽이있는 한 A *를 호출하는 것보다 비효율적이라고 생각하지 않습니다. 즉, 단위가 거의없는 넓게 열린 거의 장애물이없는지도에 대해서만 더 나쁠 수 있다고 생각합니다.
edA-qa mort-ora-y

@edA : 정의에 따라 홍수 채우기는 결국지도의 모든 접근 가능한 지점에 닿아 야합니다. A *는 어떤 터치 얼마나 많은 점수로 상위 경계를 입증 제공 대부분에서 일반적으로 훨씬 적은지도와의 모든 접근 점. 플러드 필은 플래시에서 메모리 레이아웃과 같은 것을 최적화하는 간단한 알고리즘이지만 플래시에서 중요하지 않을 수도 있습니다.

@Joe, 그것이 내가 주장하고있는 것은 단지 몇 개의 탑으로도 A *가 거의 모든 공간에 닿을 수 있다는 것입니다. 그러나 N 몬스터의 경우 홍수 채우기보다 효율성이 떨어지려면 total_squares / N 만 초과하면됩니다.
edA-qa mort-ora-y

2

이상하게, 나는 이것에 응답한다고 생각했지만 답장은 사라진 것 같습니다. 검색 알고리즘을 여러 단계로 업데이트 할 수 있도록 타워를 배치하고 애니메이션을 재생할 때 매 프레임마다 조금씩 작업을 수행하면 0.5 초에서 1 초 사이에 업데이트 알고리즘이 업데이트됩니다. 눈에 띄는 일시 정지가없는 A *. 대기 시간-iF로 속도를 높일 수 없으며 숨길 수있는 방법을 찾으십시오. 타워를 배치하는 동안 애니메이션을 재생하는 것은 게임에있어 자연스럽고 숨길 수있는 좋은 장소입니다.


이것은 일반적으로 좋은 생각이지만이 특정 질문에는 좋지 않습니다. 이러한 작은 그리드의 A *는 시간이 많이 걸리지 않고 거의 즉각적이어야합니다.
davr

그럴 수 있지. 속도 저하의 원인이되는 구현 세부 사항을 모르고 문제를 해결할 수있는 유일한 대답입니다.
Kaj

0

시작하려면 배열을 벡터로 변경할 수 있습니다-속도를 향상시켜야합니다. 코드를 게시하면 더 많은 최적화를 제안 할 수 있습니다.


0

모든 문자의 경로를 동시에 계산하기 때문에 속도가 느려지는 것 같습니다. 한 캐릭터의 경로를 계산하는 것은 빠르지 만 장면에 12 개가있는 캐릭터는 멈출 수 있습니다.

대신 몇 프레임에로드를 분산시켜야합니다. 다른 캐릭터가 다른 프레임에서 경로를 업데이트하도록 AI 업데이트를 엇갈리게하십시오. 캐릭터가 1 초 후까지 반응하지 않았지만 한 프레임만으로도 나쁜 반응을 일으키지 않으면 실제로 눈에.니다.


이것은 거의 1 년 전에 답변되었으며 Grace의 편집 작업으로 인해 부딪 혔습니다. (너무 많은 문자와는 아무 관련이 없습니다.)

알려 줘서 고마워. 나는 날짜를 몰랐다.
jhocking
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.