delphi - 如何仅使油漆盒/位图的一部分无效以优化其性能?

标签 delphi lazarus

问题涉及:Drawing on a paintbox - How to keep up with mouse movements without delay?

我打算在某个时候问一个问题:如何仅重新绘制油漆箱的一部分而不使整个油漆箱失效,当正在进行大量绘图时或者在我的情况下,当有大量绘图时,这会很慢在屏幕上绘制的图 block 。

来自上面的链接Peter Kostov在他的评论中确实简短地谈到了这个主题:

you can partly BitBlt the offscreen bitmap (only regions where it is changed). This will improve the performance dramatically.

我的图形技能有限,之前从未真正使用过 BitBlt,但在发布此问题后我将阅读更多相关内容。

话虽如此,我想知道如何确定位图的区域是否已更改?这是否涉及一些简单的事情,或者是否有更多的魔力可以说涉及确定哪些区域发生了变化?

现在我仍然直接在油漆箱上绘画,但是一旦我绘制到离屏缓冲区位图,我的下一步就是优化绘画,上面的注释听起来完全符合我的需要,只有已更改的确定区域已经混淆我稍微。

当然,如果还有其他方法,请随时发表评论。

谢谢。

最佳答案

您不必使用 BitBlt()如果您直接绘制到屏幕外的 TBitmap,则可以使用 TCanvas.CopyRect() (内部使用 StretchBlt())。但无论哪种方式,当您需要仅使 TPaintBox 的一部分(与您绘制的离屏位图部分相对应的部分)无效时,您可以使用 InvalidateRect()直接指定 TPaintBox 的适当矩形,而不是调用 TControl.Invalidate() (它使用 调用 InvalidateRect() lpRect 参数设置为 NULL)。每当触发 TPaintBox.OnPaint 事件时,InvalidateRect() 都会在 Canvas 内建立一个剪切矩形,您在该矩形之外进行的任何绘制都将被忽略。如果您想手动优化您的绘图,您可以使用 TCanvas.ClipRect 属性来确定需要绘制的 TPaintBox 的矩形,然后复制该矩形屏幕上位图的一部分。

唯一的问题是 TPaintBoxTGraphicControl 后代,因此它没有自己的 HWND 可以传递给 InvalidateRect()。您必须使用其 Parent.Handle HWND。这意味着您必须在需要时将 TPaintBox 相对坐标转换为 Parent 相对坐标,反之亦然。

关于delphi - 如何仅使油漆盒/位图的一部分无效以优化其性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25534907/

相关文章:

delphi - 如何格式化 DBGrid 列以显示两个小数位?

xcode - 由于架构不匹配,将静态库从 Xcode 链接到 Lazarus 应用程序失败

xml - 是否可以在不单独保存字段的情况下将记录保存到 XML 文件?

html - 如何从 TDBGrid 打印或查看 HTML?

delphi - 在 Lazarus 和 Delphi 之间进行选择的预定义符号

database - 如何使用 SQLQuery 组件运行多个查询?

delphi 从枚举中选择一个随机值

delphi - Application.CreateForm() 形成可见性/状态

delphi - 不使用 GDI+ 在 Canvas 上绘制 PNG 格式的图片

delphi - indy GET 下载速度