为什么这款Metal Shader在iPhone 6上需要20ms?

时间:2015-03-18 00:18:05

标签: ios shader metal

我用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执行下一个周期。

0 个答案:

没有答案