我制作了一个可以在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/