【问题标题】:How to use javax.swing.timer with nanoseconds?如何以纳秒级使用 javax.swing.timer?
【发布时间】:2016-06-02 22:47:26
【问题描述】:

我需要更快的摆动计时器计时。毫秒是不够的,我尝试将其设置为 0.0000001,但它并没有变得更快;

final javax.swing.Timer tmr=new javax.swing.Timer(1, new ActionListener() {

            public void actionPerformed(ActionEvent e) {


                rsm.setRGB(i, j, rp[i][j]);
                ImageIcon img2 = new ImageIcon(rsm);
                background.setIcon(img2);
                i++;
                if (i==w-1){
                    j++ ;
                    i=0;
                }



            }
        });

【问题讨论】:

  • 系统时钟通常精确到 +/- 15 毫秒。如果您需要纳秒级精度,则必须先构建一种新型计算机(或至少 real-time clock)。
  • 屏幕刷新速度只有大约 60 Hz,可能高达 120 Hz,因此无论如何都不会看到更频繁地更改颜色。
  • @Andreas 有240 Hz displays,而典型的 rtc 使用与石英相同的谐振(32.768 kHz)。但是你是对的,OP 还需要设计一种新的 display
  • 为什么要使用二维阵列?您是否没有注意您其他帖子中的建议:stackoverflow.com/a/37582531/131872?可以直接从 BufferedImage 访问像素,就不需要为 2D 数组浪费内存了。
  • 对于exampleexample

标签: java swing timer


【解决方案1】:

你不能让定时器启动得更快。

解决方案是在 Timer 每次触发时绘制更多像素。无论如何,人眼不会注意到差异。

  1. 您可以使用图像的宽度/高度来计算总像素数。
  2. 你知道定时器频率应该设置不低于上面建议的 15m/s。
  3. 您知道显示整个图像需要多长时间
  4. 计算确定每次需要显示多少像素。

【讨论】:

    【解决方案2】:

    这里有几个问题:

    1. 如果计时器仍在执行上一次触发的代码,则不会触发。因此,如果您的代码需要 10 毫秒来执行,那么将该值设置为小于 10 将不会完成任何事情。
    2. 正如上面人们所说,无论如何都无所谓,因为屏幕更新速度很快。即使您可以让计时器每秒触发数十亿次,您的屏幕也无法如此快速地显示更改。

    【讨论】:

    • 这段代码将在每次火灾时逐像素绘制图像。我不想让每个像素都可视化,但我想更快地完成绘制图像。所以这就是我为什么想要更快的计时器。
    • @Gogo-the-Cat 将您的 actionPerformed 方法中的代码循环 10 次,因此它一次执行 10 个像素。或更多/更少取决于看起来不错。当它不可见时,您的计时器是否触发 10 次并不重要。
    猜你喜欢
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多