对于我在脑机接口方面的实习,我需要在CRT显示器上产生一些非常快的闪烁方块(闪烁=在两种颜色之间交替)。显示器的刷新率是85 85,我们希望这是瓶颈,这意味着重新绘制所有方块最多需要1000/85 = 11ms。
我喜欢的GUI/图形编程语言是Java,所以我尝试用AWT做一个原型,因为它是同步的(不像Swing)。我现在似乎有两个问题:第一个是时间测量显示,即使是9个正方形的重新绘制也需要太长的时间。我的算法采用所需的频率,并计算系统应该提前重新绘制的时间,然后使用一个循环(没有睡眠/等待延迟)来检查每次是否达到下一个‘时间’,如果是,循环所有的方块来重新绘制它们。我现在实现它的方式是,正方形是背景颜色为A的面板,并包含在另一个背景颜色为B的面板中,闪烁发生是因为面板的可见性发生了变化。我认为这将比一直绘制矩形的Panel更快。我没有一个很好的分析工具(不能让Eclipse TPTP或NetBeans分析器工作),所以我不能确定,但我感觉瓶颈实际上不是在重绘中,而是在循环中(带条件检查等)。你能推荐一些我应该做的事吗?
第二个问题是,看起来方块是从上到下渲染的。看起来它们展开得非常快,但仍然很明显。这是不可接受的。然而,我想知道的是,是什么导致了这种情况。是Java/AWT,还是Windows,或者仅仅是我写了一个很慢的算法?
你能推荐一些我可以尝试的东西吗?我更喜欢使用Java,但如果有必要,我会使用C(或其他语言)。
发布于 2009-03-22 13:17:26
我会避免任何类型的高级“组件”,比如JPanels之类的。尝试获取表示窗口内容的Graphics2D,并使用它的fillRect()方法。
如果做不到这一点,你可以用C和OpenGL很容易地做到这一点。rasonly.c是一个标准的模板程序,它将OpenGL设置为仅作为“光栅化器”工作,即2D模式。以此为起点,你应该能够运行一些东西来绘制你想要的“方块”,而不会有太多的麻烦。
你没有很好地描述你想要的场景,听起来就像你想画100个方块,每个方块都有不同的颜色。为了在OpenGL中获得最佳性能,您应该将所有相同颜色的方块绘制在一起,以最小化绘制调用之间的“状态更改”。这可能是一个纯粹的理论观点,因为以85 Hz的频率绘制100个2D方块真的不应该对OpenGL征税。
更新:哦,已经有很多年了,现在你可能需要对上面的内容持保留态度,并阅读一些现代教程。星移物换。查找Vulkan API。
发布于 2009-03-22 13:18:30
(我记得有一个使用BBC微型和调色板切换的演示,尽管它是50fps而不是85fps,因为它是英国国内的电视)
我会切换到jogl并使用显示列表。它们在Java中获得了非常高的fps速率。
https://stackoverflow.com/questions/670986
复制相似问题