キャンバスは単なる画像に過ぎません。私の経験から、キャンバスや画像はパフォーマンス面で違いはありません。
オフスクリーンまたはキャンバスでも同じですが、可能な限りGPUを利用します。 context.getImageData()
、context.createImageData()
、およびcontext.putImageData()
は、リアルタイムレンダリングのために避けるべきであるを使用して
、それはGPUを利用していない、あなたがそれを行う任意の処理では、JavaScriptによるメインメモリ内で行われます。データは型付き配列Uint8ClampedArray
に格納されますが、Uint32Array
のような型指定された配列に変換できますが、1つのピクセルを4ではなく1つの変数で扱うことができます。型付き配列には多くのネイティブ関数もあります。標準のJavascript配列よりもはるかに迅速な配列操作を提供します。
イメージのキャンバスを含む制限要因は、使用可能なGPU RAMの量です。使用可能なRAMの容量を超えた場合、ブラウザーはGPU RAMに画像をスワップしますGPUのレンダリング能力をブロックし、メインRAMからGPU RAMへの転送は、通常のRAMアクセスと比較して遅い。これが起こると、即座にフレームレートの損失が見られます。ブラウザが実行できる膨大な種類のプラットフォームがあり、マシンの機能を知る方法がないため、リアルタイムアプリケーションを公開するときには注意が必要です。
ハイエンドデスクトップマシン用の高解像度画像でゲームを作成した場合、タブレットやローエンドのノートパソコンではパフォーマンスがあまり良くありません。この問題を軽減するには、画面の解像度に合わせてイメージをダウンサンプリングします。解像度の1/8のデバイスの背景画像を使用すると、ハードウェアに過度の負担がかかります。デバイスは画面の解像度を処理するように作られていますが、この解像度を超えると大きな不必要なパフォーマンスが発生します。オフスクリーンキャンバスを使用して、デバイスのネイティブ解像度でイメージをレンダリングし、元のイメージをダンプできます。品質の低下はありませんが、パフォーマンスが大幅に向上し、再生できないものが再生可能になります。これはすべてのグラフィックリソースに適用されます。使用しているデバイスが表示できる解像度より高い解像度でイメージを保存したり使用したりしないでください。
キャンバスで行うことができるさまざまなことがありますので、最もうまくいくのは実験することです。フレームレートを監視し、問題のさまざまなアプローチを手近に試してください。フレームレートが上がった場合は、フレームレートが低下した場合は、間違った方法を使用した方が良い方法を見つけました。
あなたが言っているのは、私がRPGのようなものを作り、たくさんの異なるタイルを持っているならば、私はそれらをオフスクリーンキャンバスですべてレンダリングし、そのキャンバスからデータを得て、 ? –
はい:キャンバスに配置されている各タイルには小さなオーバーヘッドがあります。オフスクリーンバッファを描画すると、メモリやスクリーンに描画する必要がなくなるため、メモリに保存されるのですばやです。 –
複数のキャンバスはゲーム開発にとってより有益でしょうか? 1つはタイル用、もう1つは私の主人公用です。 –