cocos2d-x子線程渲染問題。

緣由有2個: 多線程

一、在子線程中是不能進行UI 更新的,而能夠更新的結果只是一個幻像:由於子線程代碼執行完畢了,又自動進入到了主線程,執行了子線程中的UI更新的函數棧,這中間的時間很是的短,就讓你們誤覺得分線程能夠更新UI。若是子線程一直在運行,則子線程中的UI更新的函數棧 主線程沒法獲知,即沒法更新
 
二、只有極少數的UI能,由於開闢線程時會獲取當前環境,如點擊某個按鈕,這個按鈕響應的方法是開闢一個子線程,在子線程中對該按鈕進行UI 更新是能及時的,如換標題,換背景圖,但這沒有任何意義
  ide

一、程序一開始運行就進入了主線程
 
二、處理某些數據太過費時,影響用戶交互,能夠開闢子線程處理,而後通知主線程進行界面更新
 
測試代碼:
 
開闢一個多線程,直接在子線程裏進行ui 更新:
 
-(void)testUIRefresh:(UIButton *)button{ 函數

       [NSThread detachNewThreadSelector:@selector(beginTest) toTarget:self withObject:nil]; oop

}
 
-(void)beginTest {
       NSLog(@」 當前線程  %@」,[NSThread currentThread]); 測試

       NSLog(@」 主線程    %@」,[NSThread mainThread]); ui

      //該button 爲  響應 testUIRefresh的button 線程

       [self.button setTitle:@"AAA" forState:0]; 生命週期

}
  get

2012-11-15 12:14:02.147 TestProj[2455:1b07]  當前線程  {name = (null), num = 3}
 
2012-11-15 12:14:02.147 TestProj[2455:1b07]  主線程    {name = (null), num = 1}
 
結果:當前的確是在子線程中,可是UI立刻更新了?? it

結果分析:你們都說UI更新在主線程中作,上面的結果怎麼解釋

假設:若是在子線程裏作了UI更新,待子線程運行完畢,程序自動進入 主線程進行指定的ui更新!

問題:若是子線程沒結束呢?

在分線程中加入:
-(void)beginTest{
      NSLog(@」 當前線程  %@」,[NSThread currentThread]);

      NSLog(@」 主線程    %@」,[NSThread mainThread]);

      //該button 爲  響應 testUIRefresh的button

      [self.button setTitle:@"AAA" forState:0];

      [NSThread sleepForTimeInterval:4.0];

}
 
結果:

self.button的title仍是立刻更新了

結果分析:難道上面的假設不成立?

問題:此次在分線程中add 一個button

-(void)beginTest{

      NSLog(@」 當前線程  %@」,[NSThread currentThread]);

      NSLog(@」 主線程    %@」,[NSThread mainThread]);

      //該button 爲  響應 testUIRefresh的button
      [self.button setTitle:@"AAA" forState:0];
      UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
      [backButton setTitle:@"測試runloop" forState:0];
      [backButton setTitleColor:[UIColor redColor] forState:0];
      backButton.frame = CGRectMake(100, 200, 100, 50);
      [backButton addTarget:self action:@selector(testRunLoop)   forControlEvents:UIControlEventTouchUpInside];
      [self.window addSubview:backButton];
      [NSThread sleepForTimeInterval:4.0];

}   結果:[self.button setTitle:@"AAA" forState:0];立刻響應了,可是添加的這個Button卻一直等到線程結束才繪製出來   分析:在子線程中:若是要對其餘UI 進行更新,則必須等到該子線程運行結束,而對響應用戶點擊的Button的UI更新則是及時的!無論他是在主線程仍是在子線程中作的更新,意義都不大了,由於子線程中對全部其餘ui更新都要等到該子線程生命週期結束才進行。       結論:   一、在子線程中是不能進行UI 更新的,而能夠更新的結果只是一個幻像:由於子線程代碼執行完畢了,又自動進入到了主線程,執行了子線程中的UI更新的函數棧,這中間的時間很是的短,就讓你們誤覺得分線程能夠更新UI。若是子線程一直在運行,則子線程中的UI更新的函數棧 主線程沒法獲知,即沒法更新   二、只有極少數的UI能,由於開闢線程時會獲取當前環境,如點擊某個按鈕,這個按鈕響應的方法是開闢一個子線程,在子線程中對該按鈕進行UI 更新是能及時的,如換標題,換背景圖,但這沒有任何意義

相關文章
相關標籤/搜索