首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PaintComponent Java慢

PaintComponent Java慢
EN

Stack Overflow用户
提问于 2015-04-03 17:53:34
回答 3查看 1.5K关注 0票数 1

我一直在我的Mac上开发JAVA应用程序。其逻辑如下:

  1. 服务器向客户端应用程序发送一些绘制基本形状的命令
  2. 客户端应用程序将基本形状绘制到Jpanel中。

每当一个形状到达时,程序都会调用calls ()

代码语言:javascript
复制
 public void paintShape(Shape p) 
{
    //this.paintComponent(this.getGraphics());
   arrayofShapes.add(p);
   this.repaint();
    //this.updateUI();
    //this.update(this.getGraphics());

}
public void paintComponent(Graphics g) 
{ 
    super.paintComponent(g);
    g2d = (Graphics2D) g.create();
    g2d.setStroke(new BasicStroke(2));
    g2d.setColor(pickedColor);
    for(final Shape p : arrayofShapes)
    {
        g2d.draw(p);
    }
    //g2d.dispose();

}

一切都很顺利(实时),所以我决定在Windows计算机上测试相同的应用程序。结果是一个滞后的应用程序。这些是我得出的结论。

  • RepaintManager正在积累calls ()调用。我看到了形状是如何到达目的地的,但在某些情况下,超过5个重绘调用被累加到一个调用中,这使得应用程序非常滞后/不实时。

我已经尝试过,而不是每隔几毫秒用计时器调用一次重绘,结果是一样的。代码:

代码语言:javascript
复制
ActionListener listener = new ActionListener(){
          public void actionPerformed(ActionEvent event){
            repaint();
          }
        };

Timer displayTimer = new Timer(5, listener);
displayTimer.start();

此外,我还测试了一些允许您使用鼠标绘制的随机代码,与用paintComponent绘制的逻辑相同。在这种情况下,它工作顺利,没有滞后感..。示例:http://javagraphics.blogspot.com.es/2010/06/shapes-implementing-freehand-pencil.html

我不明白为什么paintComponent在我的Windows计算机上速度这么慢(同一个Jar)。什么会影响我的节目的表现?

我读过所有关于油漆部件的答案,但他们中的任何一个都解决了这个问题。

对于我如何解决这个问题,如何进行实时存档,有什么建议吗?

提前谢谢你

更新视频:

Mac视频:https://youtu.be/OhNXdGXoQpk实时处理重载没有问题

Windows视频https://youtu.be/yol2miHudZc明显滞后

我为质量低劣而道歉

更新BufferedImage:

在引入BufferedImage之后,结果仍然是一个缓慢的绘图应用程序。它造成了另一个问题,因为其中一个命令是删除所有形状,因此它增加了一些复杂性,因为我必须执行以下操作:

代码语言:javascript
复制
 g2d.clearRect(0, 0, screenSize.width, screenSize.height);

HW/OS/JavaVersion

视窗

  • 处理器i5-4300u 2.5ghz
  • Ram 12 Ram
  • Java版本1.7.0_71

MAC

  • 处理器i7 2.9ghz
  • Ram 8gb
  • Java版本1.7.0_67

VisualVM

直播视频: VisualVM:https://youtu.be/cRNX4b3rlZk

我看不出有什么奇怪的东西可以解释为什么会出现这种滞后,但我远不是专家(再次为低质量感到抱歉)。

谢谢你的回复

EN

回答 3

Stack Overflow用户

发布于 2015-04-03 21:19:03

不需要每次create()一个新的图形上下文,只需将g转换为Graphics2D即可。这在所有具体实现上都是安全的。这也省去了创建上下文的dispose()的需要。正如注意到的here,保留可能对以后绘图至关重要的任何上下文变量。

代码语言:javascript
复制
public void paintComponent(Graphics g) { 
    super.paintComponent(g);
    g2d = (Graphics2D) g;
    Stroke oldStroke = g2d.getStroke();
    g2d.setStroke(new BasicStroke(2));
    g2d.setColor(pickedColor);
    for(final Shape p : arrayofShapes) {
        g2d.draw(p);
    }
    g2d.setStroke(oldStroke);
}

同时,比较两个平台上的profiles以寻找差异。作为参考,该示例引用了here轻松地处理两个平台上包含数百个形状的选择。

票数 2
EN

Stack Overflow用户

发布于 2015-04-03 18:06:16

我建议您对BufferedImage进行静态绘图,然后在paintComponent方法中绘制BufferedImage。

例如,

代码语言:javascript
复制
private BufferedImage bufferedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);

public void paintShape(Shape p) {
    Graphics2D g2 = bufferedImage.createGraphics();
    g2d.setStroke(MY_STROKE); // make this a constant
    g2d.setColor(pickedColor);
    g2d.draw(p);
    g2d.dispose();
    this.repaint();
}

public void paintComponent(Graphics g) { 
    super.paintComponent(g);
    if (bufferedImage != null) {
       g2.drawImage(bufferedImage, 0, 0, null);
    }
    // do dynamic drawing such as drawing of moving sprites here
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-04 14:04:04

经过两天多的调试,我发现这个问题与无关,与paintComponent()无关

使用相同的服务器生成随机形状

在Windows应用程序中,一些形状是在同时接收到的,这是不可能的,因为我每15 ms发送一次形状。这就是它积累形状的原因(结果=滞后)。

另一方面,在Mac应用程序中,每个形状都有不同的时间接收(结果=实时)

谢谢您的回复,对我可能造成的不便深表歉意。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29437260

复制
相关文章

相似问题

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