2016-10-04 5 views
0

私はJavaで2Dのタイルベースのゲームを書いています。文字は、ゲームロジックに従ってタイル上に配置される。各文字は、java.awt.Graphics2Dを使用して画面に描画される画像に関連付けられています。ただし、マップ上に各文字のインスタンスが複数存在する可能性があります。Javaクラスをイメージにロードする - 最も効率的な方法ですか?

文字の画像を保存してアクセスする際の推奨慣行は何ですか?

私は考えることができ三つの可能な実装があります。

  1. タイプjava.awt.image.BufferedImageのプライベート変数を割り当てられた各文字を有します。オブジェクトを描画する必要があるたびに、ゲッターを使用してイメージにアクセスします。しかし、これはオブジェクトのサイズが大きすぎる原因になりますか?
  2. 静的変数にすべてのイメージを格納する別のユーティリティクラスがあります。文字を描画する必要があるたびに、ユーティリティクラスの静的ゲッターメソッドにID /名前を渡すことでイメージを呼び出すことができます。これはより効率的か、以前の方法よりもかなり遅くなるでしょうか?
  3. 文字を描画する必要があるたびに画像をロードするだけです。これは、文字を描画する必要があるたびにImageIO.read(new File(character.getImagePath())を引き起こします。これは最も速いでしょうか?
+1

オプション3を使用する必要はありません。ペイント方法は、通常、毎秒何回か呼び出されます。*オペレーティングシステムのキャッシュが有効であっても頻繁にファイルを読み込むと、ゲームがクロールに遅くなります。 – VGR

+1

個々の画像の代わりにスプライトシートを使用します。 – eldo

答えて

1

私はゲームを最適化する方法に関するいくつかの記事を読んでいます。最初に必要なリソースを読み込んで後で使用するために保存することは非常に重要です。最長の操作のいくつかはファイルI/Oコードにあります。例外が発生する可能性もあります。たとえば、3番目のオプションでImageIOIOExceptionを投げるとどうなりますか?あなたはイメージを持っていないでしょうし、他のものをレンダリングする必要があります。画像の読み取りに予想以上の時間がかかると、ユーザーのゲーム体験にも邪魔になる可能性があります。あなたが考えてみれば、あなたの第一及び第二のオプションについて

// Imports and other stuff... 

// Parameter flocation: resource location 
private BufferedImage preloadImage(String flocation){ 
    BufferedImage bufimg = null; 
    System.out.println("Attempting to load image: '" + flocation + "'"); 

    try { 
     bufimg = ImageIO.read(this.getClass().getResourceAsStream(flocation)); 
    } catch(IOException e){ 
     System.err.println(
       "An error occurred while attempting to load '" + flocation + "'"); 

     return null; 
    } 

    // Now store this somewhere safe! 
    return bufimg; 
} 

は、本当に大きな違いがない。

はここに(あなたの.jarで)リソースを事前にロードするための例の抜粋です。最初の文字は各文字にフィールドを追加し、もう1つはすべての文字イメージを管理します。個人的には、コードクラッタを減らして可読性を向上させるため、第1のオプションが好まれます。もちろん、テーマに基づいてコードをグループ化することもできます.2番目のオプションは完全にうまくいきます。

関連する問題