Xbox-ATG-SamplesDirectXTKSimpleTrianglePC在这种情况下会导致100%的GPU使用率

问题描述

我正在跟踪性能瓶颈。为了缩小原因,我使用了Xbox ATG Samples回购中的SimpleTrianglePC示例创建了一个测试。

我仅作了几处更改:我将Draw更改为DrawInstanced以渲染多个三角形,并修改了顶点着色器以根据SV_InstanceID稍微改变每个三角形的位置和颜色。总共渲染了265个三角形,但在此过程中我的GPU达到了100%:

GPU at 100%

这是输出。请注意,我将三角形的形状更改为直角三角形。顶部的三角形是黑色的:

Result

该问题似乎与所有三角形都在彼此顶部的事实有关;如果不重叠显示三角形,则不会发生此问题。我已经测试了成千上万个三角形,并且按预期进行,没问题。

解决这个问题,我尝试了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使用情况详细信息的屏幕截图:

Detail

编辑2:

Visual Studio的GPU使用情况工具似乎错误地报告了此图形驱动程序支持功能级别。对D3D11CreateDevice调用返回功能级别11.0。 Dxdiag确认了这一点:

DxDiag info

我分析了一个框架,看是否可以获得其他信息。看来DrawInstance需要22毫秒才能完成:

Frame analysis

编辑3:

最近几天我一直在进行测试,但是对于这种行为我没有很好的解释。有人看到示例代码/我的更改有问题吗,还是我应该将其归咎于越野车/性能不佳的显卡?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)