渋谷ほととぎす通信

新しいこと、枯れたこと問わず大庭が興味を持ったものを調査、生活の効率を求める完全趣味の技術ブログ。基礎を大事にしています。

最適化

C#のActionとローカル関数のどちらを使うべきか調査

上の記事内で書いたソースにローカルメソッドを使ったのですが、それがどういう動きをするのか、Actionと何が違うのかを本記事では調べます。 ローカル関数はC#7から登場 ローカル関数はその名の通り、関数内に定義でき、その関数内でしか参照できない関数で…

C#コンストラクタパフォーマンス比較検証

余程のパフォーマンスチューニングが必要なときしか不要なパフォーマンス検証結果を残しておきます。 インスタンスをnewキーワードで生成する時、コンストラクタに引数を入れるパターンと入れ無いパターンがあります。 // コンストラクタに引数を持たないパ…

CEDEC2019気になったUnity情報DOTS編

CEDEC2019に聞き手として参加させて頂き「Unityではじめるオープンワールド入門 エンジニア編」セッションを元にDOTS関連についてまとめます。 そもそもDOTSとは? 簡単に紹介すると、DOTSとは将来のスタンダードなUnity開発手法になると思われるフレームワ…

CEDEC2019気になったUnity情報パフォーマンス編

CEDEC2019に聞き手として参加させて頂き「Unity2018/2019における最適化事情」セッションを元にパフォーマンス関連についてまとめます。 既存機能のアップデート 既存機能アップデートに関するスライドですが、気になったものだけ取り上げて説明します。 Ani…

Unity RenderTextureのメモリを解放するのはReleaseが良いの?Destroyが良いの?

RenderTextureのメモリ確保と解放タイミングを確認し、Release関数、Destroyどちらでも解放されることが分かりました。 2種類どちらを使った方が良いかという考察をしています。 普通に考えると、RenderTexture自体がクラスなのでGCを抑えるためにnewの回数…

Unity RenderTextureのメモリ確保と解放タイミングの落とし穴

RenderTextureを動的にスクリプトから生成して、Blitしてごにょにょするというフローの中で、どのタイミングでメモリが確保され、いつ解放されるのか確認したいと思います。 メモリのプロファイルということでUnity製MemoryProfilerを使います。 本環境はUni…

Unity2018.3.0からDynamicResolutionがiOSやAndroid端末で使えるようになっているので検証

先日リリースされたUnity2018.3の新機能をなめている最中です。本記事ではDynamicResolutionについて検証します。 DynamicResolutionとは? ランタイム中にレンダーターゲットの解像度を変更することができる機能です。 例 : 1920×1080で描画していたものを、…

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という設定項目があり、各頂点が最大いくつのボーンから影響を受けるのかを設定できます。 実際に数値を変更するとわかりますが、…