Flashゲームのレンダリングパフォーマンス


11

私はネイティブフラッシュレンダリングBitmapDataカスタムフレームバッファーの構築についてSOを読んでいて、答えのいくつかは少し矛盾していたので、私は疑問に思いました:

  1. 一般に、カスタムビットマップバッファールートを使用するのがベストプラクティスですか、それともレンダリングをフラッシュエンジンに任せるのがベストですか?
  2. MovieClipスプライトではなくベクターアニメーション(s)を使用している場合、それによって上記の答えが変わりますか?
  3. もしそうなら、スプライトベースのアニメーションを使用することがベストプラクティスですか?

(違いが出る場合は、Flash 10を対象としています)

回答:


14

1.一般的なベストプラクティスはありません。

ゲームに多数の(複雑な形状の)要素、パーティクルなどがある場合、ビットマップバッファーアプローチの方がはるかに高速になります。また、ビットマップバッファーは、スプライトの複雑さが増すにつれて、より適切にスケーリングされます。より複雑なシェイプやトゥイーン(シェイプトゥイーン)アニメーションを使用すると、ベクターレンダラー遅くなりますが、他にもいくつかの利点があります。

  • 品質を損なうことなく、アセットを自由にスケーリングしたり、シーンにズームインすることもできます。
  • 回転または傾斜などの他の変換は、ベクターグラフィックスで実行する方がはるかに簡単です。

つまり、結論としては、どのようなゲームを構築しているのかということになります。

2.ビットマップスプライトシートの代わりにMovieClipsを使用する

AS3 Spriteクラスではなく、「ビットマップスプライトシート」を意味していると思いますか?

これは実際には違いはありません。MovieClipベースのアニメーションは、いつでもアニメーションビットマップに変換できます。手動で、ムービーをフレームにエクスポートしてスプライトシートに変換するか、動的に実行時にMovieClipからスプライトシートをレンダリングします。これが私がこれを行う方法です:

  1. MovieClipとそのインスタンスを作成しますstop()
  2. new BitmapDataムービークリップと同じ幅と高さのオブジェクトを作成します。
  3. MovieClipをBitmapDataにレンダリングするには、draw()メソッドを使用します。
  4. BitmapDataオブジェクトを配列またはベクターに格納します。
  5. ムービークリップの次のフレームに移動し、ステップ2〜4を繰り返します。これは、ムービークリップの最後のフレームに到達するまで行います。また、MovieClipフレームの最大幅最大高さで2つの変数を更新することをお勧めします(これらはフレームごとに変わる可能性があるため)。
  6. これで、格納されているすべてのBitmapDataオブジェクトをスプライトシートに組み合わせることができます(BitmapData.copyPixels()を使用)

3.スプライトベースのアニメーション

最初の質問への回答で述べたように、それに対する明確な回答はありません。たとえば、オブジェクトで多くの変換を実行する必要がある場合。スケーリング回転あなたはフラッシュネイティブレンダラを使用して、おそらくより良いオフにしています。あなたは事前に定義されたアニメーションを得た場合、それはスプライト・シート(手動または動的)に焼くことができ、そしてあなたが同時にスプライトの数百を表示する必要がある場合は、ビットマップのレンダリングエンジンのために行きます。


Flashがレンダリングにハードウェアアクセラレーションの使用を開始する場合(ある場合)、copyPixelレンダラーはおそらくネイティブレンダラーよりも遅くなります。
Bart van Heukelom、2010

6

スプライトを使用してラスターベースのゲームを構築する場合は、BitmapDataを使用してカスタムレンダリングソリューションを構築することになります。ベクトルベースのゲームを構築する場合は、MovieClipsを使用して組み込みのアニメーションメカニズムを使用してください。

カスタムレンダリングソリューションの構築に取り掛かる場合、必要なことを達成するためにActionScriptのみを使用して、Flashとの関連付けをほとんど解除します。flixelエンジンは、このメソッドを使用し、それは非常にうれしいです。私は自分のエンジンをゼロから書くことを好みますが、あなたはそのアイデアを理解します。

ライブラリアセットをMovieClipsとして簡単に作成し、必要に応じてActionScriptでインスタンス化できるため、組み込みのFlashアニメーションメカニズムを使用すると、ベクターベースのゲームに最適です。ムービークリップのタイムラインを使用してアニメーションを処理し、それに応じてスプライトの場所を移動します。バトルオン!アドベンチャークエストワールドのようなゲームでは、この方法を使用します。それもいい感じです。

あなたの最後の質問は、ベクターアニメーションのMovieClipクラスの代わりにSpriteクラスを使用することについて言及していると思います。スプライトはタイムラインのないMovieClipなので、アニメーションを管理してもらうと便利です。


3

ブリッティングがより速いというのは一般に信じられている信念ですが、これを証明するベンチマークは見たことがありません。一部の開発者は、Flashをより一般的な仮想マシンとして扱い、レンダリングを制御できるため、ブリッティングを好むだけです。ただし、組み込みの表示リストが好きな場合は(私はそうします)、Flashは移動、拡大縮小、回転を行い、数百の画面上のDisplayObject(MovieClips、Sprites、Bitmapsなど)に高いフレームレートで素晴らしい効果を適用できるため、サイズが非常に小さい限り、たとえば、それぞれ200x200ピクセル未満です。ベクターを使用せずにMovieClipsを使用できます。ほとんどのゲームは、使用するシステムに関係なくビットマップアセットを使用します。ただし、特にピクセルアーティストではなくFlashスペシャリストデザイナーを使用している場合は、タイムラインでビットマップアセットをレイアウトしてアニメーション化すると便利な場合があります。ステージの品質をLOWに設定することにより、醜い変換を犠牲にしてはるかに優れたパフォーマンスを得ることができます。Flashは画面外のオブジェクトをレンダリングしないため、速度が低下することはありません。

Flashが遅くなる可能性があるのは、非常に大きなビットマップを移動および変換する場合です。たとえば、非常に大きなスクロールレベルや多数の視差レイヤーがある場合などです。オフスクリーンバッファーから背景をブリットしながら、ゲームオブジェクトにMovieClipsを使用するハイブリッドアプローチの方が高速であり、標準のスプライトとMovieClipsの使いやすさを維持しながら、無限に大きなレベルを実現できます。


複雑なベクトル形状もパフォーマンスに大きな影響を与える可能性があります。グラデーションの多いアニメーションMovieClipsを取得し、ベクターシェイプの詳細レベルに注意を払わない場合、ビットマップよりも描画が遅くなります。
bummzack 2010

ベクターを使用せずにMovieClipsを使用できます。ほとんどのゲームは、使用するシステムに関係なくビットマップアセットを使用します。ただし、特にピクセルアーティストではなくFlashスペシャリストデザイナーを使用している場合は、タイムラインでビットマップアセットをレイアウトしてアニメーション化すると便利な場合があります。
Iain、

ええ、フラッシュゲームでは、HUDとプレーヤースプライト上のいくつかの点を除いて、ベクターになり、フレームごとにフラッシュによってレンダリングされるものにはグラデーションを使用しないことをお勧めします。グラデーションは、パフォーマンスを速く消費します。
AttackingHobo

いくつかのレンダリングおよび更新ベンチマーク:8bitrocket.com/2007/12/23/...
マックスDohme
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.