私は 2D HTML5 ゲーム エンジン ( www.scirra.com ) を使用しており、WebGL が Chrome 18 の「Swiftshader」ソフトウェア レンダラーでレンダリングされるかどうかを実際に検出したいと考えています。もしそうなら、他のブラウザで起こるように、通常のキャンバス 2D コンテキストにフォールバックすることを望みます。そこにいる人々の多くは、ソフトウェア レンダリング時にゲームをスライドショーに変える、弱い CPU を備えたローエンド マシンを使用しており、多くの場合、2D キャンバスはハードウェア アクセラレーションされていたと思います。ただし、WebGL コンテキストの作成は Chrome で失敗することはなく、SwiftShader を検出する明白な方法はありません。
私が試したこと:
// Always returns "WebKit WebGL" regardless of SwiftShader
gl.getParameter(gl.RENDERER)
// Always returns "WebKit" regardless of SwiftShader
gl.getParameter(gl.VENDOR)
最大テクスチャ サイズやその他の MAX_* プロパティなどを考慮に入れることもできますが、SwiftShader を使用してもマシン間でそれらが変わらないことをどのように確認できますか? また、SwiftShader は一般的なハードウェアを模倣することを目的としているので、そのアプローチを使用しても多くの誤検知が発生する可能性があります。
次の理由により、起動パフォーマンス テストを作成したくありません。
- 特定のゲームではなく、エンジンを作成するだけなので、どのようなパフォーマンスプロファイルのゲームでも一般的に機能する公正なテストをどのように作成すればよいかわかりません。
- 優れたテストでは、おそらく実行が完了するまでに 1 ~ 2 秒かかるでしょう。これにより、ユーザー エクスペリエンスが中断されたり、いくつかの四角形が移動するのを見たりする必要が生じる可能性があります。
- 結果をキャッシュした場合、ユーザーがドライバーを更新して問題を修正した場合など、新たな複雑さが生じる可能性があります。
ハードウェア アクセラレーションを使用すると、WebGL のパフォーマンスがキャンバス 2D の 2 倍以上になる可能性があるため、Chrome で WebGL を完全に無効にすることはしたくありません。そんなことしたらみんな負ける。
ゲーム内スイッチやユーザー設定を追加する必要はありません。何人のユーザーがそれを気にかけているのでしょうか? ゲームが遅い場合、彼らはただやめてしまい、おそらく解決策を探しません。「このゲームは最悪だ、私はどこかへ行くだろう。」「ちなみに、このゲームが遅い場合は、この設定を「canvas 2D」に変更してみてください...
私の現在の最善の推測は、を使用することgl.getSupportedExtensions()
です。SwiftShader が次の拡張機能を報告することがわかりました。
OES_texture_float,OES_standard_derivatives,WEBKIT_WEBGL_lose_context
...しかし、実際のハードウェア アクセラレーション コンテキスト レポート:
OES_texture_float,OES_standard_derivatives,WEBKIT_WEBGL_lose_context,WEBKIT_WEBGL_compressed_textures
の追加に注意してくださいWEBKIT_WEBGL_compressed_textures
。いくつかの簡単な調査によると、これは広くサポートされている場合とそうでない場合があります。こちらのサポート表を参照してください -GL_EXT_texture_compression_s3tc
との両方GL_ARB_texture_compression
がデスクトップ カードで広くサポートされているようです。また、表にはかなり古いモデルのみがリストされているように見えるため、最新のデスクトップ グラフィックス カードはすべてサポートされていると推測できますWEBKIT_WEBGL_compressed_textures
。したがって、SwiftShader の検出基準は次のようになります。
- Windows OS
- Google Chrome ブラウザ
- WebGL コンテキストはサポートしていません
WEBKIT_WEBGL_compressed_textures
- 結果: Canvas 2D にフォールバック
もちろん、SwiftShader が将来的に圧縮テクスチャのサポートを追加すると、これは再び壊れます。しかし、ソフトウェア レンダラーを使用した圧縮テクスチャの利点がわかりません。また、実際に動作するビデオ カードがサポートされていない場合でも、多くの誤検知が発生しますWEBKIT_WEBGL_compressed_textures
。
SwiftShader を検出するより良い方法はありませんか?