我正在开发一个显示多个对象的窗口(图形)(C ++ / Win32API)。这是在GDI +中,我用Direct2d编写了一段测试代码,因为我想在窗口中拖动对象时提高性能。我发现(迄今为止)的最佳方法如下(使用1000个节点和999个边缘的图表)。
(基本上缓冲静态内容到位图缓冲区,只画出移动的东西) 当拖动开始时(例如lbuttondown状态),创建一个基本的rendertarget,其中包含完整的图形,不包括被拖动的节点和附加的边,调用GetBitmap并存储以供以后使用。当我需要绘制时(由于mousemove事件和lbuttondown状态为true),然后清除当前的hwndrendertarget(背景清洗白色),然后绘制连接到移动到hwndrendertarget的节点的边,然后将保存位图复制到hwndrendertarget,然后复制节点位图(在DB中首次创建节点时创建,保存实际绘制它)移动到hwndrendertarget,然后调用EndDraw。
现在这个工作正常(ish),我不喜欢它,当节点被快速拖动时,鼠标光标移动到被拖动的节点之前(距离取决于拖动速度/鼠标移动最坏情况最大约1/2英寸)。我的参考应用程序是MS Visio,拖动单个对象就显示光标停留在被拖动对象上方的相同位置,可能是+/- 1/2像素。
我还没有尝试过将所有(并且只有)绘图操作移动到一个单独的线程,但在我尝试这个之前,我想研究其他方法,如果其他单线程方法会胜过这种方式。
更新 我已经通过改进对此进行了更优化,我发现我在绘制函数中分配和解除分配边缘画笔,我已经移出到类宽对象并像其他画笔一样初始化类的生命周期。现在光标在被快速拖动时被拖动的对象外部只有一点点(大约2个像素),该对象是15px半径圆。因此,当被拖动时,光标能够从对象的中间移动最多17px(光标应该坚持的点)。在测试中我发现了一个有趣的事情,在我的主显示器上,拖动更糟糕的是光标可以超过被拖动的对象超过17px,比如从光标所在的对象的中心点可能高达25px固定。在扩展桌面的第二个监视器上(即没有任务栏),拖动在前面描述的更好。如果我隐藏主监视器上的任务栏并在该监视器上运行应用程序并拖动,则性能与第二个监视器相同。