您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

摇摆计时器-时间波动

摇摆计时器-时间波动

因为渲染是微不足道的,所以我发现您的示例的这种变化非常平滑。渲染时间远低于半毫秒,所以12毫秒期间(?83赫兹)是 足够 的时间来完成一帧,典型地以小于10%的一种核心的。随着渲染时间的增加,计时器线程变得饱和,并且事件合并。由于渲染与垃圾收集和外部处理需求竞争,因此在单个内核上放大了效果。Java不是实时系统,并且并非所有调度程序都是相同的。

您一定会按照此处的建议分析实际的代码,以查看与性能波动之间的任何关联。一种替代方法是延长周期(降低频率)以满足您的渲染截止日期,并使用更大的增量moveImage()来获得相同的速度。

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class Main extends JFrame {

    private static final int W = 800;
    private static final int H = 400;

    public Main() {
        super("JFrame");
        this.add(new ImagePanel());
        setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        this.pack();
        setSize(W, H);
        this.setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokelater(new Runnable() {

            @Override
            public void run() {
                new Main();
            }
        });
    }

    class ImagePanel extends JPanel {

        Timer movementTimer;
        int x, y;

        public ImagePanel() {
            x = 0;
            y = 0;
            movementTimer = new Timer(12, new ActionListener() {

                @Override
                public void actionPerformed(ActionEvent e) {
                    moveImage();
                    repaint();
                }
            });
            movementTimer.start();
        }

        public void moveImage() {
            x++;
            y++;
            if (x > W) {
                x = 0;
            }
            if (y > H) {
                y = 0;
            }
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            long start = System.nanoTime();
            g.setColor(Color.RED);
            g.fillRect(0, 0, W, H);
            g.setColor(Color.BLUE);
            g.fillRect(x, y, 50, 50);
            double delta = (System.nanoTime() - start) / 1000000d;
            g.drawString(String.format("%1$5.3f", delta), 5, 15);
        }
    }
}
其他 2022/1/1 18:25:43 有439人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶