1

タイトルの通り、2Dプラットフォーマーエンジンのデザインを肉付け中です。まだ設計段階ですが、レンダラーに問題が発生しないか心配で、気になるなら避けたいです。

Uint16基本ライブラリに SDL を使用しています。ゲームは、タイルを保持するために単一の大きな配列を使用するように設定されます。これらは、衝突処理からグラフィック ルーチンまで、エンジンのすべての部分で使用される「タイル定義」の 2 番目の配列にインデックスを付けます。これは、私の最大の関心事です。

グラフィック エンジンは、解像度 640x480、タイル 32x32 で動作するように設計されています。フレームごとにレイヤーごとに 21x16 のタイルが描画され (スクロール時に表示される余分なタイルを処理するため)、最大 4 つのレイヤーを描画できます。レイヤーは単に個別のタイル配列ですが、タイル定義配列は 4 つのレイヤーすべてに共通です。

私が心配しているのは、このエンジンで透明度とアニメーション化されたタイルを利用できるようにしたいということです。また、デザインにあまり慣れていないので、現在のソリューションが非効率的すぎるのではないかと心配しています。うまくできた。

私のターゲット FPS はフラットな 60 フレーム/秒で、4 つのレイヤーすべてが描画されているため、毎秒 21x16x4x60 = 80,640 の個別の 32x32 ピクセルのタイルを描画する必要があることに加えて、スプライトには多くの奇数サイズのブリットが必要です。これは少し過剰に思えます。それで、私が持っているタイルマップ設定をレンダリングするためのより良い方法はありますか? ハードウェア アクセラレーションを使用してタイルマップを描画する可能性を検討しています。パフォーマンスが大幅に向上するのであれば。また、少し古いコンピューターでもこのゲームをうまく実行できることを願っています。

求めすぎるのであれば、エンジンの能力を下げることも論外ではないと思います。

4

7 に答える 7

4

問題になるのは、描画しているすべてのピクセルの合計「フィル レート」ではなく、ドロー コールの膨大な量だと思います。覚えておいてください - 毎秒 80000 回以上の呼び出しを行う必要があります。あなたの最大の改善点は、何らかの方法でこれらをまとめることだと思います。

タイルとレイヤーのフィルレートを下げる 1 つの方法は、静的な領域を合成することです。たとえば、領域を更新する必要がないことがわかっている場合は、その領域をキャッシュできます。レイヤーが独立してスクロールされるかどうか (視差スタイル) に大きく依存します。

また、Google で「ダーティ レクタングル」を検索して、ニーズに合ったスキームがあるかどうかを確認してください。

個人的には、試して見てみたいと思います。これはおそらくゲーム全体のデザインには影響しません。ロジックとプレゼンテーションをうまく分離できれば、牛が帰ってくるまでタイルの描画を最適化できます。

于 2009-07-15T06:09:59.620 に答える
2

実際にアルファを使用するタイルでのみアルファ透明度を使用し、空白のタイルの描画をスキップするようにしてください。可能であれば、タイル サーフェスの色深度が画面の色深度と一致することを確認し (アルファ チャネルを持つタイルのオプションではありません)、タイルをビデオ メモリに格納して、可能な場合は sdl がハードウェア アクセラレーションを使用するようにします。カラー キーの透明度は、部分的な透明度や背景とのアンチエイリアス処理されたエッジのブレンドが不要な単純なタイルの場合、完全なアルファ チャネルを使用するよりも高速です。

500mhz システムでは、レイヤーごとのピクセルごとに約 6.8 cpu サイクル、または画面ピクセルごとに 27 の cpu サイクルが得られます。これは (私が思うに) すべてのレイヤーのすべてのタイルに完全なアルファ チャネルがある場合には十分ではありませんが、可能な場合は、上記のような近道をとれば問題ありません。

于 2009-07-15T06:24:08.843 に答える
1

昆布さんに同意。これが単純なタイル ベースの 2D ゲームである場合、これは Crysis ではないため、基準を少し下げる必要があります。30FPS は非常にスムーズです (30FPS に制限されている Command & Conquer 3 を調べてください)。それでも、GDI+ を使用して 14FPS (1900 x 1200) で動作するリモート デスクトップ ビューアーを作成しましたが、それでも非常にスムーズでした。2D ゲームの場合、特に SD​​L を使用すると、おそらく問題ないと思います。

于 2009-07-15T06:11:39.773 に答える
1

各完全なレイヤーをそのビューにバッファリングし、4 つの端すべてに追加のタイル サイズを加えて (垂直スクロールがある場合)、バッファを再度使用して、最初の列を除いた新しいバッファを作成し、新しい端の列に描画できますか? これにより、不要な再描画が大幅に削減されます。

さらに、60fps が必要な場合は、低速システム用のフレーム スキップ メソッドを作成する方法を調べて、1 つおきまたは 3 つおきの描画フェーズをスキップできます。

于 2009-12-07T02:55:15.390 に答える
0

これらのタイルを 1 秒間に何枚描画できるかに驚くと思います。最新のグラフィックス ハードウェアは、60 fps でフレームごとに 1600x1200 フレームバッファを何度も満たすことができるため、640x480 フレームバッファは問題ありません。試してみて、何が得られるかを確認してください。

ハードウェア アクセラレーションを確実に活用する必要があります。これにより、わずかな労力で 1000 倍のパフォーマンスが得られます。

最適化が必要な場合、最も簡単な方法は、最後のフレーム以降に変更された画面の領域のみを再描画することです。アニメーション化されたタイルと、フレームごとに状態が変化したタイルについて知る必要があるように思えます。ゲームによっては、まったくメリットがない場合もあれば、大幅に節約できる場合もあります。これは、フレームごとに画面がどの程度変化するかによって異なります。

于 2009-07-15T06:11:41.630 に答える
0

同じテクスチャを持つ隣接するタイルを、テクスチャ タイリング (一種のビルド プロセス) を持つより大きなポリゴンにマージすることを検討することもできます。

于 2009-07-15T06:17:39.417 に答える
-1

フレームレートを 30fps に下げるとどうなりますか。2Dゲームとしては十分だと思います。

于 2009-07-15T06:07:29.127 に答える