0

我一直在开发一款引擎每秒更新 20 次的游戏。我现在必须指出我想从哪里开始获取一些性能数据并调整渲染和逻辑更新。为了做到这一点,我开始在我的游戏循环中添加一些计时代码,实现如下......

NSDate* startTime = [NSDate date];
// Game update logic here....
// Also timing of smaller internal events
NSDate* endTime = [NSDate date];
[endTime timeIntervalSinceDate:startTime];

然而,我注意到,当我在外部计时逻辑中对块进行计时时,它们执行的时间并没有与总时间相匹配。

所以我写了一个小单元测试来演示这个问题,我计算了完成测试所花费的总时间,然后是 10 个较小的事件,这里是......

- (void)testThatSumOfTimingsMatchesOverallTiming {

NSDate* startOfOverallTime = [NSDate date];

// Variable to hold summation of smaller timing events in the upcoming loop...
float sumOfIndividualTimes = 0.0;
NSTimeInterval times[10] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
for (int i = 0; i < 10; i++) {
    NSDate* startOfIndividualTime = [NSDate date];
    // Kill some time...
    sleep(1);
    NSDate* endOfIndividualTime = [NSDate date];
    times[i] = [endOfIndividualTime timeIntervalSinceDate:startOfIndividualTime];
    sumOfIndividualTimes += times[i];
}

NSDate* endOfOverallTime = [NSDate date];
NSTimeInterval overallTimeTaken = [endOfOverallTime timeIntervalSinceDate:startOfOverallTime];

NSLog(@"Sum of individual times: %fms", sumOfIndividualTimes);
NSLog(@"Overall time: %fms", overallTimeTaken);

STAssertFalse(TRUE, @"");
}

这是输出...

Sum of individual times: 10.001377ms
Overall time: 10.016834ms

这很清楚地说明了我的问题。总时间为 0.000012 毫秒,但较小的事件只用了 0.000001 毫秒。那么其他 0.000011ms 发生了什么?

我的代码有什么看起来特别错误的地方吗?还是我应该使用另一种计时机制?

4

1 回答 1

1

好吧,运行需要一些时间[NSDate date][endTime timeIntervalSinceDate:startDate]这可能是造成差异的原因。

但是,我会使用CACurrentMediaTime()which 返回 a CFTimeInterval(它只是一个 double),或者mach_absolute_time()返回一个 unsigned long int。这两者都避免了对象的创建,并且可能需要更少的时间。

当然,您仍将每帧减去两个数字,这需要时间。我的建议是使用 lastFrameEnd:

CFTimeInterval lastFrameEnd = CACurrentMediaTime();
while (true) {
  // Game update logic here....
  // Also timing of smaller internal events
  CFTimeInterval frameEnd = CACurrentMediaTime();
  CFTimeInterval duration = frameEnd - lastFrameEnd;  //Use this
  lastFrameEnd = frameEnd;
}

这考虑了从一帧结束到下一帧结束所用的时间,包括减法和方法调用所用的时间。

于 2010-12-25T18:24:43.530 回答