2011-09-09 173 views
3

我在wxWidgets中开发了一个应用程序,在该应用程序中使用位图进行绘制。所以,第一次当我的应用程序启动时,它从文件中读取坐标并相应地绘制线条。应用程序还接收来自网络的UDP数据包,UDP数据包还包含一些xy坐标信息,这些信息必须在屏幕上绘制,所以当接收数据包时,我重绘位图图像并显示在屏幕上,我还需要刷新位图在鼠标移动事件上,因为在鼠标移动时会出现一些我必须在屏幕上绘制的新图形。最佳绘图方法

所有这些都会增加运营成本并降低我的GUI。所以,请好好建议我一些替代绘图方法,您认为这种方法可能会有效。

我已经在Google上搜索过,并获得了OpenGL的选项,但由于时间不足,我不想使用openGL,因为我没有任何OpenGL的经验。

+4

您有1337分。我不喜欢那样。 Upvoted:P – Flavius

+1

你不能在内存中保存一个位图实例,只需要绘制新的信息,而不用重绘整个事物?并拉伸blit位图屏幕... – Lucian

+0

@freerider,我正在绘制一些特定的内存信息,但是当我必须从位图中删除现有的线和绘制新的线,在这种情况下,我必须重绘整个位图。 – Siddiqui

回答

0

保存数据以绘制而不是总是刷新位图,并让主循环不时刷新位图。

这样你就可以使程序永不停止。背面当然是反应性会更低(即数据到达时,屏幕上不会再出现20毫秒而不是立即显示)。

1

听起来好像您的问题在于您的GUI对用户输入没有响应,因为应用程序正忙于重绘显示。对这类问题有几个通用的解决方案。

  1. 使用工作线程在内存中绘制位图。在这种情况下,主线程可以继续与用户交互。一旦位图被重新绘制,工作线程就会向主线程发出信号,然后主线程将完成的位图复制到屏幕 - 这非常快。

  2. 使用主线程直接在屏幕上绘制位图,但通过调用wxApp :: Yield()来绘制绘图代码。这将允许GUI在漫长的绘图过程中保持对用户的响应。

选项1是“最好的”,在多核机器上运行尤其是,但它是保持同步的两个线程,防止它们之间的竞争,除非你有一个多线程的设计显著的经验是一个挑战。选项2非常简单,但您仍然必须小心,在第一个完成之前用户交互不会启动另一个绘图过程。

+0

这不会改变任何东西,“绘画回忆”是一种无意义的东西(否则你会画出什么?)。使用2个线程,一个用于绘制,另一个用于执行代码并不是一个糟糕的IDE,但您必须将这两个线程连接在一起(即绘制时不计算,计算低收益时不计算)。 OP想要一个简单的(或不是太复杂的)解决方案来解决他的问题,“不要每帧更新GUI,因为这需要时间”。喜欢还是不喜欢:-) – Valmond