绘制动态数据的Java Graphics同步问题

时间:2012-12-01 01:11:15

标签: graphics dynamic-data synchronisation

我有一个程序,我想要绘制不断更新的数据(偶然是microhpone-line-data)。这个数据是一个8000长度的双精度数组,我真的不关心'丢失'数据,这些数据在paint方法的取值之间被覆盖。

在我天真的实现中,人们开始意识到存在同步问题,即在绘制例程正在进行时更新音频数据。

我也知道我在Java及其拥有的并发软件包上有点过时了,但我的第一个回应就是在共享数据代码周围放置同步块。不出所料,这有时会阻塞图形线程,所以我认为这可能是一种更好的方法。

基本上我只是没有太多的同步经验,并且在某个地方搞砸了。我想知道对这些问题有更好理解的人是否能够提出一个更优雅的解决方案,不会阻止图形线程?

我天真的代码:

Object lock = new Object();
double[] audio = new double[8000]

// array size is always exactly 8000
public update( double[] audio ) {
    synchronized( lock ) {
       this.audio=audio; // and some brief processing
    }
    repaint();
}

public void paint( Graphics g ) {
    synchronized( lock ) {
        // draw the contents of this.audio
    }
}

1 个答案:

答案 0 :(得分:0)

自我回答,除非一些更聪明的人可以提供更好的东西,我只是在例程的开头保存对音频数组的引用并从中抽取,然后对音频缓冲区的任何更新都在单独进行计算数组,然后在一步中将this.audio分配给新数组。

它看起来很有效,虽然油漆程序确实会偶尔出现闪烁现象,但由于同步阻塞,它在10%的时间内闪烁非常明显。音频数据也不会在绘图例程的中途更新。所以...问题解决了。可能。

double[] audio = new double[8000]

// array size is always exactly 8000
public update( double[] audio ) {
   // do any brief processing
   this.audio=audio; // the reference is re-assigned in one step

repaint();
}

public void paint( Graphics g ) {
    audioNow = this.audio; // save the reference
    // draw the contents of audioNow (not this.audio)
}