我正在尝试编写一个OpenGL包装器,它允许我使用我现有的所有图形代码(为OpenGL编写),并将OpenGL调用路由到Direct3D等价物.到目前为止,这种方法效果令人惊讶,但性能变得非常严重.
现在,我承认我最有可能以一种从未设计过的方式使用D3D.我每个渲染循环更新一个顶点缓冲区数千次.每当我绘制一个"精灵"时,我会用纹理坐标等向GPU发送4个顶点,当屏幕上的"精灵"数量达到1k到1.5k左右时,我的应用程序的FPS就会下降到低于10fps.
使用VS2012性能分析(这很棒,顺便说一下),我可以看到ID3D11DeviceContext-> Draw方法占用了大部分时间: 这里有截图
在设置顶点缓冲区时,还是在绘制方法期间,是否存在一些我没有正确使用的设置?对我的所有精灵使用相同的顶点缓冲区真的非常非常糟糕吗?如果是这样,我还有哪些其他选项不会彻底改变我现有图形代码库的架构(它们是围绕OpenGL范例构建的......每一帧都将所有内容发送到GPU!)
我游戏中最大的FPS杀手就是我在屏幕上显示大量文字.每个字符都是一个纹理四边形,每个字符都要求对顶点缓冲区进行单独更新,并单独调用Draw.如果D3D或硬件不喜欢很多Draw的调用,那么你怎么能一次在屏幕上绘制大量文本呢?
如果您希望看到更多代码以帮助我诊断此问题,请告诉我们.
谢谢!
这是我正在运行的硬件:
这是我正在运行的软件:
这是绘制方法:
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) 有人可以告诉我两者之间的区别
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++ WinRT 中,C#方法Guid.NewGuid()的等价物是什么?
我有兴趣为iPhone和网络编写游戏.理想情况下,我可以使用一种语言来编写我的游戏,它可以在两个平台上运行.我知道情况并非如此,那么在iPhone应用程序(Objective-C/C++)和Flash SWF(ActionScript)之间利用代码的最佳方式是什么?
actionscript ×1
asp.net ×1
c# ×1
c++ ×1
direct3d ×1
direct3d11 ×1
flash ×1
graphics ×1
iphone ×1
objective-c ×1
performance ×1