BeginDraw() (Direct2D) 的位置在编码时重要吗?

Is the position of BeginDraw() (Direct2D) important when coding?

我目前正在学习如何使用 Direct2D 创建应用程序,我想知道在调用 "BeginDraw()" 之后放置大量 'non-graphical' 代码是否有影响。我不完全理解 "BeginDraw()" 实际上做了什么,所以我的问题主要是关于执行时间。它会减慢其他进程吗?是'eating'被调用后的CPU直到"EndDraw()"被调用?

BeginDraw 内度过的时间段内,您不会获得额外费用。

调用它需要付费,就像任何其他函数一样,因为它需要准备东西和处理状态。在这方面,少BeginDraw块比多好。

但是你不会因为块的作用域更长而产生成本。事实上,如果需要的话,更早地调用它甚至可能是有益的,因为它让 Direct2D 库有时间进行后台处理。可能只涉及获取内存。我希望这会产生微不足道的影响或没有影响,但如果这是唯一的改变,那么早点这样做不会有什么坏处。

在实践中,尽量使用尽可能少的块。并使用任何可用的命令缓冲 API 作为对立即绘制命令的反对。 (抱歉这里缺少细节,我自己对 DirectDraw 不是很熟悉,更多的是 OpenGL/Vulkan 开发者)

您会很高兴知道 BeginDraw 在调用后不会消耗 CPU 时间。有些人分析他们的游戏或应用程序,并得到像 ID2DDeviceContext.BeginDraw(实际上通常是 EndDraw)和 IDXGISwapChain.Present 这样的调用消耗大量 CPU 的印象。事实上,它只是以这种方式出现,因为它们是此类应用程序中最常发出的两个调用。还有一个很好的机会,有些人可能会误解分析报告。

简单地说,BeginDrawEndDraw 只是定义您何时可以对 DeviceContextRenderTarget 进行绘图调用。何时调用它完全取决于您拥有的应用程序类型。如果它有一个游戏循环,请在您的主要 Draw 方法开始时调用它。您可以编写一个完整的游戏,每个游戏只调用一次 BeginDrawEndDraw