2011-01-26 4 views
1

많은 양의 게임 엔티티를 처리하는 자체 게임을 작성하고 있습니다 (수는 ≈1000입니다). 모든 엔티티는 화면에 그려야합니다. 처음에는 C#이 좋은 프레이 메이트를 줄지 확신하지 못했습니다. 그렇지만, 기본적인 컬링을 적용했을 때 훨씬 더 높은 프레임 율에 충격을 받았습니다.엄청난 양의 개체 관리

엔티티에 AI 로직을 추가 할 때마다 모든 객체의 업데이트 시간이 약간의 시간이 걸립니다. 개체가있는 목록이 있고 물마루를 반복하고 obj.Update (dt)를 호출합니다. 이런 식으로 보이는 것이 최선이 아닙니다. "거대한"엔티티의 업데이트에는 많은 ms가 걸릴 수 있으므로 다른 사람이 업데이트를 완료 할 때까지 기다려야합니다.

제 질문은 : 거대한 양의 동적 객체를 관리 할 때 어느 쪽이 더 낫습니까?

+4

은 다중 처리/병렬 처리 옵션을 제공합니까? – TDaver

+7

게임 개발을위한 전용 웹 사이트 인 http://gamedev.stackexchange.com/에 완벽한 콘텐츠로 보입니다. –

+1

가능한 경우 업데이트를 병렬로 수행하는 것을 고려하십시오. – jason

답변

3

문제는 Update 메서드를 호출하는 개체를 반복하는 것입니다. 무언가가 업데이트되지 않으면 어떻게 될까요? 무언가가 없다면 은 모든 프레임마다 업데이트 될이 필요합니까?

더 나은

이 객체가 가입 메인 루프에 이벤트를 추가하고 가지고 : 이제

public void FrameListener(float _ticks); 


public class Game 
{ 
    public Event FrameListener OnFrame; 
} 

, 아무것도 업데이트 할 필요가있을 때마다, 그냥 델타 진드기가 통과 카운트지고 (이 이벤트를 구독 그것을). 객체가 유휴 상태가되면 객체 자체를 구독 취소 할 수 있습니다. 이 방법을 사용하면 업데이트가 필요한 객체 만 업데이트됩니다.

또한 가입 프로세스에 카운터를 추가 할 수 있습니다. 즉, 이벤트 개체에 AddListener() 유형의 메서드를 사용하여 처리 할 수 ​​있으므로 시스템에 모든 'n'프레임을 위임 할 때만 호출합니다. 예를 들어 (정착민, 문명 등) 제작을 할 수있는 게임에서는 이러한 것들이 모든 프레임마다 작품을 업데이트하는 것은 의미가 없습니다. 5 초마다 충분합니다. 이렇게하면 개체를 업데이트해야하는 빈도를 정확하게 정의 할 수있을 때 오버 헤드가 많이 줄어 듭니다.

정적 개체는 절대 대리자를 주입하지 않으므로 오버 헤드가 발생하지 않습니다.

3

먼저 1000 개체는 실제로 거대한이 아닙니다. 60fps에서 60kHz입니다. 이는 객체 당 16μs - 대부분의 하드웨어에서 최소 32,000 클럭 사이클입니다. 일부 오브젝트는 높은 비용을 초래해야합니다.

개체 당 비용을 낮출 수 없다고 가정하면 개체 업데이트에 총 시간 예산을 할당하고 그 시간이 지나면 루프를 중지 할 수 있지만 다음 프레임의 동일한 지점에서 반복하여 랩핑합니다. 끝까지 도달 할 때까지 더 많은 시간이 남아 있다면 처음부터 시작합니다. 간단히 말해, 링 버퍼를 돌아 다니면서 시간이 다 떨어질 때마다 프레임을 렌더링하지 못하게합니다.

+0

감사합니다. C#을 선택했을 때 성능에 대한 정보를 찾으려고했습니다. 그리고 많은 사람들은 게임 개발에 대한 적절한 사례가 아니라고 말합니다. 그래서 나는 1000이 정말 거대하다고 생각했습니다. % -O – joe

+0

@joe : C#은 요즘 꽤 괜찮은 성능을 가지고 있습니다. 아직 잘 만들어진 C++과 동등한 수준은 아니지만 차이점은 시나리오에 관계가 없습니다. 특히, 무거운 GC 성능이 상당히 심하게 아프다. 그래서 나는 당신의 객체 업데이트 코드에서 매번 새로운 것을 매우 황달하게 바라 볼 것이다. 같은 맥락에서 아직 그렇게하지 않았다면 모든 작은 클래스를 구조체로 변환하십시오. –

1

귀하의 문제는 게임 개발과 관련이 없지만 일반 공연 원칙과 관련이 있다고 생각합니다.

아마도 성능을 최적화하는 여러 가지 방법을 모색해야합니다. 다음은 목록이지만 비 포괄적입니다.

  • 멀티 스레딩/병렬 처리 : 매우 우수한 개선을 달성 할 수 있지만 응용 프로그램에 많은 복잡성을 추가 할 수 있습니다.C# 4를 사용하는 경우 새 병렬 라이브러리
  • 을 VS 버전 및 버전에 따라 살펴볼 수 있습니다. 코드 분석을 활성화하거나 VS에서 사용할 수없는 경우 FXcop을 사용할 수 있습니다. 이 도구는 (일반적인 성능 팁 스트링 빌더 VS을 조금 구글 코드의 복잡성, 특히 복잡성을
  • 을 분석
  • 사용 도구를 사용하면 코드의 병목 현상을 발견 할 수있는 도구를 프로파일 링 좋은 조언을
  • 사용을 제공 할 수 있습니다 가치 변수의 사용을 줄이고, 메소드의 파라미터의 순서를 변경 (하드 코딩 성능 팁에 대해 좀 더 구글 콜 그래프를 감소
  • 문자열 연결 등) 등)

더 구체적인 게임 개발자를위한 팁 (게임 개발자의 초보자로부터) 나는 인정한다.) * 하나의 세트 대신에 서브 세트로 객체를 분할하려고 할 때 ... 객체의 그래프 대신 오브젝트의리스트를 갖는 것이 더 효율적일 때가있다. 그래프의 단일 노드를 전체 개체 대신 업데이트 할 수 있습니다. * 가능한 경우 표시되지 않는 개체의 업데이트를 제외하십시오.

+0

유용한 팁 주셔서 감사합니다! 불행히도 나는 하나 이상의 정답을 표시 할 수 없다 ( – joe

+0

pb :) 도움이된다면 기쁩니다. –

관련 문제