0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

今回の主な話題:絵文字のUGUI処理、CreatefromMemoryの使用戦略、Resource.Loadがロードされたときのメモリ変動、Animatorのサンプリング。


メモリ管理

Q1:Unity 5.5.2を使用しています。下の画像は、Redmi 2でテストした8つの特殊効果リソースを示しています。ピーク値は46MBで、その後22.6MBに低下します。このメモリ変動の原因は何ですか?Rendering Batchesが原因ですか?
1.jpg
2副本.png

問題主が提供する例によると、UWAがテストをしました。この問題はUnity 5.5.2のAndroid実機で確かに再現しました。Redmi 2で四つの粒子特殊効果をロードしますと、ロードする前のメモリは:
3.png
ロードする中のメモリは:
4.png
ロードする後のメモリは:5.png
確かに、Unityのメモリが急速に上昇し、その後下降する「ジッター」現象があります。
これに対して、同じようにRedmi 2で、Unity 5.6.2バージョンの実機テストを実施しました。
ロードする前のメモリは:
6.png
ロードする中のメモリは:
7.png
ロードする後のメモリは:
8.png
まだ、メモリには少量のジッターがありますが、そのジッター範囲は大幅に縮小されています。ですから、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)アニメーションウィンドウで直接表示できます。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653855/374ae240-14ab-25c3-c3d6-5437382fc23d.png)
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
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?