BerickCook은 아이디어를 올바르게 표현했습니다. 제대로 작동하면 계산을 그대로 두십시오.
이전에 계산을 수행 할 수 있고 게임 중간에 필요하지 않다고 확신 할 경우 이전에 수행하십시오. 그렇지 않으면로드 후 수행하십시오. 게임 중 계산이 눈에 띄지 않으면 거기서 할 수 있습니다. 어느 시점에서 복잡성이 진화하고 계산이 너무 무거워지면 최적화가 시작됩니다.
그러나 한 가지 : 게임 중반 실행을 위해 계산이 구현되면 언제든지로드하는 동안 항상 계산을 수행 할 수 있습니다.
수많은 솔루션이 있습니다 :
- 레벨 생성 /로드 중 경로 계산 /로드
- 경로를 계산하기 위해 두 번째 스레드를 사용하십시오
- 알고리즘 최적화
- 스레딩에 액세스 할 수없는 경우 인터럽트 가능 시스템을 사용하십시오.
대중 시장 게임에서 마지막 옵션을보고 사용했습니다. 계산을 다시 시작하는 데 필요한 모든 데이터를 올바르게 저장하고 계산하는 동안 남은 시간 / 작동을 정기적으로 확인하십시오.
경우에 따라, 인터럽트 가능 시스템은 계산이 종료되기 전에 이벤트에 사용될 수있는 예비 및 부분 솔루션을 제공 할 수 있습니다.
편집 : @Keeper 응답
"인터럽터 블 알고리즘"은 우리가 가진 제약 때문에 유용했습니다. 기본적으로 우리는 멀티 스레딩이 부족하다고 고심했습니다.
한 시점에서 우리는 AI가 여러 사전을 기반으로 많은 양의 움직임을 계산 해야하는 게임을했습니다. 이 계산 중에 사전이 더 많은 데이터로 확장되고 데이터를 보유한 데이터 세트가 변경되어 게임이 멀티 플레이어에 맞게 조정될 때 (AI가 플레이어의 움직임에도 상호 작용해야하는 경우) 효율성이 떨어지기 때문에 모든 애니메이션이 중지됩니다. 게임 루프에 사용할 수있는 스레드는 하나뿐입니다 (다중 플랫폼 코드는 지원되는 모든 플랫폼에서 실행되어야 함). 이 시점에서 계산 알고리즘을 중단하여 중단시킬 수 있도록 결정했습니다. 따라서 변수를 저장할 수 없기 때문에 재귀 시스템을 사용할 수 없었습니다. 함수는 필요한 모든 변수와 부모 및 자식 개체에 대한 포인터를 보유한 개체로 대체되었습니다. 나는
- 현재 계산 상태를 저장
- 루프의 끝 또는 루프 중 (자식 객체가 중단 된 경우) 인터럽트
- 시간이 지나면 종료
- 올바른 인덱스에서 루프를 다시 시작하거나 현재 하위 스택의 최상위에있는 하위 개체를 호출하는 것을 중지 한 위치에서 다시 시작합니다.
- 계산이 중단되면 모든 것을 청소하십시오
- 최상의 부분 결과를 제공하십시오.
가장 비싼 작업 만 별도의 개체로 분리되어 계산을 중지 할 수있는 적절한 장소를 찾는 데 시간이 걸렸지 만 결국에는 잘 작동합니다.
우리는 성능을 잃었지만, 모든 플랫폼에서 애니메이션이 원활하게 실행되면서 사용자에게인지 된 성능이 훨씬 좋아졌습니다. 또한 나중에 필요할 때 여러 인스턴스를 병렬로 실행할 수있었습니다.
물론 이제는 iPhone 및 iPad에서 게임이 필요하지 않으므로 두 번째 스레드를 사용하는 것이 이상적입니다. 그러나 코드가 여전히 있다고 생각합니다.