我一直在开发一款引擎每秒更新 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 发生了什么?
我的代码有什么看起来特别错误的地方吗?还是我应该使用另一种计时机制?