gpt4 book ai didi

c# - Windows 窗体 : How to handle redrawing efficiently?

转载 作者:太空宇宙 更新时间:2023-11-03 11:51:21 29 4
gpt4 key购买 nike

我有一个带有图片框的表单,它显示图片和在图片框的 Paint 事件处理程序中绘制的一些叠加层。叠加层根据鼠标移动更新自身(基本上改变叠加层不同部分的不透明度)。

目前,我正在从鼠标移动处理程序调用 pictureBox.Invalidate() 以确保重新绘制叠加层。我还实现了一些逻辑来确定是否真的需要重绘 - 如果没有对象随着鼠标移动改变其不透明度,则 PictureBox 不会失效。

当我移动鼠标的速度比非常慢时,双核机器上的 CPU 使用率仍然是 50% - 我猜测绘画例程没有像鼠标那样频繁地重绘生成移动事件。

绘制的对象不多,最多10个填充矩形,每个矩形有4个填充三角形角。问题已经存在于单个覆盖对象上。基本上只有 FillRectangleFillArea 方法用于执行绘画。

在这种情况下,您会提出什么方法来防止如此高的 CPU 使用率?

最佳答案

好吧,对于初学者来说,弄清楚您实际需要重绘的频率才能获得您想要的效果。现在,您正在重绘以响应鼠标事件,但这些事件可能比您想象的要多很多,而且您可能不需要为每一个事件都重绘.绘画(响应 Invalidate())在大多数情况下是低优先级的,但这仅意味着您最终将耗尽所有备用 CPU 来完成它 - 最好跟踪上次重新粉刷的时间,避免过早重新粉刷。

使用计时器将刷新率固定在某个常数(开始时延迟 40 毫秒,刷新率大约为 25 赫兹,然后根据需要增加或减少)是一种简单的方法...计时器 (System.Windows. Forms.Timer 至少)也是低优先级的,所以你真的不必担心你的刷新逻辑抢占更重要的事件处理程序。

当然,请保留您正在使用的现有代码以确定是否有任何实际更改。在它设置时设置一个标志,当该标志未设置时,只需在您的计时器事件处理程序中什么也不做。

完成此操作后,您应该会看到所用的最大处理时间立即减少,因为您已将刷新率与鼠标频率分离。您还会发现您可以更好地控制中值 处理时间,因为刷新率在您的控制之下:太高,降低计时器滴答率;不够平滑,增加!

关于c# - Windows 窗体 : How to handle redrawing efficiently?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2072905/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com