有一个程序可以一次在屏幕上生成成百上千个移动的粒子。在显示了几百个之后,就会出现速度减慢。性能分析是使用netbeans profiler进行的,大约80%的时间花费在jpanel的画图method...so算法优化上,似乎不太可能产生明显的差异。对此有什么可以做的吗?或者是时候考虑一个新的平台了吗?paint方法如下所示:
public void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(Color.WHITE);
for (int i = 0; i < gameLogic.getParticleArrSize(); i++) {
g.setColor(gameLogic.getParticleColor(i));
g.fillOval(gameLogic.getParticleXCoor(i),
gameLogic.getParticleYCoor(i),
gameLogic.getParticleSize(i),
gameLogic.getParticleSize(i));
}
g.setColor(gameLogic.getCurrPartColor());
g.fillOval(mouseX - mouseOvalRadius, mouseY - mouseOvalRadius,
mouseOvalSize, mouseOvalSize);
g.setColor(gameLogic.getCursorColor());
g.fillOval(mouseX - 19, mouseY - 19, 38, 38);
for (int i = 0; i < gameLogic.getBombArrSize(); i++) {
g.setColor(Color.RED);
g.fillOval(gameLogic.getBombXCoor(i) - 6,
gameLogic.getBombYCoor(i) - 6,
gameLogic.getBombSize(i),
gameLogic.getBombSize(i));
}
for (int i = 0; i < gameLogic.getPowerUpParticleArrSize(); i++) {
g.setColor(gameLogic.getPowerUpParticleColor(i));
g.fillOval(gameLogic.getPowerUpParticleXCoor(i),
gameLogic.getPowerUpParticleYCoor(i),
gameLogic.getPowerUpParticleSize(i),
gameLogic.getPowerUpParticleSize(i));
}
for (int i = 0; i < gameLogic.getBlackArrSize(); i++) {
g.setColor(Color.BLACK);
g.fillOval(gameLogic.getBlackParticleXCoor(i),
gameLogic.getBlackParticleYCoor(i),
gameLogic.getBlackParticleSize(i),
gameLogic.getBlackParticleSize(i));
}
}
发布于 2010-11-16 04:47:48
什么时候触发repaint()?它是设置在某个时间间隔的定时器上吗?我创建了一个动画库,我能够流畅地制作40个项目的动画。你可能有更多的对象,但我会先看看时间间隔。
编辑:好的,这是我的建议。首先,您需要找出画图中的哪个函数占用的时间最长。看起来你给fillOval打了很多电话。我的建议是使用如下命令创建一次形状: new RoundRectangle2D.Double()。然后使用AffineTransformation在形状之间移动。我很想知道其他人有什么建议,所以我会回来看看的。
发布于 2010-11-16 06:33:24
尝试浏览Graphics2D库。任何形状的填充算法,即使是像椭圆形这样简单的形状,都是昂贵的。这是更快的创建一个形状,填充它,然后复制到其他位置它。2D库还支持用于缩放等的各种转换。
这与Daniel Viona的sprite建议非常相似。精灵的存在是有原因的--它们是一种快速绘制许多小的简单对象的方法!
如果我有时间,我会试着画1000个小物体--介意给出一个这些物体的大小范围的概念吗?只有几个像素?我猜加电和炸弹是相对较少的,只有粒子在伤害你,对吧…
发布于 2010-11-16 06:02:00
大约80%的时间都花在了jpanel的绘制方法上
由于绝大多数处理都是单线程的,这意味着在现代机器上至少有一个CPU核心几乎完全被浪费掉了。如今,大多数计算机都至少有双核,甚至更多。有几种方法可以让你利用这一点:
- For example, have one thread take the first half of the particles and render directly to the backbuffer. A second thread takes the remaining particles and renders them to an image. Once they both complete, blit the image to your backbuffer, combining the two images.
作为额外的注解。如果你真的想要性能,可以考虑JOGL。请看下面的示例:
https://stackoverflow.com/questions/4188594
复制相似问题