获得临时操作而不会出现draw()时序错误

时间:2018-07-08 21:14:03

标签: java processing

我试图在处理草图中获得准确的时钟,而没有draw()函数引起的计时。

我实际上是使用Java的System.nanoTime()而不是mills()来获得纳秒级的,我想起了void draw中的时钟来初始化它。

我想知道如何从draw()获得一个独立的时钟来发送一些消息,而无需使用draw()函数计时。

我需要它用于android内部的音乐音序器,我需要它完全准确。

这是我的情况:

long lasttimecheck;
long timeinterval;

void setup() {
  lasttimecheck = System.nanoTime();
  //step duration 
  timeinterval  = 125000000L;
}

void clock(){
  if (System.nanoTime() > lasttimecheck + timeinterval) {
    lasttimecheck = System.nanoTime();
    println("yeah" +  lasttimecheck);
  }

}
void draw() {
clock();
}

谢谢!

2 个答案:

答案 0 :(得分:1)

我不确定您的目标是什么(或者为什么draw()功能无法实现该目标),但是您可以创建自己的线程并执行自己的计时。像这样:

void setup(){
  new Thread(){
    public void run(){
      while(true){
        doTheThing();
        Thread.sleep(1); //sleep for 1 ms
      }
    }
  }.start();
}

这只是一个简单的示例,线程(又名并发)是一个高级主题,需要考虑很多复杂的东西。因此,如果我是您,我会退后一步,尝试在常规draw()循环的范围内工作,而不是自己进行线程化。

答案 1 :(得分:1)

处理提供了一个简单的线程实现:您可以在 setup()中简单地调用 thread(“ clock”); ,而无需担心任何线程模板代码。


或者,当每秒125000000ns = 0.125s = 8次时,您可以在 setup()中通过以下方式将帧速率设置为64:

frameRate(64)

...并通过在 draw()循环中添加以下内容,执行打算使 clock()触发每八帧的操作:

if (frameCount % 8 == 0) {do()}

在64fps下,每八帧以0.125s的增量发生。