【问题标题】:Best Drawing approach最佳绘图方法
【发布时间】:2011-11-13 12:58:06
【问题描述】:

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

所有这些都会增加运营成本并减慢我的 GUI。因此,请向我建议一些您认为在这种情况下可能有效的替代绘图方法。

我在谷歌上搜索了一下,得到了 OpenGL 的选项,但是由于时间紧迫,我不想使用 openGL,因为我没有任何 OpenGL 的经验。

【问题讨论】:

  • 你有 1337 分。我不喜欢那样。赞成:P
  • 你不能在内存中保存一个位图实例,只向它绘制新信息,而不重绘整个东西吗?并将位图拉伸到屏幕...
  • @Siddiqui 你不能做一个位图缓存,其中包含多个时间点的线条图像。然后你只需要组合几个位图(只要使用 XOR,如果背景是白色的)并将剩余的线绘制到结果。
  • 让我直截了当地说:您有一个必须用鼠标绘制或从网络获取的形状填充的位图。一段时间后,必须重新绘制许多形状,这会使 GUI 陷入困境。您是否可以通过计算哪些形状不会改变并将它们绘制到第二个位图来优化,该位图用作新形状的新绘制的开始缓冲区?
  • 游戏编程的一些基本经验法则:最大化数据的直通输出,搜索可以一次绘制多个形状的绘图函数。最小化运行时的计算:如果您可以为已绘制的形状提供多个缓存,请使用它。网上有很多有用的游戏开发教程。最后:使用另一个可以处理硬件加速并具有更好性能的 API。

标签: c++ bitmap drawing wxwidgets


【解决方案1】:

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

这样您就可以让程序永远不会停止运行。不利的一面当然是反应性会更低(即当数据到来时,它不会在屏幕上再显示 20 毫秒而不是立即显示)。

【讨论】:

    【解决方案2】:

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

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

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

    选项 1 是“最好的”,尤其是在多核机器上运行时,但要保持两个线程同步并防止它们之间的争用是一个挑战,除非您在多线程设计方面有丰富的经验。选项 2 更简单,但您仍然需要注意用户交互在第一个绘制过程完成之前不会开始另一个绘制过程。

    【讨论】:

    • 这不会改变任何事情,“记忆中的绘画”是没有意义的(否则你会在哪里绘画?)。使用 2 个线程,一个用于绘图,一个用于执行代码并不是一个坏主意,但您必须将这两个线程连接在一起(即,绘图时不计算,计算时不绘图,这意味着低收益)。 OP 想要一个简单(或不太复杂)的解决方案来解决他的问题,解决方案是“不要每帧更新 GUI,因为这需要时间”。不管你喜不喜欢:-)
    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多