타워 디펜스 게임에서 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.