首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java awt性能焦虑

Java awt性能焦虑
EN

Stack Overflow用户
提问于 2010-11-16 04:38:03
回答 3查看 900关注 0票数 2

有一个程序可以一次在屏幕上生成成百上千个移动的粒子。在显示了几百个之后,就会出现速度减慢。性能分析是使用netbeans profiler进行的,大约80%的时间花费在jpanel的画图method...so算法优化上,似乎不太可能产生明显的差异。对此有什么可以做的吗?或者是时候考虑一个新的平台了吗?paint方法如下所示:

代码语言:javascript
运行
复制
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));
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-11-16 04:47:48

什么时候触发repaint()?它是设置在某个时间间隔的定时器上吗?我创建了一个动画库,我能够流畅地制作40个项目的动画。你可能有更多的对象,但我会先看看时间间隔。

编辑:好的,这是我的建议。首先,您需要找出画图中的哪个函数占用的时间最长。看起来你给fillOval打了很多电话。我的建议是使用如下命令创建一次形状: new RoundRectangle2D.Double()。然后使用AffineTransformation在形状之间移动。我很想知道其他人有什么建议,所以我会回来看看的。

票数 4
EN

Stack Overflow用户

发布于 2010-11-16 06:33:24

尝试浏览Graphics2D库。任何形状的填充算法,即使是像椭圆形这样简单的形状,都是昂贵的。这是更快的创建一个形状,填充它,然后复制到其他位置它。2D库还支持用于缩放等的各种转换。

这与Daniel Viona的sprite建议非常相似。精灵的存在是有原因的--它们是一种快速绘制许多小的简单对象的方法!

如果我有时间,我会试着画1000个小物体--介意给出一个这些物体的大小范围的概念吗?只有几个像素?我猜加电和炸弹是相对较少的,只有粒子在伤害你,对吧…

票数 3
EN

Stack Overflow用户

发布于 2010-11-16 06:02:00

大约80%的时间都花在了jpanel的绘制方法上

由于绝大多数处理都是单线程的,这意味着在现代机器上至少有一个CPU核心几乎完全被浪费掉了。如今,大多数计算机都至少有双核,甚至更多。有几种方法可以让你利用这一点:

  • 如果你80%的时间花在一种方法上,请确保剩下的20%不必等待绘画完成。提前计算下一帧,同时等待最后一帧完成绘制。
  • 你的绘制方法也可以被分成多个线程。在多个线程之间共享相同的图形对象是不安全的,但您可以让不同的线程渲染到不同的图像,然后在最后将它们合成在一起。

代码语言:javascript
运行
复制
- 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。请看下面的示例:

  • http://download.java.net/media/jogl/jsr-231-2.x-demos-webstart/ParticleEngine.jnlp
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4188594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档