0

Brain-Computer Interface のインターンシップでは、CRT モニターで非常に高速にちらつく正方形を生成する必要があります (ちらつき = 2 つの色が交互に表示されます)。モニターのリフレッシュ レートは 85 Hz であり、これをボトルネックにしたいと考えています。つまり、すべての正方形を再描画するには、最大で 1000/85 = 11 ミリ秒かかることになります。

私の GUI/グラフィックス プログラミングの好みの言語は Java です。そのため、(Swing とは異なり) 同期的であるため、AWT でプロトタイプを作成してみました。私は今、2 つの問題を抱えているようです: 1 つ目は、9 つ​​の正方形を再描画するだけでも時間がかかりすぎることを時間測定が示していることです。私のアルゴリズムは、目的の頻度を取り、システムが事前に再描画する必要がある時間を計算してから、次の「時間」に達したかどうかを毎回チェックするループ (スリープ/待機遅延なし) を使用し、到達した場合はすべてをループします。それらを再描画する正方形。私が今実装した方法は、正方形が背景色 A のパネルであり、背景色 B の別のパネルに含まれており、パネルの可視性が変更されるためにちらつきが発生することです。これは、常に Rectangle を描画しなければならない 1 つの Panel よりも高速であると考えました。私は適切なプロファイリング ツールを持っていない (Eclipse TPTP や NetBeans プロファイラーを動作させることができない) ので、確信は持てませんが、ボトルネックは実際には再描画ではなく、ループ (条件チェックなど)。私が何をすべきかについて何かお勧めできますか?

2 つ目の問題は、正方形が上から下にレンダリングされているように見えることです。彼らは非常に速く展開しているようですが、それでも目に見えます. これは受け入れがたい。私が疑問に思っているのは、これが原因です。Java/AWT ですか、それとも Windows ですか、それとも遅いアルゴリズムを書いているだけですか?

試してみるべきことをいくつかお勧めできますか?私は Java を使用することを好みますが、必要に応じて C (または何か) を使用します。

4

2 に答える 2

3

JPanelsなどの高レベルの「コンポーネント」は避けます。ウィンドウの内容を表す Graphics2D を取得して、そのfillRect()メソッドを使用してみてください。

それができない場合は、C と OpenGL でこれを簡単に行うことができます。rasonly.cは、OpenGL を「ラスタライザー」のみ、つまり 2D モードとして機能するようにセットアップする標準テンプレート プログラムです。これを出発点として使用すると、問題なく目的の「正方形」を描画する何かを実行できるはずです。

希望するシーンをうまく説明できません。その式から、それぞれが異なる色の 100 個の正方形を描きたいように聞こえます。OpenGL で最大のパフォーマンスを得るには、同じ色の正方形をすべて一緒に描画して、描画呼び出し間の「状態の変化」を最小限に抑える必要があります。ただし、85 Hz で 100 個の 2D 正方形を描画しても OpenGL に負担がかからないため、これはおそらく純粋に理論上のポイントです。

更新:ああ、それで何年も経ちましたが、最近では、上記を一粒の塩で取り、最新のチュートリアルを読む必要があるでしょう。世の中変わったんだよ。Vulkan APIを検索します。

于 2009-03-22T13:17:25.940 に答える
2

(BBC マイクロとパレット切り替えを使用したデモンストレーションを覚えていますが、それは英国の家庭用テレビだったので、85 ではなく 50 fps でした)

joglに切り替えて、ディスプレイ リストを使用します。Java では非常に高い fps レートが得られます。

于 2009-03-22T13:18:30.167 に答える