0

スクロール ビュー用に 52 個のラベル、スプライト、およびボタンを描画しています。ただし、スクロールビューを使用すると、スクロールに非常に時間がかかります。ラグなしで動作する x 軸と軸をスクロールする同様のセットアップを使用します。私はiPhone 5でテストしているので、非常に簡単に処理できると思います。オブジェクトが移動する必要がある距離は正しく計算されており、オブジェクトは正しく描画されていますが、実際には遅れています。ドローコード:

    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;
}
4

1 に答える 1

0

OpenGLがスプライトごとに個別の描画呼び出しを行っているため、遅延が発生している可能性があります。スプライトを「CCSpriteBatchNode」に入れていますか?すべての子が「自己」に追加されているようです。バッチノードを使用する場合、OpenGLは、バッチノードに含まれる子の数に関係なく、CCSpriteBatchNodeごとに1つの「描画」呼び出しを行うことができます。唯一の落とし穴は、CCSpriteBatchNodeの子であるすべてのCCSpriteが同じ画像を共有する必要があるということです。

これを行う1つの方法は、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];
于 2013-03-23T21:35:27.467 に答える