【UnityAsset】FPSMemoryFriends – UnityでAndroid/iOSのFPSとメモリ使用量を取得する

【GitHub】FPSMemoryFriends

初めまして、てんぷらです。C#大好きなUnityエンジニアです☆
今まで Qiitaホームページ でブログを書いてきたのですが、

「Qiitaだと個人ネタを載せるのは憚られる」
「ホームページだと記事作成が辛い(;_;)」

という理由から、はてなブログでリニューアルすることにしました(^^)/

去年は個人開発を優先していてブログの更新を行えなかったのですが、最近いろいろな方に記事見たよと言われ、嬉しかったのでまたちょいちょい書いていこうかと思います(笑)
まずは最近作ったAssetの紹介から♪(大したものではないですけど^^;)

FPSMemoryFriendsとは

Android/iOSFPSとメモリ使用量を取得するAssetです。
用途としては開発中アプリのパフォーマンスの目安とする等。詳細に調べるならUnityのProfilerを使った方がいいけど、ProfilerだとUnity使える人じゃないと調べられないので、誰でも視覚的にFPSとメモリ使用量を確認できるようにするためのAsset。

ロジック的にはよくやられてる人がいて、毎回ネイティブプラグインを作ってたんだけど、ここらで整理してAsset化しておこうと思い作りました☆
【Unity】実機上(ゲーム内)でメモリ使用量を表示してみる 〜iOS編〜
標準Profilerだけに頼らないUnityのプロファイリングに挑んでみる

動作環境

Unity2017.1.0+
iOS 7.0+
Android 4.1+
※ただしほとんどネイティブプラグインなのでUnity5系でも動くかと

使用方法

FPSMemoryFriendsコンポーネントを追加し、スクリプトからFPSとメモリ使用量を取得。

f:id:okamura0510:20180506191805p:plain

using UnityEngine;
using Friends;

public class Demo
{
    [SerializeField] FPSMemoryFriends fpsMemoryFriends;

    void Update()
    {
        var fps          = fpsMemoryFriends.FPS;
        var usedMemory   = fpsMemoryFriends.UsedMemory;
        var usedMemoryKB = fpsMemoryFriends.UsedMemoryKB;
        var usedMemoryMB = fpsMemoryFriends.UsedMemoryMB;
    }
}
プロパティ 説明
AutoUpdateMemory メモリ使用量を1秒おきに自動更新するか?false の場合は fpsMemoryFriends.UpdateUsedMemory() メソッドで手動更新。
FPS FPS。1秒おきに更新される。
UsedMemory アプリのメモリ使用量[Byte]
UsedMemoryKB アプリのメモリ使用量[KB]
UsedMemoryMB アプリのメモリ使用量[MB]

ネイティブプラグイン

参考までにネイティブプラグインのコードを載せておきます。

Android

package jp.okamura0510.fpsmemoryfriendsandroid;

import android.content.Context;
import android.app.ActivityManager;
import android.os.Debug;
import android.os.Process;

import com.unity3d.player.UnityPlayer;

public class FPSMemoryFriends
{
    public static long getUsedMemoryKB() {
        long usedMemoryKB               = 0;
        Context context                 = UnityPlayer.currentActivity.getApplication().getApplicationContext();
        ActivityManager activityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
        Debug.MemoryInfo[] memoryInfos  = activityManager.getProcessMemoryInfo(new int[]{ Process.myPid() });
        for(Debug.MemoryInfo mi : memoryInfos) {
            usedMemoryKB += mi.getTotalPss();
        }
        return usedMemoryKB;
    }
}

iOS

#import <mach/mach.h>

extern "C" 
{
    unsigned int getUsedMemory() {
        struct task_basic_info info;
        mach_msg_type_number_t infoCount = TASK_BASIC_INFO_COUNT;
        kern_return_t status = task_info(current_task(), TASK_BASIC_INFO, (task_info_t)&info, &infoCount);
        
        if(status == KERN_SUCCESS) {
            return (unsigned int)info.resident_size;
        } else {
            return -1;
        }
    }
}

最後に

今年はゆる〜く更新していきます(。´・ω・`。)