我在 wxWidgets 中开发了一个应用程序,我在其中使用位图进行绘图。所以当我的应用程序第一次启动时,它会从文件中读取坐标并相应地画线。该应用程序还从网络接收UDP数据包,UDP数据包还包含一些必须在屏幕上绘制的xy坐标信息,所以当接收到数据包时我重新绘制位图图像,并显示在屏幕上,我还需要刷新位图在鼠标移动事件上,因为在鼠标移动时,我必须在屏幕上绘制一些新的绘图。
所有这些都会增加运营成本并减慢我的 GUI。因此,请向我建议一些您认为在这种情况下可能有效的替代绘图方法。
我在谷歌上搜索并得到了OpenGL的选项,但由于时间紧迫我不想使用openGL,因为我没有任何OpenGL的经验。
相关讨论
听起来好像您的问题是您的 GUI 对用户输入没有响应,因为应用程序正忙于重绘显示。这类问题有几个通用解决方案。
使用工作线程在内存中绘制位图。在此过程中,主线程可以继续与用户交互。重新绘制位图后,工作线程向主线程发出信号,然后主线程将完成的位图复制到屏幕上 - 这非常快。
使用主线程将位图直接绘制到屏幕上,但在绘制代码中调用 wxApp::Yield()。这将允许 GUI 在漫长的绘图过程中保持对用户的响应。
选项 1 是"最好的",尤其是在多核机器上运行时,但要保持两个线程同步并防止它们之间的争用是一个挑战,除非您在多线程设计方面有丰富的经验。选项 2 更简单,但您仍需注意用户交互不会在第一个绘图过程完成之前开始另一个绘图过程。
保存要绘制的数据,而不是总是刷新位图,并让主循环不时刷新位图。
这样您就可以让程序永不停机。不利的一面当然是反应性会降低(即当数据到来时,它不会在屏幕上再显示 20 毫秒而不是立即显示)。