如何在不使用大量CPU的情况下快速将大量丰富内容(图像,格式)附加到控件?
-
02-07-2019 - |
题
我使用wxWidgets和Visual C ++来创建类似于使用Unix“tail -f”的功能。在GUI中具有丰富的格式(颜色,字体,图像)。我的目标是wxMSW和wxMAC。
显而易见的答案是使用wxTextCtrl和wxTE_RICH,使用对wxTextCtrl :: SetDefaultStyle()和wxTextCtrl :: WriteText()的调用。
然而,在我的3ghz工作站上,在发布模式下编译,我无法保持拖尾每行平均增长1毫秒的日志,最终落后。对于每一行,我都会招致:
- 两次调用SetDefaultStyle()
- 两次调用两个WriteText()
- 调用Freeze()和Thaw()小部件 醇>
运行时,我的CPU在填充大约20,000行后使用wxMSW在一个核心上达到100%。一旦达到某个阈值,程序明显变慢,进一步落后。
我愿意使用其他控件(wxListCtrl,wxRichTextCtrl等)。
解决方案 3
从wxVListBox派生。来自文档:
wxVListBox是一个类似于列表框的控件,它与常规列表框有两个主要区别:它可以有任意数量的项目,因为它本身不存储它们但是使用OnDrawItem()回调来绘制它们(所以它是一个虚拟列表框),其项目可以具有由OnMeasureItem()确定的可变高度(因此它也是一个具有可变高度线的列表框)。
其他提示
您是否考虑过限制视图中的行数?当我们遇到类似的问题时,我们确保视图中不会有超过10,000行。如果底部有更多的线条,我们会删除顶部的线条。这不是使用WxWidgets,而是在Mac上使用原生Cocoa UI,但问题是相同的。如果样式化的文本视图(带有颜色,格式和漂亮的打印)变得很大,那么在底部添加更多数据会变得非常慢。
听起来你正在使用的控件根本不是为你投入的数据量而构建的。我会考虑构建一个自定义控件。以下是您可以考虑的一些事项:
- 当有新行进入时,您无需重新渲染前一行...它们不会更改,并且由于新数据布局不会更改。
- 尝试一次只在内存中保留可见部分和几个回顾屏幕。这会让它变得更轻......但是如果你希望用户能够比你的回顾更回滚动并使它看起来都是无缝的,那么你将不得不进行自己的滚动管理。
- 不一定一次更新一行。当有新数据时,抓住所有数据并进行更新。如果你真的很快就能获得10行,并且你一次更新了屏幕,那么你可以节省一些逐行的开销。 醇>
希望这有帮助。