如何在 MTKView 绘制方法中获取时间步长?

问题描述 投票:0回答:1

更新:

我在这里意识到一个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
方法中获取帧更新的时间步长,我可以找到零。

time metal clock timestep mtkview
1个回答
0
投票

来自苹果文档

您可以使用命令缓冲区的 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);
© www.soinside.com 2019 - 2024. All rights reserved.