今回の主な話題:絵文字のUGUI処理、CreatefromMemoryの使用戦略、Resource.Loadがロードされたときのメモリ変動、Animatorのサンプリング。
メモリ管理
Q1:Unity 5.5.2を使用しています。下の画像は、Redmi 2でテストした8つの特殊効果リソースを示しています。ピーク値は46MBで、その後22.6MBに低下します。このメモリ変動の原因は何ですか?Rendering Batchesが原因ですか?
問題主が提供する例によると、UWAがテストをしました。この問題はUnity 5.5.2のAndroid実機で確かに再現しました。Redmi 2で四つの粒子特殊効果をロードしますと、ロードする前のメモリは:
ロードする中のメモリは:
ロードする後のメモリは:
確かに、Unityのメモリが急速に上昇し、その後下降する「ジッター」現象があります。
これに対して、同じようにRedmi 2で、Unity 5.6.2バージョンの実機テストを実施しました。
ロードする前のメモリは:
ロードする中のメモリは:
ロードする後のメモリは:
まだ、メモリには少量のジッターがありますが、そのジッター範囲は大幅に縮小されています。ですから、R&Dチームに、 同じフレームにあるResources.Loadの読み込み回数で制御するか、Unityの上位バージョンにアップグレードすることをお勧めします。
UGUI
Q2:UGUIの入力フィールドを使用しています。ユーザーが携帯でシステムに付属の絵文字を入力すると、問題が発生し、Input Field枠に異常を引き起こします。たとえば、一つの疑問符があって、削除できません。何かプレーヤーが入力した絵文字を濾過できる方法がありませんか?または絵文字を他の文字に変える方法ありませんか?私は今、正規表現を使用して絵文字表現のユニコードエンコーディングに一致させていますが、このようにすると、カバレッジが不完全な状況はまだあります。
①
現在の解決策は、コンポーネントをInput Fieldに掛けて、類似のコードを使って絵文字を濾過することです。ただし、すべての絵文字はまだテストしていません。すべての絵文字を濾過できるわけではありませんが、エラー報告はされません。
public char ValidateInput(string text, int charIndex, char addedChar)
{
// 絵文字
if (char.GetUnicodeCategory(addedChar) == UnicodeCategory.Surrogate)
{
return ‘\0’;
}
}
②
>UWAはUnity 5.5.5p2でこの問題を再現しました。しかし、Unity 5.6.2ではそのような問題はありません。アップグレードは実際にリスクをもたらす可能性があるため、あるアドバイスは正規表現を使うことです。この方法も一般的にインターネットで使用されている方法です。
二つ目は、Unity 5.5.5p2とUnity 5.6.2のUGUIコードの変更を比較し(主にInputField)、自分で修復してみます。UnityEngine.UI.dllも自分でコンパイルします。
---
### アニメーション
Q3:Unity 4.x Animatorはエディターでサンプリングを実行できますか? たとえば、スキルアクションは30フレームです。各フレームのモデルの各ノードの座標回転とスケーリングを知りたいのですが、どうすればよいですか?
>1)アニメーションウィンドウで直接表示できます。

2)APIを利用します:[AnimationUtility.GetAllCurvesまたはAnimationUtility.GetEditorCurve](https://docs.unity3d.com/460/Documentation/ScriptReference/AnimationUtility.html)を使用して、各ノードの各属性AnimationCurveを取得して、各AnimationCurve.keysにある各[keyframeのvalue](https://docs.unity3d.com/460/Documentation/ScriptReference/Keyframe.html)を取得します。
UWAブログには、アニメーションサンプリング、[GPUスキニング(中国語注意)](https://blog.uwa4d.com/archives/Sparkle_GPUSkinning.html)、[アニメーションファイルの精度を抑える](https://blog.jp.uwa4d.com/2019/11/05/unity%e5%8b%95%e7%94%bb%e3%83%95%e3%82%a1%e3%82%a4%e3%83%ab%e6%9c%80%e9%81%a9%e5%8c%96%e3%81%ab%e3%81%a4%e3%81%84%e3%81%a6/)に関する2つのブログがありました。サンプリングに関するコードが含まれています、ぜひ読んでください。
---
### アセット管理
Q4:異なるプロジェクトのAssetBundleは互いに読み取ることができますか? 暗号化の方法はありますか? Unityの異なるバージョンとAssetBundleの互換性はどの程度ですか?
>1)Unityのバージョンが対応している限り、AssetBundleはお互いを読み取ることができます。
2)暗号化は一般的なファイル暗号化と同じですが、LoadFromMemoryを介してロードする必要があります。インターネットには多く の方法がありますが、 Googleしてください。
3)Unity 5.xバージョンでは、プロジェクトの上位バージョンは、AssetBundleの下位バージョンの読み取りをサポートしています。AssetBundleでTypeTreeを開く限り(デフォルトは開っている)、理論上問題はありません。
---
### アセット管理
Q5:アセットをロードするためのCreatefromMemory APIに関して、UWAは効率が低いため推奨されていません。dllを更新する必要がありますから、このロード方式を使用していますが、何か他の方法ありませんか?誰もがこのAPIを使用していませんか? または使用できる特別な状況はありますか? このAPIの時間消費を最小限に抑える方法は? 提案をお願いします、ありがとう!
>このAPIがコードのホットアップデートにのみ使用されば、確かにそれを使用する必要があります、納得できます。しなければLuaのような方式を使ってコードのホットアップデートをやります。
UWAは推奨していませんのは、Create / LoadFromMemory APIをリソースのロードに頻繁に使用することです。重要な構成ファイルまたはDLLコードの場合は、このAPIを使用してロードできます。
---
UWA Technologyは、モバイル/VRなど様々なゲーム開発者向け、**パフォーマンス分析**と**最適化ソリューション**及び**コンサルティングサービス**を提供している会社でございます。
UWA公式サイト:https://jp.uwa4d.com
UWA公式ブログ:https://blog.jp.uwa4d.com