1

我正在处理一个显示许多对象(图形)(C++/Win32API)的窗口。这是在 GDI+ 中,我用 Direct2d 编写了一段测试代码,因为我想提高在窗口中拖动对象时的性能。我发现(迄今为止)的最佳方法如下(使用 1000 个节点和 999 条边的图)。

(基本上将静态内容缓冲到位图缓冲区并且只绘制移动的内容) 当拖动开始时(例如 lbuttondown 状态),创建一个基本渲染目标,其中不包括被拖动的节点和附加的边缘,调用 GetBitmap 并存储以供以后使用。当我需要绘制时(由于mousemove事件和lbuttondown状态为true),然后清除当前的hwndrendertarget(背景洗白),然后将连接到正在移动的节点的边缘绘制到hwndrendertarget中,然后将保存位图复制到hwndrendertarget,然后将节点位图(在DB中首次创建节点时创建,保存实际绘制它)移动到hwndrendertarget,然后调用EndDraw。

现在这工作正常(ish),我不喜欢它,当节点被快速拖动时,鼠标光标移动到被拖动的节点之前(距离取决于拖动/鼠标移动的速度,最坏的情况是大约 1/ 2 英寸)。我的参考应用程序是 MS Visio,在其上拖动单个对象显示光标停留在被拖动对象上的相同位置可能 +/- 1/2 像素。

我还没有尝试过将所有(并且唯一的)绘图操作移动到一个单独的线程,但在我尝试这个之前,我想研究其他方法,如果其他单线程方法会胜过这种方式。

更新: 我已经通过改进对其进行了更多优化,我发现我正在分配和取消分配绘图函数中的边缘画笔,我已经移出到一个类范围的对象并在类的生命周期内初始化其他画笔等。当快速拖动时,光标现在只在被拖动对象之外一点点(2 像素左右),对象是一个 15px 半径的圆。因此,在拖动时,光标可以从对象的中间(光标应该粘住的点)最多移动 17px。在测试中我发现了一件有趣的事情,在我的主显示器上,拖动更糟糕,因为光标可以领先于被拖动的对象超过 17 像素,比如距离光标应该在的对象中心点最多 25 像素固定的。在扩展桌面的第二台显示器上(即 没有任务栏)拖动在前面描述的更好。如果我在主监视器上隐藏任务栏并在该监视器上运行应用程序并拖动,则性能与第二个监视器相同。

4

0 回答 0