2

私はJava 2Dゲームにしばらく取り組んでいます。これは、ピクセル (整数) の配列を持つラスター グラフィック システムです。

private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

次に、整数の配列を個別に作成し、(.png などの外部画像ファイルからレンダリングされた) 画面オブジェクトを使用して操作し、その配列をメインの配列にコピーして、画面に投影します。繰り返しで配列をコピーする方法を使用しても、パフォーマンスに違いは見られませんでした (実際には期待していませんでした)。とにかく、グラフィックスはうまくレンダリングされ、ゲームは順調に進んでいます.

ただし、これは非常に CPU を集中的に使用することがわかりました。アクティビティ モニターで、アプリケーションが CPU を 100% 以上使用していると表示されます。これは明らかに、更新ごとにピクセル配列 (76k 整数) を反復処理しているためです (1 秒あたり 60 回)。

私は教育目的でこの手法を選択しました。これは個人的なプロジェクトであり、単に Java グラフィックスについての洞察を得たかっただけです。私は決して、このレンダリング技術と結婚しているわけではありません。

私の質問は、関連する 3 つの部分で構成されています...

  1. 明らかに、これを行うより良い方法があります。どのライブラリ/フレームワークがそれをより良くしますか?
  2. これらのライブラリは、本質的に同じこと (ピクセルをループすること) をより効率的な方法で行うでしょうか?
  3. 外部ツールを使用せずにこの手法を最適化する方法はありますか?それとも価値がないだけですか?
4

1 に答える 1

6

OpenGL は 3D グラフィックス アプリケーションに関連付けられることが最も多いですが、2D アプリケーションにも使用できます。スプライトと背景画像の代わりに正射投影とテクスチャ化された四角形を使用すると、描画が行われているという事実にもかかわらず、3D 要素がまったくないゲームのグラフィックスとインターフェイスを構築できます。 3D。

Java で OpenGL を使用した経験はありません。ただし、LWJGLライブラリやその他のライブラリを使用して可能であることはわかっています。グラフィックパフォーマンスを大幅に向上させたい場合は、チェックしてください。

2 番目の質問に答えるために、このアプリケーションの OpenGL は、ピクセル データにアクセスして操作することはできますが、単純なブロック イメージをフレーム バッファーに転送するのではなく、3D でテクスチャ付きポリゴンを描画するために使用するのと同じ手法を使用して、実際にあなたのアプローチとは大きく異なります。

これは、C で OpenGL を使用した 2D グラフィックスの例です。これは、私が完成したことのないゲーム プロジェクトからのものですが、それでも、私が話していることの視覚的な良い例として役立つかもしれません。この場合、正投影ではなく、透視行列を使用して、3D 空間のさまざまな深さでさまざまなレイヤーを描画することにより、視差効果を得ました。

OpenGL を使用した 2D グラフィックスの例

于 2013-02-11T23:40:15.897 に答える