我用Metal编写了一个简单的点着色器,但它的运行速度非常慢,只有10K点。所有顶点都在交错缓冲区中,它们具有4个字节对齐的属性,但它仍然非常慢(> 70ms CPU和~20ms GPU)。顶点着色器大约需要9毫秒,而片段着色器需要12-13毫秒(!)。
#include <metal_stdlib>
#include <metal_common>
#include <simd/simd.h>
using namespace metal;
typedef struct {
float4 position [[ attribute(0) ]];
float4 color [[ attribute(1) ]];
} Vertex;
typedef struct {
float4x4 mvpMatrix;
} Uniforms;
typedef struct {
float4 position [[ position ]];
float4 color;
float pointSize [[ point_size ]];
} ColorInOut;
constant float POINT_SIZE = 3.0f;
vertex ColorInOut pointCloudVertex(Vertex vert [[ stage_in ]], constant Uniforms& uniforms [[ buffer(1) ]])
{
ColorInOut out;
out.position = uniforms.mvpMatrix * vert.position;
out.pointSize = POINT_SIZE;
out.color = vert.color;
return out;
}
fragment float4 pointCloudFragment(ColorInOut in [[ stage_in ]])
{
return in.color;
};
将CPU放在一边,这真的很奇怪,因为我在需要时重新加载缓冲区,你是否看到任何可能影响GPU性能的东西?
更新:
当我优化了占用大量CPU的独立功能时,GPU使用率也下降了。现在整个着色器在大约1ms内执行。我很想知道GPU时间是否如此之高,因为它正在等待CPU执行下一个周期。