Home > javaの勉強 | ブログ > pngファイルの表示は激重い!!

pngファイルの表示は激重い!!

鋭意、新ゲーム制作中です!

アプレット上でTimerTaskを使ってゲームメインを呼び出し、バッファに描画ってことをやっているんですが、パズル+シューティングというゲームの性質上、小さめの画像をたくさん表示することになるんですよね。

そこで、どのくらいのFPSでどれくらいの描画量なら処理が追いつくのかをいろいろ試してみてました。

50fpsか40fpsで300個くらいの画像を表示させていたのですが、どうしても動きがカクカクになってしまってました。

VISTAとかPCのせいなのかとも思いましたが、何度か試していて、重大な事実に行き当たりました。

.

.

pngの画像ファイルは表示が激重い!!

.

.

jpgで画像を編集すると、不可逆圧縮とかハフマンなんとかでドット絵が再編集できなくなっちゃうんですよね。

同じ色が変換されて違う色に化けたりとかして・・・。

そこで、色が変わらないpngで画像を作っていたのですが、こいつを

g.drawImage

で描画しようとするとすごく重いらしいのです。

他のgifやbmpも試してみましたが、やはりpngだけやけに重かったです。

そこで、pngのファイルをbmp24ビットに変えてみたら結構スムーズに動くようになりました。

.

チャット部屋でグダグダ言ってた問題もすべてコレでした。お騒がせしてすみませんでした;;

.

.

.

pngの圧縮方法とか調べていないのですが、同じ種類の画像でpngが一番データ量が小さかったので、たぶん一番圧縮効率がいいものなのでしょう。

で、圧縮効率がいい分、戻す時に時間がかかるって感じなんでしょうか?

とりあえず、

・画像サイズが小さいものについてはpngは使わない!

・画像サイズが大きくて、なおかつ描画速度を気にしないのならばpngを使う

というふうに使い分ければよさそうです。

まぁ、今のPCなら画像の圧縮率が低いものでもメモリは余裕でしょうけど。

Comments:10

PATOLE 09-12-04 (金) 0:23

どうも。

JAVAはpng画像の表示は重いんですか……

えっと、画像の種類の中で、一番容量の小さいのは、JPG画像なんです。
あれは、同じ色のまわりの範囲を読み取って、1つのデータに圧縮しています。
つまり、JPG画像は、細かい絵が描かれてる場合は、あまり圧縮できません。
が、似たような色ばかりの絵であれば、ものすごく容量が小さくなります。
でも、透明処理というものが、JPGにはないですね><

PNG画像は、透明処理ができて、比較的に容量が小さいですね^^
『透明処理』ができるっていうのに問題があったり??ww

BMPはwindowsの標準のでとっても容量が大きいですよねw
GIFは、ネット用??

あと、Windowsのペイントとかではなくて、PhotoShopや、フリーでも結構いいソフトはありますし、それで編集すれば、JPG画像も編集できますよ!!
また、一回ペイントソフトに読み込んで、すべてコピーして、新しいキャンパスに貼り付けたら解決できることがありますよ!

それか、編集用に、PNG画像で保存しておいて、(使うときはJPG)またそれで編集したらどうですか??

jisakugeemu 09-12-04 (金) 19:32

AzPainterっていうのを使うと(フリーのペイントソフト)
GIFやJPEGに保存しても劣化しませんよ。
自分はよくpngとgif使ってます。

>>50fpsか40fpsで300個くらいの画像を表示させていたのですが、どうしても動きがカクカクになってしまってました。
300!?
100あたりがjavaの限界かと思いますが・・・w

二つの、うさぎ 09-12-06 (日) 22:03

>PATOLEさん
自分もちょっと気になって画像のファイル形式について調べてみましたが、それぞれ適材適所らしいですね。
それから、透過処理のことをすっかり忘れてました;;

いままで、ペイントを使ってましたが、GIMPを使ったらちゃんと編集できました!
ドット絵とか、アニメ調の画像しか使わない予定なので、使う形式はgifにする予定です。
もし、背景として写真とか使う場合はそこだけjpgにするかも。

二つの、うさぎ 09-12-06 (日) 22:32

>jisakugeemuのsaharanさん

やっぱり、あまりたくさん描画することできないんですね;;
実際のゲームではそこまでたくさん描画することはないと思うので大丈夫だと思いますが、カクカクにならないかどうか心配ですww

画像編集の問題は、GIMPを使ったら解決できました!

あと、saharanさんの、あの半透明な四角とか丸はどういう風に表示させてるんですか?

jisakugeemu 09-12-11 (金) 9:56

>>あと、saharanさんの、あの半透明な四角とか丸はどういう風に表示させてるんですか?
実は、processingというライブラリーを使ってるんです。
これいいですよ、最高です!
使い方はこのあたりを参照してみるといいかもしれません。
半透明処理はライブラリーが行ってくれるんですが、多分
1、イメージのピクセルをロード
2、ピクセルにアルファ値を設定
3、イメージを描画
という方法だと思います。

二つの、うさぎ 09-12-12 (土) 2:58

>jisakugeemuのsaharanさん

processingですか~。
使っている人が近くにいたので、存在は知っていましたが、Javaのライブラリとして使えるとは知りませんでした。
描画がすごく便利そうなので使ってみたいと思います!
教えていただき、ありがとうございます。

saharan 09-12-16 (水) 12:21

>>二つの、うさぎ さん
先ほど(ずいぶん前
書いた半透明処理でしたが、Graphics2Dクラスを使えば結構簡単にできることが判明しました!

※g2はGraphics2Dクラスです。

AlphaComposite composite = AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, 0.5f);//1.0で不透明、0.0で完全に透明(見えない)
g2.setComposite(composite);//ここから先は全部半透明になる
g2.drawImage(hogehoge, 0, 0, null);

という処理で実現できました。

>>描画がすごく便利そうなので使ってみたいと思います!
何か分からないことがあったら遠慮なく聞いてくださいね~

また来ます!

二つの、うさぎ 09-12-20 (日) 18:56

>>saharanさん
半透明処理の方法 ありがとうございます。
これで、ふつうの画像も半透明で表示できるんですね。
ただ、やっぱり半透明にすると描画に時間がかかっちゃうんですね;;
たくさん描画しないといけないブロックには結局使えなそうですが、フェードイン・フェードアウトなどを行う時に使わせてもらいたいと思います。

それから、図形を描画するときには、
g.setColor(new Color(R値,G値,B値,α値));
でα値が設定できることに今気づきました;;

>何か分からないことがあったら遠慮なく聞いてくださいね~
早速ですが、processingでPApplet自体に描画することはできたのですが、PAppletを使って別のもの(例えばJAppletとかJPanelとか)に描画するっていうことはできるんでしょうか?

saharan 10-03-08 (月) 16:34

かんんんなり遅くなってすいません・・・
気付きませんでした・・・

>>早速ですが、processingでPApplet自体に描画することはできたのですが、PAppletを使って別のもの(例えばJAppletとかJPanelとか)に描画するっていうことはできるんでしょうか?
えっと、PAppletはGraphicsクラスではなくPGraphicsクラスを使って描画をしているので、他のコンポーネント(JAppletとかJPanel)への直接描画はできませんが、
そのコンポーネントに”add”してやることで擬似的な描画を実現できます。
例えばPAppletをアプリケーションで起動する場合(JFrameへの擬似的描画):
※MyAppletはPAppletをextendsしたメインのクラス

public static void main(String[] args) {
  PApplet applet = new MyApplet();//メインのアプレット
  applet.init();
  JFrame frame = new JFrame(”タイトルhogehoge”);//JFrameの作成
  frame.add(applet);//ここが重要!”add”する
  frame.setResizable(false);//サイズ変更不可
  frame.pack();//フレームのサイズをアプレットのサイズに合わせる(もしできなかった場合はsetSize(横,縦)でサイズを指定すること)
  frame.setLocationRelativeTo(null);//フレームを中央に表示
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//終了処理
  frame.setVisible(true);//可視状態にする
}

・・・こんな感じでおkです。
JPanelの場合でもadd(PApplet)するだけで大丈夫です。
init()をすることを忘れないようにしてください。
でないとひどい目にあいます。

二つの、うさぎ 10-03-10 (水) 19:59

>>saharanさん
ありがとうございます。
実は、質問しておいて自分のほうも忘れてました;

なるほど。JFrameとかにaddしてやればいいわけですか。
JFrame上でJAppletを動かす時と同じような手順でPAppletも使えるんですね。
init()のやり忘れは気をつけるようにしますw
こういう細かいけど大事なところを忘れちゃってて、それが見つけられなくてずっと悩むってことありますよねw

Comment Form
Remember personal info

Trackbacks:1

Trackback URL for this entry
http://i-libro.net/wpmu/javaexperiment/archives/274/trackback
Listed below are links to weblogs that reference
pngファイルの表示は激重い!! from 二つの、うさぎのjava実験室
pingback from 怒涛のめもめもリンク集 | Javaでタブレット取得と全画面表示 10-03-18 (木) 19:15

[...] 二つの、うさぎのjava実験室 - pngファイルの表示は激重い!! [...]

Home > javaの勉強 | ブログ > pngファイルの表示は激重い!!

Search
Feeds
Meta

Return to page top