【问题标题】:How to generate simple 2D graphics in real time?如何实时生成简单的二维图形?
【发布时间】:2009-03-22 13:09:11
【问题描述】:

对于我的脑机接口实习,我需要在 CRT 显示器上生成一些非常快速闪烁的方块(闪烁 = 在两种颜色之间交替)。显示器的刷新率为 85Hz,我们希望这是瓶颈,这意味着重新绘制所有方块最多需要 1000/85 = 11ms。

我偏爱的 GUI/图形编程语言是 Java,所以我尝试使用 AWT 制作原型,因为它是同步的(与 Swing 不同)。我现在似乎有两个问题:第一个是时间测量表明,即使是 9 个方格的重新绘制也需要太长时间。我的算法采用所需的频率并计算系统应该提前重新绘制的时间,然后使用一个循环(没有睡眠/等待延迟)检查每次是否达到下一个“时间”,如果是,则循环遍历所有方格来重新粉刷它们。我现在实现它的方式是,正方形是背景颜色为 A 的面板,并包含在另一个背景颜色为 B 的面板中,并且闪烁发生是因为面板的可见性发生了变化。我认为这比一个必须一直绘制矩形的面板要快。 我没有像样的分析工具(无法让 Eclipse TPTP 或 NetBeans 分析器工作),所以我不能确定,但​​我觉得瓶颈实际上不在重绘中,而是在循环中(有条件检查等)。你能推荐一些关于我应该做什么的事情吗?

第二个问题是,正方形似乎是从上到下呈现的。就好像它们展开得非常快,但仍然很明显。这是无法接受的。我想知道的是,是什么原因造成的。是 Java/AWT 还是 Windows,还是只是我写了一个慢算法?

你能推荐一些东西给我试试吗?我更喜欢使用 Java,但如果必须,我会使用 C(或其他)。

【问题讨论】:

    标签: java c real-time frequency


    【解决方案1】:

    我会避免使用任何类型的高级“组件”,例如 JPanel 等。尝试获取一个表示窗口内容的 Graphics2D,并使用其fillRect() 方法。

    如果做不到这一点,您可能可以在 C 和 OpenGL 中轻松做到这一点。 rasonly.c 是一个标准模板程序,它将 OpenGL 设置为仅作为“光栅化器”工作,即 2D 模式。以此为起点,您应该能够运行一些东西来绘制您想要的“正方形”,而不会有太多麻烦。

    你没有很好地描述你想要的场景,从这个方程听起来好像你想画 100 个正方形,每个正方形都有不同的颜色。为了在 OpenGL 中获得最佳性能,您应该将所有相同颜色的方块绘制在一起,以最大限度地减少绘图调用之间的“状态变化”。不过,这可能只是一个纯粹的理论观点,因为在 85 Hz 下绘制 100 个 2D 正方形确实不应该对 OpenGL 征税。

    更新:哦,这么多年过去了,现在您可能需要对以上内容持保留态度并阅读一些现代教程。事情变了。查找Vulkan API

    【讨论】:

      【解决方案2】:

      (我记得一个使用 BBC 微型和调色板切换的演示,虽然那将是 50fps 而不是 85,因为它是英国国内电视)

      我会切换到jogl 并使用显示列表。他们在 Java 中获得了非常高的 fps 速率。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 2019-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多