ios cocos2d FPS過低的解決方法

OpenSoucre發表於2013-11-15

每當執行程式時,左下角的FPS就低到了10,使app很卡,

原來程式主要卡的部分

-(void)draw{
    NSDate *startTime = [NSDate date];
   [self func];   //func為呼叫的函式
    NSLog(@"time:%f",-[startTime timeIntervalSinceNow]);
}

結果顯示的時間遠遠超過了1.0/60,(1.0/60為AppDelegate.m中的[director_setAnimationInterval:1.0/60] 設定的FPS

由於[self func]比較耗時超過了1.0/60,故考慮將函式func分解成幾個函式,如func0,func1,func2等,同時增加了一個變數excPart = 0(用於決定執行哪個函式)

和幾個儲存func0,func1,func2相關資訊的成員變數,將函式func儘可能的分解,使其每個函式的執行時間在1.0/60左右

-(void)draw{
    NSDate *startTime = [NSDate date];
    switch(excPart){
        case 0:
            [self func0];
            excPart++;
             NSLog(@"time0:%f",-[startTime timeIntervalSinceNow]);
            break;
        case 1:
               [self func1];
            excPart++;
            NSLog(@"time1:%f",-[startTime timeIntervalSinceNow]);
            break;
        case 2:
             [self func2];
            excPart = 0;
            NSLog(@"time2:%f",-[startTime timeIntervalSinceNow]);
            break;
        defalut:
            break;
    }
}

使time0,time1,time2儘可能在1.0/60左右,可以藉助增加成員變數的來分解函式

如果想使func只執行一次,可以增加成員變數Bool isExc = false

-(void)draw{
    if (isExc == true){
        NSDate *startTime = [NSDate date];
        switch(excPart){
            case 0:
                [self func0];
                excPart++;
                 NSLog(@"time0:%f",-[startTime timeIntervalSinceNow]);
                break;
            case 1:
                   [self func1];
                excPart++;
                NSLog(@"time1:%f",-[startTime timeIntervalSinceNow]);
                break;
            case 2:
                 [self func2];
                excPart = 0;           
                isExc = false;    //結束執行
                NSLog(@"time2:%f",-[startTime timeIntervalSinceNow]);
                break;
            defalut:
                break;
        }
    }
}

解決此問題主要關注FPS和draw函式所消耗時間的關係

 

相關文章