最佳绘图方法

3
我在wxWidgets中开发了一个应用程序,在其中使用位图进行绘制。因此,当我的应用程序首次启动时,它会从文件中读取坐标并相应地绘制线条。该应用程序还从网络接收UDP数据包,UDP数据包也包含一些x y坐标信息,这些信息必须绘制在屏幕上,因此当接收到数据包时,我重新绘制位图图像,并在屏幕上显示,我还需要在鼠标移动事件上刷新位图,因为在鼠标移动时有一些新的绘制需要在屏幕上绘制。
所有这些都增加了操作成本并减慢了GUI速度。因此,请建议一些替代绘制方法,您认为在这种情况下可能更有效。
我已经在Google上搜索到了OpenGL选项,但由于时间不足,我不想使用OpenGL,因为我没有任何OpenGL经验。

4
你曾经有1337分。我不喜欢那个数字。点赞了 :P - Flavius
1
你不能将位图实例保存在内存中,并仅向其绘制新信息,而无需重新绘制整个位图吗?然后将位图拉伸复制到屏幕上... - Lucian
1
@Siddiqui 你不能做一个位图缓存,其中包含几个时间点的线条图像吗?然后,您只需要组合几个位图(如果背景是白色,只需使用XOR),并将其余的线条绘制到结果中。 - Lucian
1
让我来澄清一下:您有一个位图,必须用鼠标绘制或从网络获取形状填充它。随着时间的推移,有太多的形状需要重新绘制,这会拖慢GUI。您能否通过计算哪些形状不会改变并将它们绘制到第二个位图中来进行优化,该位图用作新形状的起始缓冲区? - Lucian
1
游戏编程的一些基本经验法则:最大化数据吞吐量,寻找可以同时绘制多个形状的绘图函数。尽量减少运行时计算:如果已经绘制的形状可以有多个缓存,请使用它。网络上有多个游戏开发教程可供参考。最后:使用另一个可以处理硬件加速并具有更好性能的API。 - Lucian
显示剩余8条评论
2个回答

1

看起来你的问题是GUI对用户输入不响应,因为应用正在重新绘制显示。这种问题有一些通用的解决方法。

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

  2. 使用主线程直接将位图绘制到屏幕上,但需要在绘制代码中加入wxApp::Yield()调用。这将允许GUI在漫长的绘制过程中仍能响应用户。

选项1是“最佳”的选择,特别是在多核机器上运行时,但除非您具有多线程设计的丰富经验,否则很难保持两个线程同步并防止它们之间的争用。选项2要简单得多,但您仍然必须小心,以确保在第一个绘图过程完成之前,用户交互没有开始另一个绘图过程。


这不会改变任何事情,“绘制到内存”是无意义的(否则你会在哪里绘制呢?)。使用两个线程,一个用于绘图,一个用于执行代码并不是一个坏主意,但必须将它们链接在一起(即绘制时不进行计算,计算时不进行绘制,这意味着效益低)。OP想要一个简单(或不太复杂)的解决方案来解决他的问题,解决方案是“不要每帧更新GUI,因为那需要时间”。喜欢还是不喜欢 :-) - Valmond

0

将数据保存下来以便绘制,而不是总是刷新位图,并让主循环定期从位图中进行刷新。

这样可以使程序永远不会卡顿。当然,缺点是响应速度会降低(即当数据到达时,它不会立即显示在屏幕上,而是要等待另外20毫秒)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接