私の経験では、今日まで、Flashベースのゲームよりも、JavaScript(Canvas)ベースのゲームのエンティティの動き/アニメーションの視覚的な遅れが多く見られます。
これはなぜですか-JavaScript対Flashの特定のシナリオにおけるJITコンパイラーとAOTコンパイラーの間の最も基本的なレベルでの不一致は正確には何ですか。
私の経験では、今日まで、Flashベースのゲームよりも、JavaScript(Canvas)ベースのゲームのエンティティの動き/アニメーションの視覚的な遅れが多く見られます。
これはなぜですか-JavaScript対Flashの特定のシナリオにおけるJITコンパイラーとAOTコンパイラーの間の最も基本的なレベルでの不一致は正確には何ですか。
回答:
ゲームを遅らせるのはコンパイル方法ではなく、ガベージコレクターであり、Flashガベージコレクターはブラウザーから独立しています。
私は、Firefoxを実行していることを確信を持って推論できると思います。Firefoxのガベージコレクターは、ゲームの観点から見ると、入手可能な最悪のがらくたです。1つのタブのみを開いて、その中で軽いJavaScriptゲームを実行する場合、通常は許容できますが、気付かないこともあります。しかし、たくさんのタブを開いたり、少し要求の厳しいものを実行したり、Firebugを使用したりすると、簡単に100ミリ秒を超える定期的なラグスパイクが発生します。
長いテストはしばらく行っていませんが、Chromeはこの点に関して常に非常に優れており、IE9とSafariのどちらも許容できる仕事をしているようです。
私はJavaScriptラグをテストするためのツールを作りました、あなたが好きならそれで遊ぶことができます:http : //ebusiness.hopto.org/lagtest/
実際のコードを見ずに言うのは難しいですが、いくつかの点があります:
フラッシュはもっと長い間使われてきました。そのためのツールとライブラリを作成する人は、アニメーションの処理に多くの経験があります。私はツールや独自のテクノロジーの大ファンではありませんが、彼/彼女が何をしているかを知っているActionScript開発者をノックすることは決してありません。
JITブラウザーは、JS開発者にとっても比較的新しいものです。本当に洗練されたperfイニシアチブの最良の選択は、コミュニティとして整理しているものです。インライン関数のdefsは、多くの場合、境界線のばかげたことでした。これは、多くのJITシナリオでパフォーマンスを向上させる優れた方法です。
多数のブラウザを正規化する必要はありませんが、多くの場合、特定のブラウザの全機能を最大限に活用できません。
(編集:これについては正しくありませんが、ここでポイントが残っている可能性があります-Erik)Flashプラグインはベクターに対応しており、それを最大限に活用する方法が広く理解されています。継承スキームがキャンバスコンテキストオブジェクトで私たちにたくさんの利益をもたらすかどうかはまだわからないのですが、ベクトルから抜け出すのと同じくらいの勝利になるとは思えません。
FlashはまだJITコンパイルされており、ほとんどの最新のブラウザーではJavaScriptもそうですが、Flashは強く型付けされた言語です。 JavaScriptが動的に型付けされているため、JavaScriptが実行できない(メソッドへの呼び出しを直接発行する(JavaScriptが実行できない)など)ことができる最適化の領域全体があります。JavaScriptの関数の定義全体をいつでも置き換えることができ、その新しい定義を呼び出す必要があります。(JavaScriptが間接呼び出しを実行することは依然として可能ですが、それほど高価ではありません)フィールドへのフィールドアクセスは、JavaScriptが間接的に実行することさえできないため、実際にはメソッド呼び出しよりも良い例です。
パフォーマンスのもう1つの違いは、すでに述べたように、GCです。ほとんどのブラウザは参照カウントGCを使用していると思います(チェックしていません)。ページが離れると、ページに割り当てられたGCはすべて解放されるため、参照カウントGCを使用するのに最適な場所の1つです。 )、または保守的なスキャンGC(Boehmなど)。正しく実装されていない場合、後者は前者よりもかなり遅くなる可能性があります。(Boehmは正しい実装の例です)一方、Flashは正確なGCを使用します(厳密に型指定されたシステムでははるかに簡単です)。Flashは正確なGCを使用するため、参照カウントのランタイムオーバーヘッドがありません。(巨大ではありませんが、まだ存在しています)正確なGCの良い例は、MonoのSGenです。これにより、ヒープも圧縮されます。
次に、JavaScriptがアニメーションを考慮して設計されていないという事実があります。(また、言及されたように)私の知る限り、アニメーションループに対してSSEスタイルの命令を出力するブラウザーはありません。(生のアセンブリで書かれているいくつかの場所で)
全体として、動的言語は、ユーザーが遅いことに不満を言わないようにタイムリーにコンパイルする必要がある場合、静的に型付けされた言語よりも常に遅くなるという事実に帰着します。
これらのテクノロジーのGC、JITの側面を除いて、ハードウェアの使用法にはギャップがあります。
最新バージョンのフラッシュプレーヤーでは、フラッシュはこれらの画像をレンダリングするためにハードウェアアクセラレーションに頼り始めました。これにより、レンダリングプロセスが高速になり、品質が向上します。一方、一部のブラウザー(FF、CHROME)でのJS駆動のゲームは、まだこれを開始していません。ただし、例外が1つありました。IE9ブラウザーは、ハードウェアアブストラクションレイヤーから再構築を開始しました。IE9のブラウザーは、ハードウェアアクセラレーションの利用に関して大幅な進歩を遂げたため、これらのブラウザーでのグラフィックスレンダリングは、他のブラウザーよりも明らかに優れて高速です。