circle-loader
by
72/ 0

1)AddressableRemoteBuildPathでのアセット更新のアップロードの問題

2)Shaderのメモリ使用量が突然増加します

3)Unity2018.4のマテリアルによるテクスチャへの冗長な参照

4)多数のGC操作がエディターに表示され、フリーズが発生します

5)JsonUtility.ToJson浮動小数点は小数を保持する問題


 

Addressable

QAddressableRemoteBuildPathを設定した後、Remote_Groupでアセットバンドルの一つを変更し(このGroupには複数のアセットバンドルがあります)、Build]-> Update the previous buildが終了後、RemoteBuildPathRemote_Groupのすべてのアセットバンドルがもう一回生成されます。(このパスからすべてのアセットバンドルを削除しても、再度実行するとすべて生成されます)。Remote_Groupの下のアセットバンドルをサーバーにアップロードしたいので、変更されたRemoteアセットのみをアップロードし、すべてのアセットバンドルを繰り返しアップロードしたくないのですが、どうすればよいですか?

 

A1:全部が再生成されますが、変更されたものだけが異なるはずです。hashファイルに記録されたhashが変更されているかどうかを比較して確認できます。実際、サーバーに直接アップロードするだけで十分であり、クライアントはさまざまなhashに従って変更されたBundleをダウンロードします。このモードでは、サーバーにあるのは最新であり、クライアントはバージョンに関係なく差分Bundleをダウンロードするだけで済みます。

 

A2:折衷案は以下の通りです。アップロードする前に、既存のファイルのmd5を計算し、新しいファイルとmd5値が変更されたファイルをサーバーにアップロードします。


 

Memory

Q:プロジェクトのUnityバージョンがアップグレードされた後、Shaderのメモリ使用量は元の100倍になりましたが、それは何故でしょうか?

A:これは、Unity2019.4.20がShaderのメモリ使用量の統計方法を変更したためです。 Unityはこのように変更したのは、問題をより適切に特定できるように、使用量が一番高いShaderを直接確認できるようになりました。

バージョンアップグレード後、Shaderの使用量は120 MB以上になり、ShaderLabは92KBになることがわかります。

2019.4.20f1 Release Notes


 

Material

Q:パッケージ化後、AssetHunterプラグインで分析すると、冗長な参照が多数あることがわかりましたが、ゲームでProfilerを使用するとなくなります。

マテリアルファイルを開いて、古いテクスチャ参照情報がたくさん保存されていることがわかります。

古いバージョンで使用されていた_CloudTex属性は、新しいShaderには含まれていません。参照を見つける一般的な方法は、関連するすべてのGUIDを見つけることです。そうすると、これらの古い参照が見つかりますが、スマホでProfilerを使用してメモリを調べると、関連する参照テクスチャは読み込まれません。Unityがパッケージ化時にこれらの古い参照を自動的に除外するためですか?エディターでこれらの冗長な参照を見つけることはできますが、無視できますか?

 

A1:古いShaderで使用されていたテクスチャ参照はシリアル化情報に保留されます。これはエディターでShaderを切り替えてから元に戻す際の再配置の問題を回避するために、Unityの意図的な設計です。

Unityはパッケージ化時にマテリアルに詳細な検査を行い、現在のShaderで使用されていないすべてのTexture依存関係を削除します。そのため、通常、古い参照をパッケージ化してもパッケージが大きくなることはありません。

ただし、エディターの下の古い参照にはまだ問題があります。

AssetDatabase.GetDependenciesインターフェイスによって返される参照には古い参照が含まれ、それらをカリングするための詳細な検出は実行されません。右クリックのアセットSelectDependenciesはこのインターフェースを呼び出すため、以下に示すように、古い参照も表示されます。

pic2とpic3は、現在Shader2によって参照されていません。

したがって、GetDependenciesインターフェースを使用して一部の機能を実装すると、古い参照が原因で予期しない問題が発生する可能性があります。解決策は、EditorUtility.CollectDependenciesインターフェースを使用して、古い参照をカリングした結果を返すことです。

さらに、Matとpic1、pic2、およびpic3に個別のABパッケージが割り当てられている場合、古いTexture参照がmat.manifestファイルに表示されます。これは、AssetBundleパッケージの不合理なところです。新しいAddressableシステムに改善するかどうかは調べていません。

 

A2:この投稿を参照してください:

https://forum.unity.com/threads/material-asset-keeps-references-to-assets-that-are-not-used.523192/

その中にCleanUpMaterialsを直接使用して、マテリアルをクリーンアップできます。


 

Editor

Q:エディターのAssetDatabase.GetAllAssetBundleNamesWithoutVariant()には多くのGC操作があり、フリーズになってしまいました。

 

手順の再現:

1.ゲーム内のマテリアルまたはその他のオブジェクトを選択します。

2.Unityエディターをバックグラウンドに切り替えてから元に戻します。ここでは、SublimeをクリックしてUnityに戻ります。

上記の2つの手順を完了すると、Unityは非常にスタックします。プロファイラーを介してEditorLoopを分析すると、以下に示すように、

AssetDatabase.GetAllAssetBundleNamesWithoutVariantに多数のGC操作があることがわかります。

 

使用されたのはUnity 2019.4.15f1です。私が試した解決策は次のとおりです。

  1. Unityバージョンの問題かと思ったが、ノートブックにインストールされている同じバージョンのUnityはプロジェクトを作成することが再現できません。
  2. OnInspectorGUIに問題があると思われ、コード内のすべてのOnInspectorGUIにコメントを付けても、再現できます。
  3. ShaderGUIに問題があると思われ、ShaderGUIに関連するすべてのコードを削除すると、再現することもできます。

 

他のアイデアはありますか?こちらの一時的な解決策は、選択したオブジェクトを切り替えることで、スタックすることはなくなります。

 

A:プロジェクトはAssetImporterのbundleNameを設定してバンドルをマークしますか?

importer.assetBundleName = bundleName;
importer.assetBundleVariant = variant;

エディター部分のソースコードを見ると、

AssetDatabase.GetAllAssetBundleNamesWithoutVariant();というAPIは、次の部分が描画されたときに呼び出されることがわかりました。

BundleNameとBundleVariantがもっとあるとしたら、ラグが発生しますか?

Q:プロジェクトがアセットをインポートしたとき、Bundle Nameのみが設定されました。つまり、importer.assetBundleName = bundleNamというように設定されました;プロジェクトはBundleVariantを設定しませんでしたが、実際に多くのBundleNameがあります。BundleNamesの数に対し、上限はありますか??

 

A:コードでAssetDatabase.GetAllAssetBundleNamesWithoutVariant()(internal方法、リフレクションを通して呼び出します。)を手動で呼び出して、大量のGCとフリーズすることになるかどうかを確認します。自分で呼び出しても、ラグも発生したら、これが原因だと判定できます。Bundle Nameが多すぎてスタックしている場合は、AABメソッドを使用してバンドルをパッケージ化したら済みます。importer.assetBundleNameは設定しないでください。


 

Script

Q:JsonUtility.ToJsonを使用する場合、floatタイプを保存するときに、小数点以下2桁が事前に予約されていますが、ToJsonの結果は1.059999999999999です。解決策はありますか?

 

A:残念ながら、UnityのJsonUtilityはNativeレイヤーに実装されています。ネイティブレイヤーはクローズドソースであり、インターフェイス機能をほとんど提供していません。Newtonsoft.jsonのような他のJsonプラグインを使用することをお勧めします。

 

A2:LitJson4Unityの改正バージョンをお勧めします。

https://github.com/XINCGer/LitJson4Unity

LitJson4Unity:Unity用の改良されたLitJsonライブラリ

紹介:ネイティブLitJsonライブラリに基づくUnity用のLitJsonライブラリ。

ネイティブバージョンでサポートされていない次の機能がサポートします。

floatタイプをサポートします(最新のネイティブバージョンはすでにサポートしています)

Unityの内部で構築されたタイプ(Vector2、Vector3、Rect、AnimationCure、Bounds、Color、Color32、Quaternion、RectOffsetなど)をサポートします。

JsonIgnore Attritubeをサポートし、一部のフィールドのシリアル化をスキップします

出力Jsonコンテンツのフォーマットのサポートし、より定期的になります。

使用方法:Plugins/LitJsonディレクトリにあるすべてのcsスクリプトをプロジェクトに配置するだけです。

[Unityゲーム開発]MaSanをフォローして、LitJsonを魔法のように変えましょう

https://www.cnblogs.com/msxh/p/12541159.html


UWA公式サイト:https://jp.uwa4d.com

 UWA公式ブログ:https://blog.jp.uwa4d.com

UWA公式Q&Aコミュニティ(中国語注意):https://answer.uwa4d.com