我一直在我的Mac上开发JAVA应用程序。其逻辑如下:
每当一个形状到达时,程序都会调用calls ()
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计算机上测试相同的应用程序。结果是一个滞后的应用程序。这些是我得出的结论。
我已经尝试过,而不是每隔几毫秒用计时器调用一次重绘,结果是一样的。代码:
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之后,结果仍然是一个缓慢的绘图应用程序。它造成了另一个问题,因为其中一个命令是删除所有形状,因此它增加了一些复杂性,因为我必须执行以下操作:
g2d.clearRect(0, 0, screenSize.width, screenSize.height);HW/OS/JavaVersion
视窗
MAC
VisualVM
直播视频: VisualVM:https://youtu.be/cRNX4b3rlZk
我看不出有什么奇怪的东西可以解释为什么会出现这种滞后,但我远不是专家(再次为低质量感到抱歉)。
谢谢你的回复
发布于 2015-04-03 21:19:03
不需要每次create()一个新的图形上下文,只需将g转换为Graphics2D即可。这在所有具体实现上都是安全的。这也省去了创建上下文的dispose()的需要。正如注意到的here,保留可能对以后绘图至关重要的任何上下文变量。
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轻松地处理两个平台上包含数百个形状的选择。
发布于 2015-04-03 18:06:16
我建议您对BufferedImage进行静态绘图,然后在paintComponent方法中绘制BufferedImage。
例如,
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
}发布于 2015-04-04 14:04:04
经过两天多的调试,我发现这个问题与无关,与paintComponent()无关
使用相同的服务器生成随机形状
在Windows应用程序中,一些形状是在同时接收到的,这是不可能的,因为我每15 ms发送一次形状。这就是它积累形状的原因(结果=滞后)。
另一方面,在Mac应用程序中,每个形状都有不同的时间接收(结果=实时)
谢谢您的回复,对我可能造成的不便深表歉意。
https://stackoverflow.com/questions/29437260
复制相似问题