我如何绘制一个高性能的散点图

我是DirectX的新手,目前我正在尝试将其用于数据可视化,具体来说就是3D散点图。 互联网上的资源非常有限,我已经阅读了弗兰克·D·卢娜(Frank D Luna)的许多书中的一部分。 我研究了一些微软提供的样本,最后掌握了循环在程序中的工作方式。

然而,由于我需要操纵大量的数据并且要求尽可能多的performance,所以我遇到了一些我很难find当前材料的参考。

  1. 缓冲区的使用我期望在创建点之后,我绘制的点是不变的,但是始终发生点的创建,我应该将D3D11_USAGE设置为默认还是dynamic,以及在需要更新缓冲区时调用哪个方法? 我注意到如何使用UpdateSubresource和Map / Unmap? 以及NVIDIA的演示文稿https://developer.nvidia.com/sites/default/files/akamai/gamedev/files/gdc12/Efficient_Buffer_Management_McDonald.pdf 。 但是,如果我确实需要频繁更新缓冲区,而不需要更新缓冲区中的每个数据,我该怎么办?
  2. 我在微软的例子“Simple Direct3D游戏”中注意到,每次更新时都会重写整个缓冲区。

    auto objects = m_game->RenderObjects(); for (auto object = objects.begin(); object != objects.end(); object++) { (*object)->Render(d3dContext, m_constantBufferChangesEveryPrim.Get()); } 

    这是真的吗? 而且我应该如何每次更新时在缓冲区中添加新的顶点

  3. 由于程序预计运行速度非常快,所以预计缓冲区的更新速度要比每帧一次更快 。 我可以编写一个方法来更新缓冲区,并在每次调用缓冲区时向缓冲区添加一个新点? 如果可以,我可以把它放在另一个线程中,还是有更好的方法来实现它?

  4. 在这个例子中,游戏的主循环似乎在GameMain :: StartRenderLoop()中,这个循环每帧运行一次吗? 什么决定了循环的频率?

我可能会对框架和渲染有很多误解,所以非常感谢您的耐心和回答。

这就是所谓的“dynamic”提交,您可以在其中生成顶点并绘制顶点。 更高效的方法是使用“静态”提交,将顶点数据上传到video卡并多次绘制,但大多数现实世界的graphics程序都是混合使用。

如果你正在做2D渲染,你应该看看Direct2D,如果这是你的select。

如何使用dynamic资源

您也可以使用DirectX工具包中的PrimitiveBatch类