2013-03-23 109 views
0

我正在爲滾動視圖繪製52個標籤,精靈和按鈕。但是,當我去滾動它是非常滯後的,當我使用滾動視圖。我使用了一個類似的設置,可以在沒有延遲的x和軸上滾動。我正在測試iPhone 5,所以我認爲它可以很容易地處理它。物體需要移動的距離正在被正確計算,並且物體正在被正確地繪製,它實際上是滯後的。繪製代碼:當繪製精靈時Cocos 2D大FPS下降

int cnt = 40;  
    for (NSString *i in [Trucks GetSetTruckList].TruckList){ 
    NSMutableArray *Truck = [[NSMutableArray alloc] initWithArray:[TruckDict objectForKey:i]]; 
    CGSize s = [[CCDirector sharedDirector] winSize]; 


    CCMenuItemImage *BuyButton = [CCMenuItemImage itemWithNormalImage:@"Buy.jpg" selectedImage:@"Buy.jpg"block:^(id sender) {[self BuyTruck:Truck]; }]; 
    BuyButton.position = ccp((s.width/2) - 20 , (s.height/2) - cnt + ShopPointX); 
    BuyButton.scale = .5; 

    CCLabelTTF *Name = [CCLabelTTF labelWithString:[Truck objectAtIndex:0] fontName:@"Marker Felt" fontSize:19]; 
    Name.position = ccp(100, (s.height) - cnt + ShopPointX); 

    CCLabelTTF *NumPeople = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"Ppl: %@" , [Truck objectAtIndex:2]] fontName:@"Marker Felt" fontSize:13]; 
    NumPeople.position = ccp(200, (s.height) - cnt + ShopPointX); 

    CCLabelTTF *NumCrate = [CCLabelTTF labelWithString:[NSString stringWithFormat:@"Crgo: %@" , [Truck objectAtIndex:1]] fontName:@"Marker Felt" fontSize:13]; 
    NumCrate.position = ccp(270, (s.height) - cnt + ShopPointX); 

    CCSprite *Pic = [CCSprite spriteWithFile:[Truck objectAtIndex:5]]; 
    Pic.position = ccp(340, (s.height) - cnt + ShopPointX); 
    Pic.scale = .3; 

    CCMenu *Menu = [CCMenu menuWithItems:BuyButton, nil]; 
    cnt = cnt + 40; 

    [self addChild:Pic]; 
    [self addChild:Menu]; 
    [self addChild:Name]; 
    [self addChild:NumCrate]; 
    [self addChild:NumPeople]; 
    StartShop = 1; 
} 
+0

我沒有使用UIScrollView。 – 2013-03-23 21:41:46

回答

0

您可能會有滯後,因爲OpenGL正在爲每個精靈進行一次單獨的繪圖調用。你把精靈放進'CCSpriteBatchNode'嗎?它看起來像所有的孩子都被添加到'自我'中。如果使用批處理節點,OpenGL可以對每個CCSpriteBatchNode執行一次「繪製」調用,無論批處理節點中包含多少個子節點。唯一的問題是所有屬於CCSpriteBatchNode子項的CCSprites都必須共享相同的映像。

這樣做的一種方法是將CCSpriteBatchNodes按照圖像名稱放入NSDictionary,並將每個CCSpriteBatchNode添加到「self」。

// This line assumes usage of a CCSpriteFrameCache to init the sprite, but you can create it some other way. 
    CCSprite *spr = [CCSprite spriteWithSpriteFrameName:spriteName]; 

    CCSpriteBatchNode *batchNode; 
    if([self.batchNodeDictionary objectForKey: spriteName]) { 
     // Acquire the batchnode by image name 
     batchNode = (CCSpriteBatchNode *) [self.batchNodeDictionary objectForKey: spriteName]; 
    } else { 
     // BatchNode for this image doesn't exist yet; therefore, populate a new batch node for the image name 

     batchNode = [CCSpriteBatchNode batchNodeWithFile:spriteNamePNG]; 
     [self addChild:batchNode]; 
     [batchNodesDictionary setObject:batchNode forKey:spriteName]; 


    } 
    [batchNode addChild:spr]; 
+0

我也讀過'預分配'批量節點和精靈,因爲分配和釋放花費內存。所以你可以預先分配1000個精靈,這需要花費更多的時間,但是不需要分配另一個精靈。您只需將'isVisible'設置爲'false'即可預先分配不在屏幕上的精靈。我還沒有實現,但我正計劃儘快在自己的項目中嘗試它。 – Ben 2013-03-24 01:00:42

+0

嗯,我會看看batchNode,看了它多一點後,我認爲這是我的代碼問題,因爲有30個精靈,我停留在60 fps。 – 2013-03-24 01:31:53