2012-10-10 51 views
0

我想運行一個操作並同時繼續處理遊戲邏輯,但是當進程正在進行時,操作會中斷。我試圖使用線程,但我無法使它工作。當不需要處理遊戲邏輯時,精靈將按照我的預期移動,但是當需要在動作期間進行一些操作時,動作會在操作期間中斷。操作結束後,操作正在進行。 我在做什麼錯?cocos2d-iphone操作被正在進行的操作中斷

我按如下方式調用選擇器 - 選擇器啓動該操作。

[NSThread detachNewThreadSelector:@selector(moveSprite:) 
         toTarget:self 
         withObject:[NSDictionary dictionaryWithObjectsAndKeys: 
                sprite, @"sprite", 
                [NSValue valueWithCGPoint:pos], @"pos", 
                nil]]; 


-(void) moveSprite: (NSDictionary*) parameters { 
    CCSprite *sprite = [parameters objectForKey:@"sprite"]; 
    CGPoint pos = [[parameters objectForKey:@"pos"] CGPointValue]; 
    id actionMove = [CCMoveTo actionWithDuration:0.4f position:pos]; 
    id actionMoveDone = [CCCallFuncND actionWithTarget:self selector:@selector(removeSprite:data:) data:(__bridge void*)sprite]; 
    [sprite runAction:[CCSequence actions:actionMove, actionMoveDone, nil]]; 
} 

行動結束後,我通過以下方法刪除精靈。

-(void) removeSprite: (id)sender data:(void*)data { 
    CCSprite *sprite = (__bridge CCSprite*)data; 
    [self removeChild:sprite cleanup:YES]; 
} 
+0

此外,您還需要顯示導致該塊的遊戲邏輯部分。停止渲染遊戲必須非常緊張。 –

+0

我不知道接受的理由。感謝您的警告。 – beyax

回答

0

首先,它是沒有意義的在單獨的線程中創建動作。操作被添加到節點,並且節點及其動作在主線程上更新。

你也應該知道,只有線程如果設備有兩個或兩個以上的CPU核心幫助你。在單個核心設備(iPhone 4或更早版本,iPod Touch 4或更早版本,iPad 1)上運行單獨執行重型操作的線程時,如果不暫停主線程,仍然會減速。

如果你的遊戲邏輯很重,那麼它實際上暫停屏幕更新,你需要優化你正在做的任何事情。您可以將計算分散在多個框架中,配置文件以查看是否可以優化,或者如果您使用暴力方法研究更聰明,更簡單但更快的算法。

+0

我在可變數組上迭代,並使用對象的屬性進行比較,我也創建了新的可變數組。我猜數組操作暫停主線程。我會盡力優化操作。 – beyax

0

的Cocos2D是主線程上運行,你的繁重的操作運行有太多,所以你正在經歷是很正常的。

你應該要麼使塔的操作更輕,或使用線程,所以你CCActions代碼是不是你應該尋找,因爲你知道它的工作原理確定沒有昂貴的操作

+0

其實我以爲當我爲初始化動作的方法創建一個線程時,這個動作就會和主線程並行工作,並且動作不會被主線程中斷。我是否也應該使用線程進行其他操作? – beyax

+0

避免使用線程並使您的昂貴功能首先打開會更好。 – yannicuLar