SafariとApple Vision ProにおけるWebGLのパフォーマンス
Safari–特にiOSでの–は、3Dウェブ構築におけるパフォーマンス上の挑戦の頂点として常に見なされてきました。WebGLのMetalベースの実装とWebKitの独特のパフォーマンス特性が、特に興味深い課題をもたらしています。
この記事では、SafariでのWebGLアプリのパフォーマンスを向上させるための洞察を提供します。
Apple Vision Pro
最近のApple Vision Proの発表により、SafariにおけるWebGLパフォーマンスの重要性はさらに増しています。Apple VisionのSafariバージョンは、MacOSおよびiOSのSafariのすべてのパフォーマンス特性を継承しています。
Apple Vision ProでのWebXRに関する詳細な記事を近日中に公開予定です。ニュースレターを購読して通知を受け取ってください。
Wonderland Engine on Apple Vision Pro
もしWonderland Engineを既に使用しているなら、良いニュースがあります。0.9.0リリースのために行ったすべての最適化はApple Vision Proにも反映されます。
Apple Vision Proにアクセスできる開発者からは、Wonderland Engineベースのアプリでの素晴らしいパフォーマンスの報告があります:
Safari向けの最適化
別のフレームワークを使用している場合は、WebGLパフォーマンスプロファイリングブログ記事をぜひご覧ください。この記事には、アプリケーションのボトルネックを特定し、最適化すべき部分を見つけるヒントが含まれています。
加えて、Safariでプロファイリングを行う際に見られる可能性のあるいくつかの注意事項を以下に示します。いずれも万能ではないため、自分のアプリケーションをプロファイリングして、どれが問題を引き起こしているかを特定してください。
ボトルネック
SafariでWebGLを使用する際に遭遇する可能性のある特有の問題をいくつか紹介します:
Uniform Buffers
AppleのグラフィックAPI Metal とWebGLの差異により、SafariはWebGLスタイルのユニフォームバッファを内部でエミュレートしなければなりません。このエミュレーションにより、UBOsのパフォーマンスを予測するのは困難です。ある使い方では問題ない一方で、不適切なタイミングでデータをアップロードしようとすると150msの遅延が発生する可能性があります。
このコードスニペットは、Metalの実装から、WebKitがWebGL2 APIを実装するために使用しているAngleで、GLESに相当するWebGLのbufferSubData
の実装を示しています。この情報は、ブラウザ開発者が一貫したグラフィックAPIを提供するために行っている努力を理解するのに役立ちます。また、Wonderland Engineのチームがブラウザの性能を理解し最適化するためにどのような努力をしているかも示しています。
SafariがWebGL2のサポートをリリースするまでに時間がかかったことに対する不満もありましたが、2021年9月にSafari 15でWebGL2サポートをリリースしました。WebKitとAngleのコードを読むと、その実装が簡単ではなかった理由について理解が深まります。
WebGL状態アクセス
WebGLのgetParameter
関数は、パフォーマンスに驚きをもたらすことがあります。無害に見えるこの関数は、実際には大きなパフォーマンスコストを引き起こす可能性があります。
WebGLエラー
一般にgetError
でエラーをチェックするのは良い考えですが、フレームコールバック外での使用は避けるべきです。それは予想以上にコストが高くなる場合があるからです。
メモリと制限
WebGL Safariは、テクスチャサイズ、レイヤー、ユニフォームバッファサイズなどの制限を報告します。これらの制限をチェックする良いツールはwebglreport.comです。
Safariは理論的にはこれらの限界までメモリを確保できますが、それが原因でページがクラッシュすることがあります。
iOSでメモリ資源をより効率的に使用するために、Wonderland Engineは_テクスチャストリーミング_と呼ばれる機能を提供しています。これは、フレームの現在の必要に基づいてテクスチャの一部を動的にメモリに出し入れする仕組みです。デフォルトで有効になっています。
閉じの言葉
Apple Vision ProでのWebXRに関する詳細なブログ記事を近日中に公開予定です。ニュースレターを購読して公開時に通知を受け取ってください。
それまでの間、Wonderland Engineを試してみてください。特にUnityから移行する方には、Wonderland Engineは学びやすいです。
Discordサーバーに参加して、始めるための適切なリソースをご案内します。