小编And*_*son的帖子

当我每帧写入单个顶点缓冲区数千次时,如何提高Direct3D的性能?

我正在尝试编写一个OpenGL包装器,它允许我使用我现有的所有图形代码(为OpenGL编写),并将OpenGL调用路由到Direct3D等价物.到目前为止,这种方法效果令人惊讶,但性能变得非常严重.

现在,我承认我最有可能以一种从未设计过的方式使用D3D.我每个渲染循环更新一个顶点缓冲区数千次.每当我绘制一个"精灵"时,我会用纹理坐标等向GPU发送4个顶点,当屏幕上的"精灵"数量达到1k到1.5k左右时,我的应用程序的FPS就会下降到低于10fps.

使用VS2012性能分析(这很棒,顺便说一下),我可以看到ID3D11DeviceContext-> Draw方法占用了大部分时间: 这里有截图

在设置顶点缓冲区时,还是在绘制方法期间,是否存在一些我没有正确使用的设置?对我的所有精灵使用相同的顶点缓冲区真的非常非常糟糕吗?如果是这样,我还有哪些其他选项不会彻底改变我现有图形代码库的架构(它们是围绕OpenGL范例构建的......每一帧都将所有内容发送到GPU!)

我游戏中最大的FPS杀手就是我在屏幕上显示大量文字.每个字符都是一个纹理四边形,每个字符都要求对顶点缓冲区进行单独更新,并单独调用Draw.如果D3D或硬件不喜欢很多Draw的调用,那么你怎么能一次在屏幕上绘制大量文本呢?

如果您希望看到更多代码以帮助我诊断此问题,请告诉我们.

谢谢!

这是我正在运行的硬件:

  • 酷睿i7 @ 3.5GHz
  • 16演出的RAM
  • GeForce GTX 560 Ti

这是我正在运行的软件:

  • Windows 8 Release Preview
  • VS 2012
  • DirectX 11

这是绘制方法:

void OpenGL::Draw(const std::vector<OpenGLVertex>& vertices)
{
   auto matrix = *_matrices.top();
   _constantBufferData.view = DirectX::XMMatrixTranspose(matrix);
   _context->UpdateSubresource(_constantBuffer, 0, NULL, &_constantBufferData, 0, 0);

   _context->IASetInputLayout(_inputLayout);
   _context->VSSetShader(_vertexShader, nullptr, 0);
   _context->VSSetConstantBuffers(0, 1, &_constantBuffer);

   D3D11_PRIMITIVE_TOPOLOGY topology = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP;
   ID3D11ShaderResourceView* texture = _textures[_currentTextureId];

   // Set shader texture resource in the pixel shader.
   _context->PSSetShader(_pixelShaderTexture, nullptr, 0);
   _context->PSSetShaderResources(0, 1, &texture);

   D3D11_MAPPED_SUBRESOURCE mappedResource;
   D3D11_MAP mapType …
Run Code Online (Sandbox Code Playgroud)

graphics performance direct3d direct3d11

5
推荐指数
1
解决办法
1628
查看次数

ASP.NET类问题

有人可以告诉我两者之间的区别

static public
public static
Run Code Online (Sandbox Code Playgroud)

private int _myin = 0
public int MyInt
{
    get{ return _myInt; }
    private set {_myInt = value; }
}
Run Code Online (Sandbox Code Playgroud)

私人设定部分是我想知道的

c# asp.net

4
推荐指数
1
解决办法
54
查看次数

4
推荐指数
1
解决办法
3333
查看次数

在Flash应用程序和iPhone应用程序之间共享代码

我有兴趣为iPhone和网络编写游戏.理想情况下,我可以使用一种语言来编写我的游戏,它可以在两个平台上运行.我知道情况并非如此,那么在iPhone应用程序(Objective-C/C++)和Flash SWF(ActionScript)之间利用代码的最佳方式是什么?

iphone flash actionscript objective-c

2
推荐指数
1
解决办法
824
查看次数