コガネブログ

平日更新を目標にUnityやC#、Visual Studioなどのゲーム開発アレコレを書いていきます

【Unity】メモリリークを見つけるために static フィールドがどのくらいメモリを保持しているか調査するツール「UnityHeapDump」紹介

はじめに 「UnityHeapDump」はメモリをテキストファイルにダンプするツールです 概要(引用) 主な用途は、メモリリークを見つけるために、 static フィールドがどのくらいのメモリを保持しているかを調査することです Unity アセットののリークについては、…

【Unity】string や StringBuilder よりもメモリ割り当てが少なく高速な文字列クラス「FastString」紹介

はじめに 「FastString」は string や StringBuilder よりも メモリ割り当てが少なく高速な文字列クラスです パフォーマンス比較 検証スクリプト using UnityEngine; using UnityEngine.Profiling; public class FastStringTest : MonoBehaviour { private F…

【Unity】iOS / Android で使用メモリを確認できる「MemoryChecker-Unity」紹介

はじめに 「MemoryChecker-Unity」を Unity プロジェクトに導入することで iOS / Android で使用メモリを確認できるようになります 使い方 using UnityEngine; public class Example : MonoBehaviour { #if UNITY_IOS [DllImport("__Internal")] private sta…

【Unity】iOS の IL2CPP ビルド時に不要な属性を除外してアプリの容量を減らすことができる「Unity3D.UselessAttributeStripper」紹介

はじめに 「Unity3D.UselessAttributeStripper」を使用することで iOS の IL2CPP ビルド時に不要な属性を除外して アプリの容量を減らすことができるようになります Unity プロジェクトによっては 18MB もの容量を減らすことも可能です 使い方 ツールの入手 …

【Unity】GC の発生を抑える ~文字列の操作編~

概要 m_spriteName = "coin_" + index.ToString(); スプライト名を変更してセルアニメーションさせる処理を Update 関数に記述したところ、 毎フレーム 66B の GC Alloc が発生して ときどきゲームがカクつく状態になった 下記ように配列を使用する書き方に…

【Unity】GC の発生を抑える ~リストの操作編~

概要 var list = activeThings.FindAll( c => !c.IsEnable ); list.ForEach( c => Destroy( c.gameObject ) ); activeThings.RemoveAll( c => !c.IsEnable ); 無効になったオブジェクトを Destroy して リストから削除する処理を LateUpdate 関数に記述した…

【Unity】iOS においてアプリがクラッシュした時の情報を取得できるクラス「CrashReport」紹介

使用例 取得可能なクラッシュレポートをすべて表示するサンプル using UnityEngine; public class Example : MonoBehaviour { private void OnGUI() { var reports = CrashReport.reports; GUILayout.Label( "Crash reports:" ); foreach ( var r in reports…

【Unity】iOS / Android においてアプリの起動時間を測ることができる「UnityInitializeTimeChecker」紹介

はじめに 「UnityInitializeTimeChecker」を Unity プロジェクトに導入することで iOS / Android においてアプリの起動時間を測ることができるようになります 使い方(引用) 「UnityInitializeTimeChecker.unitypackage」を Unity プロジェクトにインポート…

【Unity】ボタン以外の UI の raycastTarget をデフォルトで false にするエディタ拡張「GraphicDefaultValueWriter」紹介

はじめに http://dev.twsiyuan.com/2016/07/unity-graphic-raycasttarget-default-value.html 上記のサイト様が公開されている 「GraphicDefaultValueWriter」を Unity プロジェクトに導入すると ボタン以外の UI の raycastTarget をデフォルトで false に…

【Unity】string の連結を StringBuilder に置き換えてパフォーマンスを改善できる「StringBuilderTemporary」紹介

はじめに 「StringBuilderTemporary」を Unity プロジェクトに導入することで string の連結を StringBuilder に置き換えて パフォーマンスを改善することができます 使い方 using StrOpe = StringOperationUtil.OptimizedStringOperation; string の連結を …

【Unity】iOS や Android で端末のメモリが不足してきた時に呼び出されるコールバック「Application.lowMemory」紹介

使用例 using System.Collections.Generic; using UnityEngine; public class Example : MonoBehaviour { private readonly List<Texture2D> m_textures = new List<Texture2D>(); private void Awake() { Application.lowMemory += OnLowMemory; } private void Update() { // 毎</texture2d></texture2d>…

【Unity】string.StartsWith と string.EndsWith は処理速度が遅いので最適化した拡張メソッドを自作する

ソースコード 上記の CustomStartsWith 関数と CustomEndsWith 関数を string.StartsWith と string.EndsWith の代わりに使用します 速度比較 検証環境 Unity 2017.1.1f1 検証用スクリプト using UnityEngine; public sealed class Example : MonoBehaviour …

【Unity】高速かつボックス化が発生しない Dictionary「BetterDictionary」紹介

はじめに こちらの「BetterDictionary」は通常の Dictionary よりも高速で、 かつ、ボックス化の発生を防ぐことができます 以下、GitHub の README の引用になります 概要(引用) BetterDictionary クラスは System.Collections.Generic.Dictionary クラス…

【Unity】Unity におけるゲーム開発でガベージコレクションを最適化する(翻訳)

はじめに この記事は Unity 公式で紹介されている パフォーマンス改善に関する記事の一部翻訳になります キャッシング void OnTriggerEnter( Collider other ) { var allRenderers = FindObjectsOfType<Renderer>(); ExampleFunction( allRenderers ); } 上記の例では</renderer>…

【Unity】高速かつメモリを節約してスクロールビューを実装できる「EnhancedScroller」紹介($21.60)

概要 2015/5/28 に、uGUI 拡張用のアセット 「EnhancedScroller」がリリースされました 例えばスマホゲームで、プレゼントボックスやランキング一覧などの画面で 数百から数千件のデータをスクロールビューで表示する場合、 ベタに実装しようとするとオブジ…

【Unity】gzip で文字列を圧縮してデータ容量を抑える

スクリプト 使い方 using UnityEngine; public class Example : MonoBehaviour { private void Awake() { var rawData = "ピカチュウ"; var compressedData = GZipCompressor.Compress( rawData ); var result = GZipCompressor.Decompress( compressedData …

【Unity】デリゲートを指定する時に関数名ではなくラムダ式を使用することで GC の発生を抑える

検証用スクリプト using System; class Program { static void Main() { int count = 100000000; //======================================== // 関数名指定 //======================================== for ( int i = 0; i < count; i++ ) { Func( Callba…

【Unity】JsonUtility を使用して出力する Json ファイルの容量を少しでも減らす

概要 [Serializable] public class Character { public int m_id ; public string m_name ; } ... var ch = new Character(); var json = JsonUtility.ToJson( ch, true ); { "m_id": 0, "m_name": "" } 例えばこのような処理で出力したJSONを テキストファ…

【Unity】開発中のアプリがメモリリークで強制終了するようになった時に対応したこと

対応したこと インスタンスが破棄される時に メンバ変数に定義しているすべてのデリゲートに null を代入するようにした MonoBehaviour を継承しているクラスの場合 OnDestroy 関数ですべてのデリゲートにnullを代入する 対応前 public class Example : Mono…

【おすすめスライド】「【Unity道場】パフォーマンス最適化のポイント」

関連記事

【Unity】ログ出力を無効化する時に「logEnabledプロパティ」を使った場合と「Conditional属性」を使った場合の処理時間の検証

検証用スクリプト using UnityEngine; public class Example : MonoBehaviour { private void Awake() { var count = 1000000; { Debug.logger.logEnabled = false; var startTime = Time.realtimeSinceStartup; for ( int i = 0; i < count; i++ ) { Debug.…

【Unity】ボックス化をなるべく回避して GC の発生を抑える string.Format「StringUtils」

ソースコード 検証用スクリプト // string.Format を使用した場合のGC発生回数検証 for ( int i = 0; i < 1000000; i++ ) { string.Format( "{0},{1},{2},{3}", 0, 1, 2, 3 ); } Console.WriteLine( GC.CollectionCount( 0 ) ); // StringUtils.Format を使…

【Unity】Dictionary で IEqualityComparer を使用した場合と使用しなかった場合のどちらが高速か検証しました

はじめに Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、Dictionaryのキーに列挙型を使用した場合、 ボックス化が発生してしまい、メモリを余分に消費してしまうとのことだったので ボックス化を回避する…

【Unity】シーンのビルドインデックスを定数で管理するクラスを生成する拡張機能

概要 Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、MaterialやAnimator、Shaderでパラメータを設定する場合、 プロパティ名でアクセスすると、内部でint型のハッシュ値への変換が行われてしまい、 少し…

【Unity】AudioClip のモノラル設定をオンにする方法

概要 Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、AudioClipはモノラル設定を有効にした方が良いと聴きました UnityでAudioClipをモノラル設定にする場合は AudioClipのImport Settingsで「Force To Mo…

【Unity】Material の SetXXXX 関数で propertyName を渡す方法と nameID を渡す方法のどちらが高速か検証しました

はじめに Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、MaterialやShaderのSetXXXX関数を使用する場合、 propertyNameを渡すよりも、nameIDを渡す方が高速と聞いたので MaterialのSetColor関数で速度を…

【Unity】AudioClip のインポート時に iOS と Android で設定を分ける

はじめに Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、AudioClipの圧縮形式は iOSでは「MP3」、Androidでは「Vorbis」がオススメとのことだったので AssetPostprocessorで指定する方法を調べてみました…

【Unity】Dictionary のキーに列挙型を使用した時のボックス化によるメモリ消費を回避する

はじめに Unite 2016の「モバイル端末向けのUnityアプリケーションの最適化実践テクニック」 の講演において、Dictionaryのキーに列挙型を使用した場合、 ボックス化が発生してしまい、メモリを余分に消費してしまうとのことでした ボックス化が発生してしま…

【おすすめスライド】「Unityスマートフォンアプリの パフォーマンス最適化」

関連記事

【おすすめスライド】「Unity+スマホで3Dゲーム開発最適化するための考え方」

関連記事