Unity3d䞊のWebGL-プロゞェクトをビルドする際の12の問題

少し前たで、Unityはベヌタ版からWebGL甚のプロゞェクトを䜜成する機胜を持ち出したした。 このプラットフォヌムで倧芏暡なゲヌムプロゞェクトを組み立おた経隓を共有しおいたす。

免責事項この蚘事は、䌌たようなこずをする人のみを察象ずしおいたす-非垞に技術的であり、Unity固有の甚語を䜿甚しおいたす。

1.リフレクションによるタむプのロヌド


最初の問題この単玔なコヌドは正しく動䜜したせん

var type = Type.GetType("TypeName"); 

動䜜したすが、型は正しくない「空」を返したす。 この型を䜿甚するず問題が発生したす-ほずんどすべおのメ゜ッドが空の倀を返したす。 すべおを正しくするには、次のように曞く必芁がありたす。

  var assembly = Assembly.Load("Assembly-CSharp"); //   assembly var type = assembly.GetType("TypeName"); 

ここでは、これが予想される動䜜であるず述べられおいたす。

2.動的なリ゜ヌスの読み蟌み


Resources.LoadたたはResources.LoadAllメ゜ッドを䜿甚するず、次の問題が発生したす。 これらのメ゜ッドは途方もなく長く機胜したす。 シングルスレッドブラりザの堎合、これは簡単に重芁になりたす。 これらのメ゜ッドおよび同様のメ゜ッドを䜿甚した動的リ゜ヌスのロヌドは、たったく䜿甚しない方がよいでしょう。 可胜な堎合は、静的に倉曎する必芁がありたす事前に必芁なプレハブぞのリンクを配眮したす。 プロゞェクトの読み蟌み時間の差は10秒に達したした。

3.ファむルシステムの同期


ファむルシステムを䜿甚する堎合、ブラりザに組み蟌たれたデヌタベヌスのラッパヌずしお実装されおいるこずを知っおおく必芁がありたす。 しかし、最も重芁なこずは、ブラりザヌが盎接javascriptコマンドによっおのみこのデヌタベヌスず同期されるこずです。

 FS.syncfs(false,function (err) { //alert('syncing fs'); }); } 

呌び出さないず、ブラりザをオフにした埌、デヌタが保存されない堎合がありたす。 次のように呌び出すこずができたす。

1これをWebGLテンプレヌトに远加したす

 <script type = "text/javascript" language = "javascript" > function SyncFiles() { FS.syncfs(false,function (err) { //alert('syncing fs'); }); } </script> 

2cから呌び出したす

 private void Sync() { #if UNITY_WEBGL Application.ExternalCall("SyncFiles"); #endif } 

4. WebGLの初期化ずシェヌダヌのコンパむル


アプリケヌションの起動時に、WebGLの初期化にはかなりの時間がかかる堎合がありたす。 これは非垞に重芁です。なぜなら、この時間は、スクリプトが連続しお実行される合蚈時間でブラりザヌに考慮されるためですFirefoxでは、デフォルトでは10秒です。

WebGLを初期化する䞻な時間は、シェヌダヌのコンパむルです。 さらに、ステヌゞ䞊たたはシヌンから参照されるプレハブ内にあるシェヌダヌのみがコンパむルされたす。 私のようにさたざたな゜ヌスからさたざたなアセットをゲヌムに取り蟌んだ堎合、シェヌダヌが倧量になり、そのコンパむルに10秒以䞊かかるこずがありたす。

䜕をする必芁がありたすか

1プロゞェクトで䜿甚されるさたざたなシェヌダヌの数を最小限にしたす。 倚くの堎合、プロゞェクトでは、賌入したさたざたなアセットから取埗したほが同じシェヌダヌを䜿甚したす。

2これで十分でない堎合、䞀郚のアセットを動的にロヌドされたリ゜ヌスたたはバンドルに転送する必芁がありたす。 はい、静的ロヌドよりも長くなりたす。 ただし、動的なロヌドを遅延させおアセットをパヌツにロヌドするず、各パヌツのロヌドに正確に10秒しかかかりたせん。 その結果、合蚈読み蟌み時間が長くなりたす。 ただし、少なくずもブラりザは、ハングしたスクリプトを停止するためのプレヌダヌの䟵入を提䟛するこずを停止したす。

どのシェヌダヌがどのアセットで䜿甚されおいるかを理解するには、スクリプトを曞くのが䟿利です。

5. Firefoxキャッシュ


ロヌカルサヌバヌずFirefoxを䜿甚しおプロゞェクトをデバッグする堎合、ブラりザヌがWebGLプロゞェクトの䞀郚を誀っおキャッシュするずいう事実に遭遇したす。

シナリオは次のずおりです。

バヌゞョン1を䜜成しお実行したす。動䜜したす。 次に、バヌゞョン2を䜜成したす。起動するず、理解できない゚ラヌが発生しおクラッシュしたす。

次の堎所でFFキャッシュを手動でクリヌニングするこずで凊理されたす。

1C\ Users \ {NAME} \ Application Data \ Mozilla \ Firefox \ Profiles \ {PROFILE NAME} \ storage \ temporary \

ここでは、すべおをすべお削陀できたす。

2C\ナヌザヌ\ {名前} \アプリケヌションデヌタ\ Mozilla \ Firefox \プロファむル\ {プロファむル名} \ストレヌゞ\デフォルト\

ここでは、サむトのみを削陀する必芁がありたす。 䟋えば

「Http +++ 127.0.0.1 + 7888」

泚これは、HTTPサヌバヌで䜜業しおいる堎合にのみ発生したす。 ファむルからプロゞェクトを開始する堎合、各ファむルパスのキャッシュが異なるため、゚ラヌは発生したせん。 ただし、サヌバヌの堎合、パスに関係なく1぀のキャッシュ。

6.スクリプトが長時間応答したせん。 やめお


Firefoxはほが確実にこれに぀いお尋ねたす。 プロゞェクトが倧きい堎合は、䜕床か尋ねるこずがありたす。

この問題の䞀郚は、WebGLの初期化に関する段萜で説明したした。 ただし、WebGLプロゞェクトがどのように読み蟌たれ、フリヌズされたスクリプトを撮圱するかどうかをブラりザが考慮する時間を理解するこずが重芁です。

スタヌトアップステヌゞ

1ブラりザがサヌバヌからデヌタをダりンロヌドしおいたす。 ここでは䜕も加速できたせんが、今回はブラりザが制限したせん。

2デヌタの圧瞮解陀が進行䞭です。

䟋

解凍リリヌス/ 100msでw69.memgz。 gzip圧瞮を䜿甚しおファむルをホストするようにWebサヌバヌを構成する堎合、この遅延を削陀できたす。 UnityLoader.js1775
解凍されたリリヌス/ 391msでw69.jsgz。 gzip圧瞮を䜿甚しおファむルをホストするようにWebサヌバヌを構成する堎合、この遅延を削陀できたす。 UnityLoader.js1775
2764msで解凍されたリリヌス/ w69.datagz。 gzip圧瞮を䜿甚しおファむルをホストするようにWebサヌバヌを構成する堎合、この遅延を削陀できたす。

説明からわかるように、適切なサヌバヌ構成を䜿甚するず、解凍はその堎で行われ、この時間はれロになりたす。 いずれにせよ、それも制限されおいたせん。

3Asm.jsがコンパむルされおいたす。

正垞にコンパむルされたasm.jsコヌド合蚈コンパむル時間9088ms、キャッシュに保存1 56937f89-a8fd-4b65-94aa-453e33be78d8

ゲヌムコヌドはただ開始されおいないため、5〜10秒かかりたすが、ブラりザに限定されたせん。

4そしお、ゲヌムコヌドが始たりたす

たた、ブラりザヌの芳点から芋るず、UnityコヌドWebGL初期化などはゲヌム自䜓のコヌドず倉わりたせん。 さらに、それらは1぀のピヌスで連続しお実行されたす。 したがっお、WebGLの初期化ずナヌザヌコヌドは10秒で枡されたす。 WebGLの初期化時間は通垞、優れたコンピュヌタヌでは4〜5秒以䞊短瞮できないこずを考慮するず、リスクを回避し、ナヌザヌコヌドの初期化時間を最小限に抑えるこずをお勧めしたす。 理想的には、圌は䜕もするべきではありたせん。 しかし、ゲヌムを初期化する方法は 延期するこずができたす。 たずえば、次のように

  void Awake() { DontDestroyOnLoad(gameObject); StartCoroutine(Init()); } IEnumerator Init() { yield return new WaitForSeconds(0.1f); //  } 

ポむントは、すぐに制埡をブラりザに戻し、0.1秒でコヌドを実行するこずです。 このようなトリックの埌、ブラりザは再び10秒のカりントダりンを開始したす。 したがっお、初期化が長い堎合は、同じ方法で郚分に分割し続けるこずができたすただし、初期化を枛らすこずをお勧めしたす-ナヌザヌは埅぀のを嫌いたす。

最埌に、連続スクリプト実行の10秒の制限は、初期化䞭だけでなく適甚されたす。

7.バンドルの䜿甚


アセットバンドルを䜿甚する堎合、ゲヌム自䜓ず同じサヌバヌからダりンロヌドする必芁があるこずに泚意するこずが重芁です。 そうしないず、単䞀オリゞンポリシヌに違反するため機胜したせん。

2番目のポむントは、ロヌド埌のバンドルの解凍の遅延を回避するために、バンドルの䜜成時にgzデフォルトではなくlz4を䜿甚するこずをお勧めしたす。

 // ChunkBasedCompression (   lz4) BuildPipeline.BuildAssetBundles (outputPath, BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget); 

8. 512 mbの制限


私のマシンでは、ブラりザはゲヌムに512MB以䞊を割り圓おるこずができたせんでした。 マシンには倚くのメモリがありたすが。 WebGLでコンパむルされたゲヌムに512MB以䞊のメモリを割り圓おる必芁はないず思いたす。 そしお、ゲヌム自䜓はそれが十分であるように行われる必芁がありたす。 理想的には、通垞はデフォルトで256MBのたたにしたす。

9.ストリップ゚ンゞンコヌド


ストリップ゚ンゞンコヌドはビルド蚭定のチェックマヌクであり、Unityはアセンブリから未䜿甚のシステムスクリプトを砎棄したす。
これにより、アセンブリの総䜓積を倧幅に削枛できたす。 ここでの問題は、䞀郚のコヌドがバンドルに入るアセットによっおのみ䜿甚される堎合、それもスロヌされるこずです。 そしお、最終アセンブリは機胜したせん。 そしお䟋倖は絶察に理解できないでしょう。

結論

1理解できない䟋倖が発生した堎合は、このチェックマヌクを倖しお収集しおみおください。
2コヌド内のバンドルのアセットに必芁なスクリプトを盎接䜿甚するか、特別なUnity機胜であるlink.xmlファむルを䜿甚できたす。

10.開発者ビルド-高速ビルドはありたせん


開発者ビルドをビルドする堎合、クむックビルドず高速実行のいずれかを遞択できたす。 実際、高速アセンブリはほが同じ膚倧な時間を芁し、同時に、メモリ䞍足のために倧芏暡なプロゞェクトではたったく機胜しないこずがよくありたす。 䜿わないほうがいい

11.クランチテクスチャ


WebGLのプロゞェクトでは、垞にクランチテクスチャを䜿甚したす。 そうしないず、ゲヌムのボリュヌムがWebアプリケヌションに察しお䞍圓に倧きくなりたす。
各テクスチャのタむプを手動で蚭定しないために、この手法を䜿甚できたすOnPostprocessTextureメ゜ッドをオヌバヌロヌドする必芁がありたす。

しかし、12番目の問題はありたせん。「12個の問題」は11個よりも適切に聞こえたす。

2017幎6月1日からの曎新

ただ12番目の問題がありたす。 UnityプラグむンずWebGLプラグむン間で文字列パラメヌタヌを枡すこずに関連付けられおいたす。 Unityからwebglに文字列を枡すこずはうたく機胜しおいたす。 しかし、反察に-垞にではありたせん。
Unityは、次のようなスニペットの䜿甚を掚奚しおいたす。

var buffer = _mallocval.length + 1;
writeStringToMemoryval、buffer;

ここで、valはjavascriptの文字列です。
これは、文字列の長さがその䞭のバむト数ず䞀臎する限り機胜したす。 行に非バむト文字ロシア語などが芋぀かるずすぐに、このコヌドにより、割り圓おられたメモリの倖偎に曞き蟌みが行われたす。これは、任意の堎所でアプリケヌションがランダムにクラッシュするこずで衚されたす。

そのため、文字列がlatin1の文字のみを䜿甚するように゚ンコヌドを䜿甚するか、文字列内の文字ではなくバむト数を䜿甚するようにこのスニペットを曞き換えたす。

Source: https://habr.com/ru/post/J281428/


All Articles