ブラウザーベースのゲームを構築する際に、キャンバスにするか、キャンバスにしないか?


14

背景:私は広範な開発の背景を持っていますが、ゲームをコーディングしたのは何年も前です。私のJavascriptスキルは非常に限られており、テトリス、パックマン、またはその複雑さレベルの単純なゲームを構築することにより、それらを改善するつもりです。

質問:私がしなければならない基本的な選択は、<canvas>要素にレンダリングするかどうかです。

キャンバスには、ポイント、ライン、さらに複雑なものをレンダリングするための基本的なツールがあります。おそらく、これを支援するためのさまざまなフレームワークがあります。

キャンバスがなければ、オブジェクトをDOMツリーに保持できます。通常のWebページのように、非常に複雑で、多くの要素が重複しています。

1つのアプローチは他のアプローチよりも優れていますか?それらは相互に排他的ですか?どれを選ぶべきかをどうやって知るのですか?

回答:


13

CanvasとDOMは相互に排他的ではありませんが、かなり分離されています。良い方法の1つは、Canvasを使用してメインゲームエリア(テトリスの落下部分など)をレンダリングし、キャンバス要素に重なっているDOM要素ですべてのUI(スコア表示など)を実行することです。

そうは言っても、そのようなアプローチはテトリスのような原始的なゲームには本当に必要ではありません。Canvasは、より高度なグラフィック効果に役立ちますが、それらが不要な場合は、DOMに固執することで互換性が広がります。すべてのブラウザがHTML5 Canvasをサポートしているわけではありません。


3
正直に言って、昨年のHTML5ゲームで正社員として働いていたので、Canvasをサポートしていないブラウザーは、とにかくまともなゲームには十分な速さではありませんが、Androidの携帯電話のWebKitより遅くはありません... :(
Ivo Wetzel

ありがとう:)私は「ブラウザのサポート」にあまり関心がありません。それが問題になるほど十分に学んだ頃には、問題が解決することを期待しています。これは主に楽しみと学習のためです。
レサリオン

私もそれをやっています:ゲーム自体はキャンバス上に描かれ、GUIは部分的に透明なDOM要素で構成されています。
フィリップ

私は同じように感じる@IvoWetzel ...私たちも、モバイルプラットフォーム上のゲームに取り組むとAndroidはかなり再生できない...である
ヴォーンHilts

12

DOMについてDOM
は旧式の2Dで非常にうまく機能します。つまり、画像の回転やスケーリングを使用しません。実際には、これらの両方のジョブ用のツールがありますが、それらのパフォーマンスが期待できるものではありません。

ゲームでは、ブラウザレイアウトエンジンにできるだけ依存しないようにする必要position:absoluteがあります。つまり、オブジェクトの配置に使用する必要があります。非常に可変数のオブジェクトが必要な場合は、アイドル状態のDOM要素のプールをに設定しdisplay:none、必要に応じて復活できるように、DOMオブジェクトを常に作成および破棄しないようにしてください。

DOMとキャンバス
IE8の市場シェアでは、縮小するキャンバスがますます魅力的なオプションになりつつあり、ほとんどのゲームではおそらく素晴らしい選択です。ただし、一部のジョブではDOMが使いやすいツールであり、必要に応じてドキュメントフローを使用したり、レンダリングされたオブジェクトで直接クリックをキャッチしたり、スクロールバーを簡単に統合したりできます。

パフォーマンスの違いをカバーするのは難しく、ジョブに依存し、ブラウザごとに大きく異なります。


2
言及するつもりはなかったがposition:absolute、それは良い点だ。
12

DOMがそうでないレベルで、キャンバスGPUは加速されていませんか?
トーマス

1
@Thomas GPUアクセラレーションがあることを確認できる唯一のスポットはwebGLです。(技術的にはなしで実装できますが、それは起こりそうにありません)。最初のキャンバス2D実装は厳密にCPUでしたが、一部のブラウザーの機能の一部はGPUに移行しましたが、すべてのケースでパフォーマンスが大幅に向上したわけではありません。DOM GPUアクセラレーションに関しては、彼らはそれに取り組んでおり、私はそれが起こるべきではないという特定の理由を見ません。いずれにせよ、最終的に重要なのはブラウザがそれをどのように行うかではありませんが、必要に応じて十分に機能する場合、GPUは常に高速を意味するわけではありません。
aaaaaaaaaaaa

GPUが常に高速であるとはどういう意味ですか?PCではこれは本当かもしれませんが、モバイルプラットフォームでは、GPUでより多くのレンダリングを行い、CPUがAIなどのゲームロジックの実行に費やすより多くの「サイクル」を持つようにします。 。
トーマス

1
@Thomasプラットフォーム、仕事、その他多くのことに依存します。Old-school 2Dは主にメモリ操作であり、メインメモリにリソースを保持し、それらの操作にCPUを使用すると、携帯電話でもかなりうまく機能しますが、他のプロセッサのメモリにあるデータに対して操作を実行しようとするとパフォーマンスが低下します。したがって、GPUで実行できない操作とGPUの操作を混在させると、操作に応じてバッファをやり取りするか、プロセッサの1つが他のプロセッサメモリに書き込むことになります。
aaaaaaaaaaaa

6

キャンバスはそれらの「ほとんど」に適合しますが、ゲームのタイプに完全に依存します。

DOM管理は特定の時点で恐ろしくなり、要素が多くなるほど遅くなり、非常に遅く動く要素が増えます

IMG要素を使用したアセットの読み込み順序の管理は...簡単ではありません(イメージタグの意図的に破損したプロトコルのインターセプトエラー:D)。

ただし、ほとんど静止画像で効果数が少ないゲームの場合は、DOMを使用します。それ以外の場合、キャンバスが最初の選択肢です(ヒットマップは別の話ですが、ポイントとクリックなど)。

Canvasは最近(iPhoneでも)非常に高速であるため、使用しない理由はほとんどありません。


速度に関しては、Aves Engineのビデオプレゼンテーションに基づいて、数千の要素がある場合、DOMは実際にはキャンバスよりも処理が高速でした。あなたは同意しませんか?これは変わりましたか?私は再びそのビデオを見つけられることを望みます
...-レサリオン

1
:DI作品Zynga、Avesを作った男と。去年は状況が変わったので、私を信じてください:)
Ivo Wetzel

-1、ゲーム以外のアプリケーション用に〜100000 dom要素を試しましたが、ほとんど機能しませんでした。しかし、数千の要素には問題はありません。更新のたびに何千もの画像をキャンバスに描画する場合も、キャンバスが高速になるわけではありません。
aaaaaaaaaaaa

@eBusiness次に、複雑なZ順序付けと3D変換を導入します。それで幸運:)
Ivo Wetzel

4
@IvoWetzel 3Dを実行する場合は、キャンバスが選択されます。しかし、それはあなたの答えが言っていることではないので、あなたのポイントは何ですか?
aaaaaaaaaaaa

2

HTML5ゲームを作成している場合、キャンバスははるかに優れています。その理由は次のとおりです。

  1. 速度-キャンバスをイメージと考えてください。画像に描画すると、描画したものが忘れられます。これにより、DOMまたはSVGと比較してパフォーマンスが劇的に向上します。DOMおよびSVGアプリケーションは、画面上に配置したすべてのオブジェクトを追跡します。つまり、画面上に多くのオブジェクト(特にオフスクリーンまたは非表示)がある大きなレベルがある場合、それらは描画され、とにかく追跡されます。
  2. 描画機能-DOM要素には強力なCSS3変換がありますが、それはキャンバスの機能と比較しても何でもありません。キャンバスは任意のオブジェクトを描画でき、強力なグラデーションサポート、オブジェクトを3Dで表示するためのプラグイン、フィルターなどを使用できます。
  3. サポート-DOMを使用する場合、変換やアニメーションなどの実験的な機能を使用する場合は、CSSで-moz-、-webkit-、-o-、および-ms-プレフィックスを使用する必要があります。キャンバスでは、それについて心配する必要はありません。1つの関数で描くだけで完了です。キャンバスの別のサポート関連の利点は、アプリケーションの表示方法です。ウェブサイトの開発者として、ブラウザー間のDOM標準化の欠如は私を気が狂わせます。背景、グラデーション、変換などは、詳細なW3C仕様にもかかわらず、ブラウザ間で異なって表示されます。キャンバスでは、異なる可能性のある1つのこと、つまり背景だけに出くわしました。タイル状の背景を表示するとき、一部のブラウザはタイルの中心をx軸の0pxとして「tile-x」を使用し、他のブラウザは単にタイルを下にタイルとして使用します。
  4. ライブラリとドキュメント-キャンバスを使用してゲームを作成するためのドキュメントには、膨大なライブラリがあります。いくつかのライブラリ:CreateJS、paper.js、fabric.js、KineticJS、libCanvas、Processing.js、PlotKit、Rekapi、PhiloGL、InfoViz Toolkit、Frame-Engine、CAKE、Raphaeljs、Tweenjsなど。意味がありません。

欠点-アニメーション-アニメーション用の優れたライブラリは数多くありますが、CSS3アニメーションが大好きです。作成、操作、トリガーがとても簡単です。CSS3アニメーションをキャンバスのオブジェクトで動作させるためのさまざまなハックがありますが、ほとんどの人はその方法を使用したくないと思います。

あなたのゲームで頑張ってください、そしてあなたの作品を見てみたいです!


2

モバイルブラウザー、特にAndroidをターゲットにすることを検討しており、ゲームに動くグラフィックが含まれている場合は、DOMアニメーションを避けてください。Androidのストックブラウザは、ウェブキットであるにもかかわらず役に立たない。開始する前に、このAndroidの発行スレッドをチェックしてください:「ブラウザーおよびWebViewでのCSS3およびJavascriptアニメーションのひどいレンダリング」。。

Canvas自体は高速ではないかもしれませんが、CocoonJSなどのキャンバスアニメーションのハードウェアアクセラレーションを呼び出すフレームワークがあります。サイトにはビデオへのリンクがあり、フレームワークを使用して達成できるパフォーマンスの向上を示しています(ただし、何らかの理由で2つ以上のリンクを投稿することはできません)。


2

簡単な答え:キャンバスフォールバックを使用したWebGL。

細かな答え:ゲームに大量のテキストがある場合は、HTMLテキストレイヤーをオーバーレイします。Pixi.jsは、これに適したいくつかの便利な追加機能を備えた、戦闘に強いディスプレイフレームワークです。


1

DOMの略を思い出してください ドキュメントのオブジェクトモデルの。非常にまれな状況でのみゲームを作成するために使用し、ほとんどの場合キャンバスを好むでしょう。

ゲームのグラフィック要件が小さい場合でも、DOMで実行するとパフォーマンスが低下します。Tetris以外のものはおそらく十分に動作しません。

実世界の例があります。ConwayのGame of Lifeの実装を作成したとき、500x500のテーブルから始めて、セルの背景色を変更しました。このバージョンでは、グライダーは30 fpsを超えて実行されていませんでした。大きなパターンは1を超えることはほとんどありませんでした。このゲームの私のキャンバスバージョンでは、 〜30 fps。

また、これはSVG(Scalable Vector Graphics)にも当てはまりますが、実際には試したことはありません。

編集:私の例はあまり良くないことを認めなければなりません(なぜならテーブル=悪いからです)。しかし、要点は依然として真実です。DOM操作はドキュメント用です。ブラウザは、要素を操作するときにCSSを検索し、より多くのメモリを割り当てる必要があります。キャンバスよりも高速であることは、実際には意味がありません。


いつからDOMのパフォーマンスは低下します。ハードウェアアクセラレーションではなく、それが唯一の違いです。また、セル上の背景色の500x500テーブルは効率的なDOM実装ではありません
-Raynos

1
@Raynos効率的なDOM実装ではないことに気付きました。ピクセルを操作する場合はありません。
コピー

1
-1、大きなテーブルはパフォーマンスを低下させます。個々のピクセルを操作したい場合、Canvasは間違いなく優れたツールですが、このような貧弱なDOM実装に対して設定すると、実際にはサンプルが無意味になります。気が遠くなると、DOM実装での私のベストショットは、必要に応じてスワップされる32の異なる背景画像を持つ50000 5x1 divです。
aaaaaaaaaaaa

@eBusinessええ、人々はすでに私に言った。残念ながら、私は当時自分ではそれを理解していませんでした:-/
コピーします

@ Raynos、DOMは決して高速ではありませんでした。実際、canvasの最大の理由の1つは、DOMが遅いためです。関連:stackoverflow.com/q/6817093/632951
Pacerier
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.