更新:
我在这里意识到一个XY问题。我真正想要的是在
draw
的MTKView
方法中获取时间步长。为此,我尝试使用 C clock()
函数来跟踪时间。
我注意到,如果我尝试在
clock()
中的 draw
方法中使用 MTKView
,时间将关闭大约 10 倍。
最小可重现示例:
在 Xcode 中创建一个新的 'Metal' 游戏模板。应该渲染旋转的彩色立方体的那个。然后,在每帧更新的
draw
方法中,添加行:
// Objective-C
printf("%f\n", (double)clock()/CLOCKS_PER_SEC);
// Swift
print(Double(clock())/Double(CLOCKS_PER_SEC))
构建并观察打印的数字和控制台。
问题:
数字以不规则且缓慢的速度增加(大约每秒 0.1 个),而不是稳定地每秒增加 1 个。
为什么
clock()
功能在与 Metal 游戏结合使用时会中断?更重要的是,我可以用什么来计算 Metal 中帧更新的时间步长?
研究:
关于将
clock()
与Metal游戏一起使用,或者关于如何在draw
的MTKView
方法中获取帧更新的时间步长,我可以找到零。
来自苹果文档:
您可以使用命令缓冲区的 GPUEndTime 和 GPUStartTime 计算 GPU 运行时间的属性 命令缓冲区:
__block dispatch_semaphore_t block_sema = _inFlightSemaphore;
[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer)
{
CFTimeInterval start = buffer.GPUStartTime;
CFTimeInterval end = buffer.GPUEndTime;
CFTimeInterval gpuRuntimeDuration = end - start;
printf("%f \n", gpuRuntimeDuration);
dispatch_semaphore_signal(block_sema);
}];
问题:数字以不规则且缓慢的速度增长(大约0.1 每秒)而不是稳定的每秒 1。
正确执行:
clock_t c = clock();
/* .... */
printf("Time: %g sec.\n", (double)(clock() - (c)) / CLOCKS_PER_SEC);