Я работаю над игрой с движком, который обновляется 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,000011 мс?
Есть ли что-то особенно неправильное в моем коде? Или есть альтернативный механизм синхронизации, который я должен использовать?