From 33058f2b292b3a581333bdfb21b8f671898c5060 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:40:17 -0500 Subject: initial commit --- files/ja/games/techniques/async_scripts/index.html | 54 ++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 files/ja/games/techniques/async_scripts/index.html (limited to 'files/ja/games/techniques/async_scripts/index.html') diff --git a/files/ja/games/techniques/async_scripts/index.html b/files/ja/games/techniques/async_scripts/index.html new file mode 100644 index 0000000000..0e5279f64d --- /dev/null +++ b/files/ja/games/techniques/async_scripts/index.html @@ -0,0 +1,54 @@ +--- +title: asm.js の非同期スクリプト +slug: Games/Techniques/Async_scripts +tags: + - Games + - JavaScript + - asm.js + - async +translation_of: Games/Techniques/Async_scripts +--- +
{{GamesSidebar}}
{{IncludeSubnav("/ja/docs/Games")}}
+ +
+

全ての中~大規模ゲームでは、コンパイル処理を最適化してブラウザを最大限柔軟にする、非同期スクリプトとして asm.js コードをコンパイルします。Gecko では、非同期コンパイルによって、ゲームのロード時に JavaScript エンジンがメインスレッド外で asm.js をコンパイルし、生成した機械語コードをキャッシュしてそれ以降のロード時にコンパイル不要となります(Firefox 28から)。違いを見るには、about:configjavascript.options.parallel_parsing を反転させてください。

+
+ +

非同期を動作させる

+ +

非同期のコンパイルは簡単です: JavaScript を書く時に、単に async 属性を使います:

+ +
<script async src="file.js"></script>
+ +

あるいは、スクリプトで同じことを行います:

+ +
var script = document.createElement('script');
+script.src = "file.js";
+document.body.appendChild(script);
+ +

(スクリプトによって生成されるスクリプトはデフォルトで非同期です。)  デフォルトの HTML シェル Emscripten は、後者を生成します。

+ +

非同期とそうでない時?

+ +

スクリプトが非同期で *ない* 、よく似た状況 (仕様に定義されている通り) では次の通りです:

+ +
<script async>code</script>
+ +

および

+ +
var script = document.createElement('script');
+script.innerHTML = "code";
+document.body.appendChild(script);
+ +

両方とも 'インライン' スクリプトと考えられ、コンパイルされて、すぐに実行されます。

+ +

コードが JS 文字列内にあった場合はどうでしょう? evalinnerHTML(両方とも同期コンパイルを起動します)を使う代わりに、 オブジェクトURLと一緒の Blob を使います:

+ +
var blob = new Blob([codeString]);
+var script = document.createElement('script');
+var url = URL.createObjectURL(blob);
+script.onload = script.onerror = function() { URL.revokeObjectURL(url); };
+script.src = url;
+document.body.appendChild(script);
+ +

innerHTML ではなく src をセットすると、スクリプトが非同期になります。

-- cgit v1.2.3-54-g00ecf