2012-08-26 79 views
2

因此,我開發了一個非常高效的碰撞檢測系統,但問題在於它仍然無法在主線程上運行,因爲它速度太慢。在Xbox 360上通過XNA發佈Thread.SetAffinity和線程問題

我試着設置一些線程,如果線程結束,另一個線程被創建。

if (doneCollisions) 
      { 
       PopulateGrid(); 
      } 


      if (doneCollisions) 
      { 
       Thread thread = new Thread(new ThreadStart(CheckCollisionsGrid)); 

       thread.Start(); 

      } 

void CheckCollisionsGrid() 
{ 
Thread.CurrentThread.SetProcessorAffinity(3); 
      doneCollisions = false; 
      //Increments through all the grids. 
. 
. 
. 
doneCollisions = true; 
} 

現在我注意到一些奇怪的行爲,當調試。當我打電話給Thread.SetAffinity時,它終於開始實際檢查碰撞之前,一遍又一遍地跳回來。

現在我的衝突是通過5-10秒延遲...

如果任何人有洞察力,請輸入一些在這裏。

+0

imho,親和力如此之低,以至於調度程序將「嘗試開始行動」,但會回覆這個問題,因爲有「更好的事情要做」(更高的親和力)... 只有在5-10秒之後調度程序爲您的操作找到一個插槽... – TheHe

+0

@TheHe我認爲SetAffinity set的使用哪個核心?你有什麼建議來改善我的線程?如果我只是創建一個新的線程,它會落後,因爲1核心上的2個線程並不好。 –

+0

aah .. 4sure你是對的...我是@優先事項和其他東西.. 第一:的Xbox有4個處理器?! 秒:勾選這個 - > http://msdn.microsoft.com/en-us/library/windows/desktop/ms684251(v=vs.85).aspx 第三:設置線程優先級更低? – TheHe

回答

0

XBOX 360有3個內核,每個內核有2個硬件線程,總共產生6個硬件線程。 線程0和2由XNA框架保留,剩下1,3,4和5供您使用。

至於這個問題,爲什麼你在檢查碰撞後創建一個新的線程,重新做同樣的事情?如果您需要在線程中重複進行碰撞檢查,只需將其放入while(true)循環中即可繼續。

+0

嗯,我確實按照你所說的做了,除了沒有while(true)循環,這是愚蠢的。 –

+1

不完全愚蠢。創建和拆卸線程是一項昂貴的操作。使用無限循環(我更喜歡(;;))和一些同步原語。 – Simon