问题描述
我正在跟踪性能瓶颈。为了缩小原因,我使用了Xbox ATG Samples回购中的SimpleTrianglePC示例创建了一个测试。
我仅作了几处更改:我将Draw
更改为DrawInstanced
以渲染多个三角形,并修改了顶点着色器以根据SV_InstanceID稍微改变每个三角形的位置和颜色。总共渲染了265个三角形,但在此过程中我的GPU达到了100%:
这是输出。请注意,我将三角形的形状更改为直角三角形。顶部的三角形是黑色的:
该问题似乎与所有三角形都在彼此顶部的事实有关;如果不重叠显示三角形,则不会发生此问题。我已经测试了成千上万个三角形,并且按预期进行,没问题。
为解决这个问题,我尝试了directxtk的各种CommonStates;例如我将混合状态设置为Opaque(),将深度模板状态设置为DepthNone(),将光栅化器状态设置为CullNone()。没有区别。
万一有人在想:我使用的是硬件设备,而不是WARP设备。我的GPU很弱(ASUS EAH 5450),但这不是问题。我确实在这台机器上玩游戏。不应在265个三角形上达到最大值。
这是修改后的顶点着色器。假定默认窗口尺寸为1280 x 720:
struct Vertex
{
float4 position : SV_Position;
float4 color : COLOR0;
uint instanceId : SV_InstanceID;
};
struct Interpolants
{
float4 position : SV_Position;
float4 color : COLOR0;
};
Interpolants main( Vertex In )
{
Interpolants Out;
float2 offset = float( In.instanceId ) * float2( 2.0f / 1280.0f,2.0f / 720.f );
Out.position = In.position + float4( offset,0 );
Out.color = float4( In.color.xyz * (In.instanceId & 0x1),1 );
return Out;
}
这是我对SimpleTrianglePC.cpp所做的两个更改。首先,创建顶点缓冲区:
// Create vertex buffer.
float xScalar = 2.0f / 1280.0f;
float yScalar = 2.0f / 720.0f;
static const Vertex s_vertexData[3] =
{
{ { 1.0f * xScalar - 1.0f,1.0f * yScalar - 1.0f,0.5f,1.0f },{ 1.0f,0.0f,1.0f } },// Top / Red
{ { 1.0f * xScalar - 1.0f,719.0f * yScalar - 1.0f,{ 0.0f,1.0f,// Right / Green
{ { 719.0f * xScalar - 1.0f,1.0f } } // Left / Blue
};
第二,绘制命令:
// Draw triangle.
context->DrawInstanced(3,265,0);
正如我前面提到的,我之所以创建此测试是因为当有许多重叠的原语时,我的原始代码会变慢。这种放缓是否不可避免?我应该怎么做才能避免这种情况?预先感谢。
编辑:
以下是GPU使用情况详细信息的屏幕截图:
编辑2:
Visual Studio的GPU使用情况工具似乎错误地报告了此图形驱动程序支持的功能级别。对D3D11CreateDevice
的调用返回功能级别11.0。 Dxdiag确认了这一点:
我分析了一个框架,看是否可以获得其他信息。看来DrawInstance需要22毫秒才能完成:
编辑3:
最近几天我一直在进行测试,但是对于这种行为我没有很好的解释。有人看到示例代码/我的更改有问题吗,还是我应该将其归咎于越野车/性能不佳的显卡?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)