gpt4 book ai didi

不移动鼠标光标时 Java 动画卡顿

转载 作者:太空狗 更新时间:2023-10-29 22:50:12 25 4
gpt4 key购买 nike

我有一个非常简单的动画,一个大字体的文本连续(逐个像素)向左移动。文本首先转换为图像,然后启动一个定时器任务,该任务重复(每 10-20 毫秒)将图像的 x 坐标递减 1,然后执行 repaint()。

该程序在某些系统上表现出奇怪的行为。在我的带有 nVidia 卡的 PC 上,它运行流畅。在我的 Vaio 笔记本电脑、BeagleBoneBlack 和 friend 的 Mac 上,它出现严重的卡顿。它似乎暂停了一会儿,然后跳到左边大约 10 个像素,再次暂停等等。

让我感到困惑的是,在这些系统上,如果您不触摸鼠标,动画会断断续续。只要您在窗口内移动鼠标光标,无论多慢,或拖动窗口本身,动画都会非常流畅地运行!

有人能解释一下吗?这是程序:

import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;

class Textimg extends JComponent
{
String str;
Font font;
int x = 0;
final int ytext = 136;
Image img;

public Textimg(String s)
{
str = s;
font = new Font("Noserif", Font.PLAIN, 96);
setLayout(null);
}

protected void paintComponent(Graphics g)
{
if (img == null)
{
img = createImage(4800, 272);
Graphics gr = img.getGraphics();

gr.setFont(font);
gr.setColor(Color.BLACK);
gr.fillRect(0, 0, 4800, 272);
gr.setColor(new Color(135, 175, 0));
gr.drawString(str, 0, ytext);
gr.dispose();
}

g.drawImage(img, x, 0, this);
}

public void addX(int dif)
{
if (isVisible())
{
x = x + dif;

Graphics g = getGraphics();

if (g != null) paintComponent(g);
}
}
}


public class Banner extends JFrame
{
StringBuffer buf;
int sleeptime = 10;

Banner(String path) throws IOException
{
setSize(new Dimension(480, 272));
setTitle("Java Test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);

BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(path), "UTF-8"));

buf = new StringBuffer();

while (true)
{
String line = reader.readLine();

if (line == null) break;
buf.append(line);
}

final Textimg textimg = new Textimg(buf.toString());

add(textimg);
textimg.setBounds(0, 0, 480, 272);

final javax.swing.Timer timer = new javax.swing.Timer(200, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
textimg.addX(-1);
}
});

timer.setDelay(sleeptime);
timer.start();
}

//----------------------------------------------------------------------

public static void main(String[] args) throws Exception
{
new Banner(args[0]).setVisible(true);
}
}

最佳答案

绘制完成后尝试调用此方法:

 Toolkit.getDefaultToolkit().sync();

这会刷新某些系统(如 Linux)使用的图形缓冲区。请参阅 Javadoc:http://docs.oracle.com/javase/7/docs/api/java/awt/Toolkit.html#sync()

关于不移动鼠标光标时 Java 动画卡顿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19480076/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com