사전 게임 로딩 시간 vs. 게임 로딩 시간


9

무작위 미로가 포함 된 게임을 개발 중 입니다.
미로를 숨기는 AI 생물이 있습니다. 미로 모양에 따라 길을 가고 싶습니다.

이제 내가 사용할 수있는 두 가지 가능성이 있습니다. 먼저 미로가 만들어지면 원하는 여러 경로를 계산하는 것입니다.
두 번째는 생물이 숨어지기 시작할 때 계산해야 할 경로를 한 번 계산하는 것입니다.

나의 주요 관심사는 로딩 시간입니다. 미로를 만들 때 많은 경로를 계산하면 사전로드 시간이 약간 길기 때문에 필요할 때 계산하는 방법을 생각했습니다.
현재 게임이 '무거운'것이 아니기 때문에 중간 게임에서 경로를 계산하는 것은 눈에 띄지 않지만 더 복잡해지면 두려워 할 것입니다.

모든 제안, 의견, 의견이 도움이 될 것입니다.

편집하다:

현재, p미리 계산 된 경로의 수를 보자면, 생물체는 기존 경로 대신 새로운 경로 (경로 계산을 의미 함) 1/p를 취할 가능성이 있습니다 . 물론 경로가 완전히 계산 될 때까지 생물은 순찰을 시작하지 않으므로 그 과정에서 살해 될 염려가 없습니다.


8
이 시점에서 사전 최적화됩니다. 문제가 생길 때까지 그대로 둡니다.
존 맥도날드

3
그리고 @JohnMcDonald와 약간의 차임으로 게임 도중 이러한 경로를 계산할 수 있고 눈에 띄지 않으면로드 타임에 얼마나 많은 기여를 할 수 있습니까?
James

답변:


6

BerickCook은 아이디어를 올바르게 표현했습니다. 제대로 작동하면 계산을 그대로 두십시오.

이전에 계산을 수행 할 수 있고 게임 중간에 필요하지 않다고 확신 할 경우 이전에 수행하십시오. 그렇지 않으면로드 후 수행하십시오. 게임 중 계산이 눈에 띄지 않으면 거기서 할 수 있습니다. 어느 시점에서 복잡성이 진화하고 계산이 너무 무거워지면 최적화가 시작됩니다.

그러나 한 가지 : 게임 중반 실행을 위해 계산이 구현되면 언제든지로드하는 동안 항상 계산을 수행 할 수 있습니다.

수많은 솔루션이 있습니다 :

  • 레벨 생성 /로드 중 경로 계산 /로드
  • 경로를 계산하기 위해 두 번째 스레드를 사용하십시오
  • 알고리즘 최적화
  • 스레딩에 액세스 할 수없는 경우 인터럽트 가능 시스템을 사용하십시오.

대중 시장 게임에서 마지막 옵션을보고 사용했습니다. 계산을 다시 시작하는 데 필요한 모든 데이터를 올바르게 저장하고 계산하는 동안 남은 시간 / 작동을 정기적으로 확인하십시오.

경우에 따라, 인터럽트 가능 시스템은 계산이 종료되기 전에 이벤트에 사용될 수있는 예비 및 부분 솔루션을 제공 할 수 있습니다.


편집 : @Keeper 응답

"인터럽터 블 알고리즘"은 우리가 가진 제약 때문에 유용했습니다. 기본적으로 우리는 멀티 스레딩이 부족하다고 고심했습니다.

한 시점에서 우리는 AI가 여러 사전을 기반으로 많은 양의 움직임을 계산 해야하는 게임을했습니다. 이 계산 중에 사전이 더 많은 데이터로 확장되고 데이터를 보유한 데이터 세트가 변경되어 게임이 멀티 플레이어에 맞게 조정될 때 (AI가 플레이어의 움직임에도 상호 작용해야하는 경우) 효율성이 떨어지기 때문에 모든 애니메이션이 중지됩니다. 게임 루프에 사용할 수있는 스레드는 하나뿐입니다 (다중 플랫폼 코드는 지원되는 모든 플랫폼에서 실행되어야 함). 이 시점에서 계산 알고리즘을 중단하여 중단시킬 수 있도록 결정했습니다. 따라서 변수를 저장할 수 없기 때문에 재귀 시스템을 사용할 수 없었습니다. 함수는 필요한 모든 변수와 부모 및 자식 개체에 대한 포인터를 보유한 개체로 대체되었습니다. 나는

  • 현재 계산 상태를 저장
  • 루프의 끝 또는 루프 중 (자식 객체가 중단 된 경우) 인터럽트
  • 시간이 지나면 종료
  • 올바른 인덱스에서 루프를 다시 시작하거나 현재 하위 스택의 최상위에있는 하위 개체를 호출하는 것을 중지 한 위치에서 다시 시작합니다.
  • 계산이 중단되면 모든 것을 청소하십시오
  • 최상의 부분 결과를 제공하십시오.

가장 비싼 작업 만 별도의 개체로 분리되어 계산을 중지 할 수있는 적절한 장소를 찾는 데 시간이 걸렸지 만 결국에는 잘 작동합니다.

우리는 성능을 잃었지만, 모든 플랫폼에서 애니메이션이 원활하게 실행되면서 사용자에게인지 된 성능이 훨씬 좋아졌습니다. 또한 나중에 필요할 때 여러 인스턴스를 병렬로 실행할 수있었습니다.

물론 이제는 iPhone 및 iPad에서 게임이 필요하지 않으므로 두 번째 스레드를 사용하는 것이 이상적입니다. 그러나 코드가 여전히 있다고 생각합니다.


고마워요, 정말 흥미로워 요. "인터럽터 블 시스템"(이유 및 방법) 개념에 대해 자세히 설명해 주시겠습니까? (구글링은 그다지 도움이되지 않았습니다 ..). 질문에 세부 사항을 추가하겠습니다.
Keeper

@Keeper 중단 가능한 부분에 대한 귀하의 질문에 답변 되었기를 바랍니다. 그것은 고통 스럽지만해야 할 일이며 대부분의 현대 시스템에는 관련이 없습니다.
코요테

지금은이 방법을 사용하지 않더라도 새로운 것에 눈을 opened습니다. 귀하의 답변을 수락 할 가치가 있습니다.
Keeper

8

현재로서는 게임 도중 경로를 계산하는 것이 눈에 띄지 않기 때문에 이상적인 방법입니다. /가 계산에 의해 게임 플레이가 중단되는 지점에 도달하면 레벨이로드되기 전에 경로 별 계산으로 전환합니다.

초기 로딩 시간이 길어도 용서할 수 있지만 일반적으로 플레이 중 임의의 FPS 변동은 없습니다.


2

요즘 거의 모든 PC에 둘 이상의 CPU 코어가 있으므로 계산을 두 번째 스레드로 옮기는 것이 하나의 가능성입니다.

기본 프로세스는 다음과 같습니다.

  • 생물이 경로를 요청하면 스레드 안전 요청 큐에 요청을 추가하고 스레드에게 신호를 보냅니다.
  • 스레드가 해당 큐에서 항목을 팝하고 처리하여 완료된 목록에 놓기를 기다리면서 생물은 유휴 상태입니다.
  • 각 프레임은 메인 스레드에서 완성 된 목록을 확인하고 완성 된 경로를 생물체에 할당합니다.

몇 가지 추가 엣지 사례도주의해야합니다 (예 : 요청이 처리되기 전에 생물이 죽는 경우).


2
스레딩을 도입하지 않으려는 경우 경로를 점진적으로 계산할 수도 있습니다 (예 : 프레임마다 몇 단계를 계산).
bummzack
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.