性能取决于索引类型
Perfomance depending on index type
我正在尝试“绘制”数百万个三角形并发现了一些有趣的东西:将索引类型从 VK_INDEX_TYPE_UINT32
切换到 VK_INDEX_TYPE_UINT16
每秒绘制的三角形数量增加了 1.5 倍!我想知道,速度怎么相差这么大?
我使用间接索引实例化(这么多我)绘图:25个顶点,138个索引(46个三角形),2^21~=2M个实例(我懒得找哪里禁用vSync),每个绘图1次框架。每帧总共 96'468'992 个三角形。为了获得最清晰的结果,我将目光从三角形移开(丢弃光栅化具有几乎相同的性能)
我有非常简单的顶点着色器:
layout(set = 0, binding = 0) uniform A
{
mat4 cam;
};
layout(location = 0)in vec3 inPosition;//
layout(location = 1)in vec4 inColor; //Color and position are de-interleaved
layout(location = 2)in vec3 inGlob; //
layout(location = 3)in vec4 inQuat; //data per instance, interleaved
layout(location = 0)out vec4 fragColor;
vec3 vecXquat(const vec3 v, const vec4 q)
{// function rotating vector by quaternion
return v + 2.0f *
cross(q.xyz,
cross(q.xyz, v)
+ q.w * v);
}
void main(){
gl_Position = vec4(vecXquat(inPosition, inQuat)+inGlob, 1.0f)*cam;
fragColor = inColor;
}
和直通片段着色器。
基元 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
结果:
~1950MTris/s 32 位索引
~2850MTris/s 16 位索引
GPU - GTX1050Ti
由于您的着色器非常简单,因此您的渲染性能可能会受到一些其他因素的影响,例如顶点数据传输率。
GPU 必须为每个实例读取 138 个索引。如果有 200 万个实例,那么只有 1.02GB 的索引数据必须由具有 32 位索引的 GPU 读取。当然,对于 16 位索引,传输速率减半。使用一半的数据,索引数据更有可能完全适合顶点拉取缓存。
我正在尝试“绘制”数百万个三角形并发现了一些有趣的东西:将索引类型从 VK_INDEX_TYPE_UINT32
切换到 VK_INDEX_TYPE_UINT16
每秒绘制的三角形数量增加了 1.5 倍!我想知道,速度怎么相差这么大?
我使用间接索引实例化(这么多我)绘图:25个顶点,138个索引(46个三角形),2^21~=2M个实例(我懒得找哪里禁用vSync),每个绘图1次框架。每帧总共 96'468'992 个三角形。为了获得最清晰的结果,我将目光从三角形移开(丢弃光栅化具有几乎相同的性能)
我有非常简单的顶点着色器:
layout(set = 0, binding = 0) uniform A
{
mat4 cam;
};
layout(location = 0)in vec3 inPosition;//
layout(location = 1)in vec4 inColor; //Color and position are de-interleaved
layout(location = 2)in vec3 inGlob; //
layout(location = 3)in vec4 inQuat; //data per instance, interleaved
layout(location = 0)out vec4 fragColor;
vec3 vecXquat(const vec3 v, const vec4 q)
{// function rotating vector by quaternion
return v + 2.0f *
cross(q.xyz,
cross(q.xyz, v)
+ q.w * v);
}
void main(){
gl_Position = vec4(vecXquat(inPosition, inQuat)+inGlob, 1.0f)*cam;
fragColor = inColor;
}
和直通片段着色器。
基元 - VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST
结果:
~1950MTris/s 32 位索引
~2850MTris/s 16 位索引
GPU - GTX1050Ti
由于您的着色器非常简单,因此您的渲染性能可能会受到一些其他因素的影响,例如顶点数据传输率。
GPU 必须为每个实例读取 138 个索引。如果有 200 万个实例,那么只有 1.02GB 的索引数据必须由具有 32 位索引的 GPU 读取。当然,对于 16 位索引,传输速率减半。使用一半的数据,索引数据更有可能完全适合顶点拉取缓存。