对于我在脑 - 计算机接口上的实习,我需要在CRT监视器上生成一些非常快速的闪烁方块(闪烁=在两种颜色之间交替)。显示器的刷新率为85Hz,我们希望这是瓶颈,这意味着重新绘制所有方块最多可以达到1000/85 = 11ms。
我对GUI /图形编程的偏好语言是Java,所以我尝试使用AWT制作原型,因为它是同步的(与Swing不同)。我现在似乎有两个问题:第一个是时间测量显示甚至9个方块的重新绘制只需要太长时间。我的算法采用所需的频率并计算系统应该预先重新绘制的时间,然后使用一个循环(没有睡眠/等待延迟),每次检查是否达到下一个“时间”,如果是,则循环遍历所有正方形重绘它们。我现在实现它的方式是,正方形是具有背景颜色A的面板,并且包含在具有背景颜色B的另一个面板中,并且由于面板的可见性被改变而发生闪烁。我认为这比一个必须一直绘制矩形的Panel快。 我没有一个像样的分析工具(不能让Eclipse TPTP或NetBeans分析器工作)所以我不能确定,但我感觉瓶颈实际上不是在重新绘制,而是在循环中(有条件的检查等)。你能推荐一些我应该做的事吗?
第二个问题是看起来正方形从上到下呈现。这就像他们快速展开,但仍然明显。这是无法接受的。我想知道的是,是什么导致了这一点。是Java / AWT,还是Windows,或者只是我编写一个慢速算法?
你能为我推荐一些东西吗?我更喜欢使用Java,但如果必须,我会使用C(或其他东西)。
答案 0 :(得分:3)
我会避免使用任何类型的高级“组件”,例如JPanel等。尝试获取表示窗口内容的Graphics2D,并使用其fillRect()
方法。
如果做不到这一点,你可能很容易在C和OpenGL中做到这一点。 rasonly.c是一个标准模板程序,它将OpenGL设置为仅用作“光栅化器”,即2D模式。以此为出发点,您应该能够运行一些能够毫不费力地绘制所需“正方形”的东西。
你没有很好地描述你想要的场景,它从那个方程式听起来好像你想绘制100个正方形,每个正方形都有不同的颜色。为了在OpenGL中获得最佳性能,您应该将相同颜色的所有正方形绘制在一起,以最大限度地减少绘图调用之间的“状态变化”。这可能只是一个纯粹的理论观点,因为在85赫兹下绘制100个2D正方形实际上不应该对OpenGL征税。
更新:哦,所以这已经是一堆多年了,现在你可能需要采取上述方法,阅读一些现代教程。事情变了。查看Vulkan API。
答案 1 :(得分:2)
(我记得使用BBC微型和调色板切换进行演示,虽然那是50fps而不是85,因为它是英国国内电视)
我切换到jogl并使用显示列表。他们在Java中获得非常高的fps率。