4

私は最近、オフスクリーン バッファに描画している Processing/Java/JOGL の作品に取り組んでいます。プログラムを開始すると、美しいグリッチが表示されます (下の画像を参照)。

これは、前回プログラムを実行したときのバッファ アドレス空間に残っているデータだと思います。最小の正方形のチャンクは 8x8 ピクセルです。より大きなチャンクは 4x4 メタチャンクの 8x8px の正方形にタイル張りされ、それらも 4x4 にタイル張りされて uberchunks になっているようです。私は64ビットのオペレーティングシステムを使用しています。

プログラムの初期化でこのグリッチアウトされた画像が表示される理由を誰かに説明できますか? 私はすでに私の質問にほとんど答えましたか?(ほとんどの場合、ボンネットの下で何が起こっているのか興味があります。)

編集: SOには画像をクリックしてズームする機能がないため、画像のズームインバージョンを追加しました。

私のグリッチタスティックな起動画面。 同じく拡大撮影。

編集: @SuperKael がコードを要求しました。レンダリングは主に Processing の JOGL の実装に抽象化されているため、この効果を生み出している原因を特定することは困難です。以下は、私のコード内で何が起こっているかを説明する試みです:

マップの背景画像は次のようにロードされますPImage

PImage backgroundImage = pApplet.loadImage(pathToImage);

その背景画像の上に描画されるコンテンツのバッファーが初期化されます。

PGraphics foregroundBuffer = pApplet.createGraphics(w, h, PApplet.OPENGL);

バッファ内でレンダリングする前景画像がロードされます。

for (String path : foregroundImagePaths) {
    pApplet.loadImage(path);
}

私のメインdraw()ループ内では、背景画像が描画され、他の画像がバッファーに描画されてから、バッファーが描画されます。

pApplet.image(backgroundImage, 0, 0);
foregroundBuffer.blendMode(PApplet.ADD);
for (PImage foregroundImage : foregroundImages) {
    foregroundBuffer.image(foregroundImage);
}
pApplet.image(foregroundBuffer, 0, 0);

アプリケーションの起動時に、グリッチ画像が短時間だけ表示されます。適切に初期化される前に画面に描画される可能性foregroundBufferがあり、他の操作がメインスレッドをブロックして、初期化中に不具合が発生するのを確認できると思います。

これは、背景画像の縮小コピーです。 ここに画像の説明を入力

4

1 に答える 1

0

考えられる説明の 1 つ: プログラムの開始時に、バッファが使用するメモリはおそらく「初期化されていません」。これは、前のユーザーが物理的にそこに残したもの (タスク、プロセス、システム、ドライバーなど) がすべて含まれていることを意味します。

そこにあるメモリは、最小サイズのチャンクによってシステムによって管理されます。通常、ブロックを連鎖させてブロック長を記録するために数バイトが使用され、次に実際のデータがあります。

「初期化されていない」バッファを表示すると、実際にこれらのチャンクが表示され (左側のリンク/サイズ/コンテンツを画像データとして解釈します)、非常に小さなチャンクのシーケンスがある場合、この効果が生じます。

于 2013-02-11T16:14:48.140 に答える