针对 BeginInvoke 瓶颈进行批量 UI 更新是否值得

本文关键字:UI 更新 是否 值得 BeginInvoke 针对 | 更新日期: 2023-09-27 18:36:53

我的情况是我有代表游戏对象的文本文件。我所要做的就是解析文件并获取游戏对象将被吸引到的点。例如

fruits.txt
pear 10, 20
orange 10,38

每当我 grep 一个点时,我都会使用调度程序 begininvoke 将新水果更新到屏幕上。这比调用单个线程效果更好。每当我有多个屏幕并行更新它们的点时,它就会变得非常慢,并且在绘制到屏幕时开始挂起或帧跳跃。这是因为 BeginInvoke 对消息进行排队吗?尽管冻结了,BeginInvoke仍然比Invoke工作得更快,尽管Invoke的更新更流畅。如何使 BeginInvoke "刷新消息"到屏幕。在其他一些帖子中有一个想法,我可以将点保存在队列中并在队列中仍有内容时绘制到屏幕上,但没有任何区别。请问有什么想法吗? 谢谢。

针对 BeginInvoke 瓶颈进行批量 UI 更新是否值得

根据 MSDN Control.BeginInvoke():

在控件的线程上异步执行委托 基础句柄已创建。

在您的情况下,重复调用 BeginInvoke 会向主 UI 线程添加大量调用,使其陷入其他工作的泥潭。

您绝对最好在队列中批处理您的点,然后一次将它们绘制到屏幕上,而不是尝试在同一线程上异步运行多个绘制。