Unity接入安卓sdk查看应用内存占用

news/2024/7/3 7:23:03

注:若不清楚如何在unity中接入android sdk可先了解下相关流程。项目地址:http://download.csdn.net/download/yhuangher/9976564

在项目后期进行内存优化,在android端进行内存优化时做了若干辅助工具,比如此款,查看系统总内存,当前App占用内存,系统剩余内存及fps,如图示:

image

android端代码如下:

package com.JohnRey.ShowAppBaseInfo;import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.List;import android.annotation.SuppressLint;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.os.Debug;
import android.text.format.Formatter;import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity {private ActivityManager mActivityManager = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);}public String getMemoryInfo() {// 系统总内存String message = getTotalMemory();// 系统可用内存message += "-" + getAvailMemory();// 当前App占用的内存message += "-" + getCurrentProcessMemory();return message;}/*** 获取当前app占用内存* * @return*/@SuppressLint("NewApi")private String getCurrentProcessMemory() {String pkgName = this.getPackageName();List<ActivityManager.RunningAppProcessInfo> appList = mActivityManager.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo appInfo : appList) {if (appInfo.processName.equals(pkgName)) {int[] pidArray = new int[] { appInfo.pid };Debug.MemoryInfo[] memoryInfo = mActivityManager.getProcessMemoryInfo(pidArray);float temp = (float) memoryInfo[0].getTotalPrivateDirty() / 1024.0f;return String.format("%.2f", temp)+"MB";}}return "获取失败";}/*** 获取手机总可用内存大小* * @return*/private String getTotalMemory() {String str1 = "/proc/meminfo";// 系统内存信息文件
         String str2;String[] arrayOfString;try {FileReader localFileReader = new FileReader(str1);BufferedReader localBufferedReader = new BufferedReader(localFileReader, 8192);str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小
arrayOfString = str2.split("\\s+");localBufferedReader.close();float temp = Integer.valueOf(arrayOfString[1])/1048576.0f;return String.format("%.2f", temp)+"GB";} catch (IOException e) {return "获取失败";}}/*** 获取系统可用内存信息* * @return*/private String getAvailMemory() {ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();mActivityManager.getMemoryInfo(mi);// 转化为mbreturn Formatter.formatFileSize(this, mi.availMem);}
}

C#端代码如下:

using UnityEngine;
using System.Collections;public class FPS : MonoBehaviour
{public float updateInterval = 0.5F;private float accum = 0; private int frames = 0;private float timeleft;void Start(){timeleft = updateInterval;
#if UNITY_ANDROID_getJavaObject();Invoke("callAndroid", 2);
#endif}void Update(){_updateFPS();}#region FPS显示private float fps;[Range(0, 150)]public int MaxFPS;private string _curFPS;private void _updateFPS(){timeleft -= Time.deltaTime;//timescale是时间速度,为1时即为正常速度,为2时即为两倍速,为0时即为暂停accum += Time.timeScale / Time.deltaTime;++frames;if (timeleft <= 0.0){fps = accum / frames;_curFPS = "FPS:" + fps;timeleft = updateInterval;accum = 0.0F;frames = 0;}}#endregion#region CallAndroidprivate string _memoryInfo;private AndroidJavaObject ajo;
#if UNITY_ANDROIDprivate void callAndroid(){_memoryInfo = string.Empty;string result = ajo.Call<string>("getMemoryInfo");string[] strArray = result.Split('-');//系统总内存_memoryInfo += "系统内存:" + strArray[0] + "\n";//系统可用内存_memoryInfo += "可用内存:" + strArray[1] + "\n";//App占用内存_memoryInfo += "app占用内存:" + strArray[2] + "\n";////系统分配的最大占用内存//_memoryInfo += "AllotMemory:" + strArray[3];//加入代码之后,可能会每隔两秒钟出现卡顿现象Invoke("callAndroid", 2);}private void _getJavaObject(){AndroidJavaClass cls_UnityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");ajo = cls_UnityPlayer.GetStatic<AndroidJavaObject>("currentActivity");}
#endif#endregionvoid OnGUI(){GUIStyle style = new GUIStyle();style.fontSize = 20;style.normal.textColor = Color.green;GUI.Label(new Rect(Screen.width - 300, 10, 250, 200), _memoryInfo, style);style.normal.textColor = fps > MaxFPS ? Color.red : Color.green;GUI.Label(new Rect(Screen.width - 200, Screen.height - 50, 100, 30), _curFPS, style);}
}

转载于:https://www.cnblogs.com/Yellow0-0River/p/7551908.html


http://lihuaxi.xjx100.cn/news/240841.html

相关文章

1115 Counting Nodes in a BST

我的DFS void DFS(Node* root){if(rootNULL)return;if(root->lchild){root->lchild->layer root->layer1;cnt[root->lchild->layer] ;maxLayer max(maxLayer,root->lchild->layer);DFS(root->lchild);}if(root->rchild){root->rchild->…

CSS控制字体在一行内显示不换行

当一行文字超过DIV或者Table的宽度的时候&#xff0c;浏览器中默认是让它换行显示的&#xff0c;如果不想让他换行要怎么办呢&#xff1f;用CSS让文字在一行内显示不换行的方法&#xff1a; 一般的文字截断(适用于内联与块)&#xff1a; 1 .text-overflow { 2 display:bloc…

Linux下des对称性加密

最近对接公安审计一些经历 对方的需求&#xff1a; 打成zip包对zip包进行des-cbc对称性加密&#xff0c;使用约定好的 -K和-iv值比如 -K "abcd$#!" -iv "efgh$#!"加密后做base64编码起初是想尝试用 php 去做&#xff0c;经过一阵折腾之后发现&#xff0c;p…

1062 最简分数

注意点&#xff1a; 1. 对两个分数之间的理解&#xff0c;这应该是一个开区间而不是闭区间 2. 读入的时候用 scanf("%d/%d %d/%d %d",&N1,&M1,&N2,&M2,&K) 不可以&#xff0c;分号前后会被视为一个整体。 AC代码 #include<cstdio> #i…

linux系统开机静态分配ip地址

在/etc/sysconfig/network-scripts/ifcfg-eth0文件中 添加&#xff1a; IPADDR192.168.1.100&#xff08;设置静态地址&#xff09; NETMASK255.255.255.0&#xff08;设置子网掩码&#xff09; GATEWAY192.168.1.1&#xff08;设置网关地址&#xff09; 修改&#xff1a; BOOT…

C#图片处理常见方法性能比较

在.NET编程中&#xff0c;由于GDI的出现&#xff0c;使得对于图像的处理功能大大增强。在文通过一个简单黑白处理实例介绍在.NET中常见的图片处理方法和原理并比较各种方法的性能。 黑白处理原理&#xff1a;彩色图像处理成黑白效果通常有3种算法&#xff1b; (1).最大值法: 使…

1081 Rational Sum 有理数类型题处理 需再做

一、有理数结构体的几个约束 struct fraction{LL up,down;fraction(LL _up,LL _down):up(_up),down(_down){} }; &#xff08;1&#xff09;如果这个有理数是0&#xff0c;则让分子为0&#xff0c;分母为1(这方便后来输出时归于整数一类) &#xff08;2&#xff09;如果这个…

Java springMVC POI 导出 EXCEL

2019独角兽企业重金招聘Python工程师标准>>> 思路 &#xff1a; 将需要导出的数据存放在一个List中创建一个EXCEL表 注意 XSSFWorkbook 只能操作2007以上的版本&#xff0c;XSSFWorkbook 只能操作2003一下的版本&#xff0c;所以需要的时候可以使用 Workbook创建对象…