2012-03-20 5 views
1
나는 다음과 같은 제약, 두 DrawableGameComponents B가 XNA 프로젝트를 개발하고

:멀티 스레딩 XNA GameComponents

  • 중 하나이 볼 수 , 또는 B이 표시됩니다. 따라서 "그리기"메서드 중 하나만 호출해야합니다.
  • 모두 사용 가능해야합니다. 따라서 "업데이트"메소드는 모든 상황에서 호출되어야합니다.

현재 모두 B 과 동일한 스레드에서 실행된다. 그러나 그 중 "업데이트"방법은 매우 CPU 집약적입니다. 두 GameComponents는 서로 이야기 할 필요가 없으며 두 GameComponent가 어떤 데이터도 공유 할 필요가 없으므로 쉽게 이들을 병렬 처리 할 수 ​​있습니다.

내가 알고 싶은 것은 XNA에서이를 수행하는 방법입니다. "Update"및 "Draw"메서드는 XNA Framework에서 호출하므로 Thread를 어디에 둘 것인지 알 수 없습니다. 이 작업을 수행하는 표준 방법이 있습니까?

+0

멀티 스레딩은 PC보다 xbox360에서 약간 다릅니다. 그것은 약간 다르게 코딩해야합니다. 이 타겟팅은 둘 중 하나 또는 다른 하나 또는 둘 모두를 대상으로합니까? 또한 PC 용인 경우 멀티 코어 CPU를 가지고있는 사용자가 없습니다. 단일 코어 CPU를 사용하는 경우 멀티 스레딩은 시간을 절약하고 저장하지는 않습니다. –

+0

대상 컴퓨터는 PC 전용입니다.이 프로젝트는 게임이 아니며 많은 코어를 실행하는 머신이 하나만있을 것이므로 일반적으로 멀티 스레딩에는 문제가 없습니다. – Christian

답변

1

보통이는 Game1 클래스 (기본 클래스)

xnadevelopment 게임 상태를 살펴 타고 Update() 및/또는 다른 클래스의 Draw() (게임 구성 요소)를 호출하는 데 사용되는 게임 상태 Managment를 통해 이루어집니다 managment 튜토리얼, 그들은 다른 클래스의 다른 업데이트와 호출을 호출하는 방법을 설명하고, 멀티 스레딩이 Game1 클래스 (기본 자동 생성 된 XNA 클래스)에서 구현 될 수 있음을 알 수 있습니다.

ps 독서를 많이하는 것이 마음에 들지 않는다면 XNA 멀티 스레딩에 대해 article을 살펴보십시오.이 다이어그램에는 작동 원리를 설명하는 몇 가지 다이어그램이 있습니다.

+0

흠, 튜토리얼은 게임 상태에 대해서만 다룹니다. 내 프로젝트에는 두 개의 DrawableGameComponents가 있습니다. 그들은 그들 자신의 Update/Draw를 가지고있다. Game 클래스 내에서 다음과 같은 구성 요소 만 추가합니다. Components.Add (new MyGameComponentA (this)); 프레임 워크는 모든 업데이트/그리기 호출을 처리합니다. – Christian

+0

당신은 Game1 클래스에서 두 개의 스레드를 생성 할 수 있습니다 (프레임 워크는 Game1.cs의 Update() 및 Draw()를 호출하고 스레드 객체는 비공개이지만 전체 클래스에서 볼 수 있습니다 (클래스 수준 변수) 그리고 각 스레드는 Update() 메서드 내에서 실행되며 둘 다 병렬로 실행됩니다. 이 설명이 귀하의 상황에보다 적합하기를 바랍니다. –

+0

그렇다면 어떻게 든 동기화해야합니다. 나는 이것을 시도 할 것이다. – Christian

0

두 업데이트를 동시에 실행해야하는 경우를 지정하지 않았으므로 하나의 구성 요소 만 그려야한다는 가정을하지 않겠습니다. 그런 다음

componentOne = new FirstComponenet(this); 
Components.Add(componentOne); 
componentTwo = new SecondComponent(this); 
Components.Add(componentTwo); 
// Immediately disable componetTwo 
componentTwo.Enabled = false; // Prevents Update from firing 
componentTwo.Visible = false; // Prevents Draw from firing (for Drawable components only) 

당신이 XNA 관리하도록 할 수 있습니다 : 당신은 같은 저장 참조없이 인스턴스화하는 대신 각 구성 요소에 대한 참조를 저장하는 경우

DrawableGameComponents를 사용하여 그들은 자동으로 귀하의 Game 객체와 동기화되지만, 업데이트/그리기 루프는 정상적으로 수행됩니다. componentOnecomponentTwo은 클래스 수준 변수이므로 각 변수가 활성 상태 일 때 관리 할 수 ​​있습니다.

다시 말하지만, 이것은 다른 사용자와 동시에 업데이트 할 필요가 없다는 전제에 기반합니다.