我制作了一个可以在OpenGL和Metal之间轻松切换的框架。我注意到当我在OpenGL上时,动画要比在Metal上平滑。在“金属”下,我以速率查看drawInMTKView,它恰好是60 fps。我平均要花8毫秒(平均)来完成drawInMTKView中的所有操作(因此以commandBuffer.commit结尾),这比16毫秒要少得多。如此看来,在drawInMTKView之外的GPU中有一些工作是我看不到的,这使动画无法以60 fps的速度正常工作。如何准确测量我的应用的帧速率?什么能解释当每16毫秒精确调用一次drawInMTKView时,我的动画并不比OpenGL平滑?

注意:我不是在Xcode下,而是在多平台开发工具下

最佳答案

您可以使用自定义FPS计数器。

FPS.hpp:

#ifndef FPS_hpp
#define FPS_hpp

#include <stdio.h>

class FPS
{
public:
    FPS(float interval);
    void getFPS(double time, float *out);
};

#endif /* FPS_hpp */


FPS.cpp:

#include "FPS.hpp"

float UpdateInterval = 0.5f;
float accum = 0.0f;
int frames = 0;
float timeLeft;

FPS::FPS(float interval)
{
    UpdateInterval = interval;
    timeLeft = UpdateInterval;
}

double previousTime;
void FPS::getFPS(double time, float *out)
{
    float deltaTime = time - previousTime;
    previousTime = time;

    timeLeft -= deltaTime;
    accum += 1 / deltaTime;
    ++frames;

    if(timeLeft <= 0.0)
    {
        float fps = accum/frames;
        *out = fps;

        timeLeft = UpdateInterval;
        accum = 0;
        frames = 0;
     }
}


用法:

#import "FPS.hpp"
FPS *fps;


void init()
{
   fps = new FPS(0.3f);
}


[commandBuffer addCompletedHandler:^(id<MTLCommandBuffer> buffer)
 {
        float fpsa = 0;
        fps->getFPS(buffer.GPUEndTime, &fpsa);
        if(fpsa != 0) NSLog(@"%f", fpsa);
}];

关于ios - 如何获得 Metal 的确切帧频?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58904361/

10-13 02:37