Javaでプログラムしていたら妙な現象に気づきました。
以上の処理を行うループを回していると、PCの時計が3倍くらいの速さでどんどん進んでしまいます。バッファに何も描かずにdrawImageするであるとか、20ms以上の時間をsleepに指定した場合には、問題ないようです。
バッファに描いてdrawImageしてsleepを呼んで待つ、というパターンはゲームでありがちな処理だけに困ってしまいます。何が悪いのかさっぱりわからない。Javaとその内部に詳しい人が居たら、何が起きてるのか教えて欲しいところです。
それともなんだ、地球のためにCPUパワーを食うBlitではなくFlipにしなさいっておぼしめしなのか…?
検証に使ったコードは以下の通りです。
import java.applet.*;
import java.awt.*;
public class TestClockSkew extends Applet implements Runnable {
Image i;
public void init() {
i = this.createImage(800, 600);
Thread t = new Thread(this);
t.start();
}
public void run() {
while (true) {
Graphics g = i.getGraphics();
g.setColor(new Color(0, 0, 0));
g.fillRect(0, 0, 500, 500);
g.dispose();
this.getGraphics().drawImage(i, 0, 0, null);
try {
Thread.sleep(11);
} catch (InterruptedException e) {
}
}
}
}
当初は実際に動作するアプレットを貼りつける予定でした。しかし実行したところで、黒い画面が出るだけで何も面白くないうえに、もし皆さんのマシンの時計が狂ったりしたら大迷惑なのでやめました。
< | 2008 | > | ||||
<< | < | 01 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | 1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | - | - |
合計:
本日: