2

カバーフローアニメーションで画像(png、サイズ100kbから1.5mb、合計55.4mb)を表示することになっているスケッチを実行しようとしています。約10枚の画像で動作しますが、それ以上使用するとメモリ不足エラーが発生します。私は次のように画像ファイル名を文字列配列にロードしています:

String[] names = {"00.jpg", "01.jpg", "02.jpg"};

次に、次のようにスケッチに読み込まれます。

covers = new Cover[names.length];
  for (int i = 0; i < covers.length; i++ ) {
  covers[i] = new Cover(names[i]);
}
initCovers();

クラスをカバーします:

class Cover {
  PImage img;

Cover( String name ) {
img = loadImage(name);

public void drawCover() {
  beginShape();    
    textureMode(NORMALIZED);
    texture(img);
    vertex(-300, -300, 0, 0, 0);
    vertex( 300, -300, 0, 1, 0);
    vertex( 300,  300, 0, 1, 1);
    vertex(-300,  300, 0, 0, 1);
  endShape();

スケッチを実行すると、RAM(8GB)が数秒以内にいっぱいになり、スケッチが読み込まれず、クラッシュするだけです。約10枚の画像でスケッチを開始すると、すべてが正常に機能します(RAMの使用量は約1.5GB)。

私の質問は、なぜこれほど多くのメモリを使用しているのかということです。正常ですか?メモリ効率を高める方法はありますか(たとえば、画面に一度に表示できる画像は約3つしかないため、現在表示されていない画像のメモリを解放します)。

編集:問題は、カバークラスで、呼び出されるたびに新しいPImageが作成されることだと思います。それは可能でしょうか?

メモリ内の画像サイズ:幅*高さ*(色深度/ 8)なので、私の画像(1575y1969、24ビット)の場合、8.9mbになります。91枚の画像の倍数:画像だけで約807MBのメモリ使用量。

4

4 に答える 4

3

ユースケースをよりよく理解したので、アプローチ全体を変更することをお勧めします。

Cover FlowGUI

エミュレートしようとしているアプリケーションの種類(たとえば、上記を参照)は、アプリがすぐに多数の画像全体をロードするわけではありません。が表示されます。代わりに、最初にユーザーに提示する画像の小さなグループを読み取ります。ユーザーがそのグループの最後に近づくと、ソフトウェアはシーケンスの開始時にいくつかの画像をフラッシュし(メモリが不足している場合)、最後にさらにいくつかの画像をロードします。

于 2012-08-01T00:08:51.653 に答える
1

JVMヒープスペースを増やしてみてください

java -Xmx1024m

(はい、私は知っています、1gigは「少し」過剰ですが、いくつかの実験の後、この値は切り捨てることができます)

@millimooseが述べているように、Javaによってロードされたイメージは、ロード時にメモリに圧縮解除されるため、ディスク上の100kbの小さなイメージでも、圧縮解除すると突然MBのRAMを占有する可能性があります。アルファチャネルも扱い始めると、さらに複雑になります。

于 2012-07-31T22:50:55.373 に答える
1

圧縮された画像のサイズは、メモリ要件の良いガイドではありません。

ピクセル単位のサイズの方が優れています。たとえば、8メガピクセルの解像度の最新のカメラ写真を表現するには、少なくとも32MBのメモリが必要です。このサイズの画像をスイングで操作する場合は、少なくともその2倍または3倍にします。たくさんのメモリを飲み込むのは簡単です。

また、Javaの内部メモリ管理は、このサイズのチャンクの処理にはあまり適していません。

于 2012-07-31T23:00:24.930 に答える
0

N個のオブジェクトがぶら下がっているのではなく、ハンドルとして単一の一時カバーを使用してコンポーネントにペイントしてみてください。また、描画時間後に画像を操作する必要がある場合は、描画位置と寸法に関する簡単なメタデータを控えてから、クリックイベントx、yなどを使用して、特定の画像を検索し、操作できるようにします。

于 2012-07-31T22:51:58.333 に答える