0

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

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

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

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

4

2 回答 2

3

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

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

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

更新:哦,已经有很多年了,现在你可能需要对上述内容持保留态度并阅读一些现代教程。事情变了。查找Vulkan API

于 2009-03-22T13:17:25.940 回答
2

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

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

于 2009-03-22T13:18:30.167 回答