渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きくなれるように。。。 ※所属団体とは一切関係がありません

チューニング

Unity Profilerによる計測時間をスクリプトから取得できた件

日曜日の夜って、日常の業務から開放されてUnityリファレンスをぼ〜っと眺めることがあると思うんですが、本記事はそういう時に起こる発見をメモするシリーズです。 ところで、CPU負荷をUnity上でサンプリングする時はProfiler.BeginSample()を使用していま…

Unity製のアプリをXcodeでプロファイリングするとCPUフレームタイムが常にMAXになる件

Xcodeのバージョンと僕の所持するiPhone6SのOSバージョンの差異から、ここ最近手元PCでビルドしていませんでした。たまには、Xcodeでアプリのプロファイリングでもしようと思い、まずはMacをHigh Sierraにし、Xcode10をインストールしました。 Mojaveがリリ…

UnityEngine.Object.nameアクセスするとGC Allocされる件

UnityEngine.Object.nameするだけで、ヒープ領域を毎回確保するようです。 Unityのプロファイラを見てて気づきました。 以下僕の環境における実績。

WaitForSecondsはキャッシュして使おう

Unityで演出をスクリプトでタイミングの調整をしたいときにWaitForSecondsを使ったりすることがあります。 刹那的に使うのは問題ないですが、以下のようにWaitForSecondsを高頻度で生成すると問題が出てきます。

transformの取得に最適化がされていた件

最近多い、ふと気になったシリーズです。 昔(2~3年前)はtransform.localPosition = Vector3.zero;のようにtransformプロパティは直接アクセスすると、GetComponent()が内部的に実行されていて、処理負荷的に重いからキャッシュした方が良いよ!っていう話を…

UnityEngine.MathfとSystem.Mathどっちを使うのが良い?という話

ふと気になったシリーズです。 Unityを使っていると、ありがたいことに様々な便利関数がラップ、または拡張追加提供されています。 例えばC#の算術関連クラスであるSystem.Mathをラップ & 拡張しているUnityEngine.MathfというものがUnityでは提供されていま…

Unity2017.3のAssembly Definitionがコンパイル時間短縮の救世主になりそうな予感

Unity2017.2までは、各ソースはディレクリ命名ルールから以下の4種類のAssemblyファイルが生成されていました。 Assembly-CSharp-firstpass.dll Assembly-CSharp-Editor-firstpass.dll Assembly-CSharp.dll Assembly-CSharp-Editor.dll 詳しくはコチラをどう…

Unity SampleAnimationの負荷は約4倍

UnityのAnimationClip再生方法には単純にPlayではなく、指定秒数の状態にするSampleAnimationメソッドがあります。AnimatorControllerは不要で、AnimationClipだけで動かせます。 animationClip.SampleAnimation (gameObject, time); アニメーションを任意の…

とても簡単なUnityのネイティブプラグインの作り方

ネイティブプラグインのショートコードを書いてみます。 (なんだかんだで私が書いたことがなかったため) 今回はC++で書いたiOSのネイティブプラグインを想定します。

Unityのコンパイル時間短縮化の工夫

Unityは特殊なフォルダ名でコンパイルされるソースの順番と出来上がるDLLファイルが違います。 まとめるとこんな感じです。

ToArray、ToListを呼ばない工夫をする

今回も小ネタです。 時々以下のようなコードに出会います。 void Foo () { List<int> list = new List<int>(){0, 1, 2, 3, 4,5, 6}; Convert(list.ToArray()); } void Convert (int[] arr) { // Do Something.... }</int></int>

なぜドローコールバッチングされないか、理由を知る方法

Unity5.6からフレームデバッガに現在の描画と1つ前の描画が、ドローコールバッチングされない場合にヒントが表示されるようになりました。 ちなみにドローコールバッチングとは、複数のメッシュまとめて、1回のドローコールで描画することを指します。 ※全て…

LINQとfor文のコスト検証

C#を使う上でLINQは非常に便利な機能なのは言うまでもありません。 しかし、実際のプロダクトへ組み込む際の負荷は知っておくべきということで、改めて調べてみたという記事です。 今回の検証対象は使用頻度が高いフィルタ系関数です。 FirstOrDefault Any W…

Unityシェーダのマクロとマルチコンパイル

シェーダ内で#define マクロ名(引数) 処理という文法でマクロを書くことが出来ます。 マクロとはCやC++でよく出てくるインラインで展開されるアレです。 UnityCG.cgincの中身を眺めているとよく出てきます。 眺めることはあっても書いたことはなかったので、…

自分の書いたC#がどのようにコンパイルされてDLLになっているのかを確認する方法

自分が書いたC#コードはdllにコンパイルされる前に変換処理が入ります。 どのような形でDLLにされているのか気になると思いますので、MonoDevelopで確認してみます。 View > Pads > SolutionからSolutionパネルを開きます。

Unity Profiler小技集

検証環境 Unity5.5.2p2 Unity5.5.1p2 Unity5.4.1p4 Mac OS 10.11.6 先日公開されたテラシュールブログさんのProfilerについての有用な記事。 tsubakit1.hateblo.jp 乗っかる形で私が知ってるProfilerについての小ネタを紹介します。 任意の処理のCPU負荷を調…

シェーダプロパティアクセスが2.5倍早くなるPropertyToID関数

Materialの任意のプロパティを操作をする際に、 SetFloat SetTexture SetInt SetColor… などの関数を使用します。 文法的には material.SetFloat("_Prop", 100f); のように、第一引数にプロパティ名をString型、第2引数に値を渡します。また、オーバーロード…

XcodeのGPUフレームキャプチャができなくなっている

環境 Xcode 8.1 iOS 10.1.1 Unity 5.4.2f1 iOS実機で実行中、GPUにどんなアセットが乗っているかをチェックする時に便利なXcodeの機能、GPUフレームキャプチャというものがあります。 こちらのカメラアイコンを実行中にクリックすると使用しているテクスチャ…

XcodeのCPU FrameTimeが表示されないときの設定項目

環境 Unity5.4.2f1 Xcode 8.1 とあるパフォーマンスを検証するために、CPU・GPU使用率と1フレームにかかる時間を計測するためにXcodeで実機プロファイリングした時に起きた問題です。 キャプチャの通り、GPUのフレームタイムは表示されますが、CPUの方は0sの…

Unity スキンメッシュレンダラーのクオリティ負荷検証

環境 Unity5.4.2f1 スキンメッシュレンダラーはボーンアニメーションを使用する時に必要となるRendererです。 その中にQualityという設定項目があり、各頂点が最大いくつのボーンから影響を受けるのかを設定できます。 実際に数値を変更するとわかりますが、…