2022-09-17 16:54:58 +08:00

169 lines
5.6 KiB
Java

package com.yunbao.faceunity.utils;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Process;
import android.util.Log;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
/**
* Created by tujh on 2017/11/2.
*/
public class CSVUtils {
public static final String TAG = CSVUtils.class.getSimpleName();
/* 每 100 帧统计一次 */
public static final int FRAME_STEP = 100;
public static final String COMMA = ",";
private OutputStreamWriter mStreamWriter;
private ActivityManager mActivityManager;
private Handler mHandler;
private CPUInfoUtil mCPUInfoUtil;
private int mFrameRate;
private volatile double mCpuUsed;
private volatile double mAverageFps;
private volatile double mAverageRenderTime;
private volatile double mMemory;
private long mSumRenderTimeInNano;
private volatile long mTimestamp;
public CSVUtils(Context context) {
mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
mCPUInfoUtil = new CPUInfoUtil(context);
HandlerThread handlerThread = new HandlerThread(TAG, Process.THREAD_PRIORITY_BACKGROUND);
handlerThread.start();
mHandler = new Handler(handlerThread.getLooper());
}
public void initHeader(String folderName, StringBuilder headerInfo) {
Log.d(TAG, "initHeader() called with: folderName = [" + folderName + "], headerInfo = [" + headerInfo + "]");
StringBuilder stringBuilder = new StringBuilder().append("时间").append(COMMA)
.append("帧率").append(COMMA)
.append("渲染耗时").append(COMMA)
.append("CPU").append(COMMA)
.append("内存").append(COMMA);
if (headerInfo != null) {
stringBuilder.append(headerInfo);
}
stringBuilder.append("\n");
File file = new File(folderName);
File parentFile = file.getParentFile();
if (!parentFile.exists()) {
parentFile.mkdirs();
}
try {
if (!file.exists()) {
file.createNewFile();
}
mStreamWriter = new OutputStreamWriter(new FileOutputStream(file, false), "GBK");
} catch (IOException e) {
Log.e(TAG, "CSVUtils: ", e);
}
flush(stringBuilder);
mTimestamp = System.currentTimeMillis();
}
public void writeCsv(final StringBuilder extraInfo, long renderTimeInNano) {
if (mStreamWriter == null) {
return;
}
mSumRenderTimeInNano += renderTimeInNano;
if (mFrameRate % FRAME_STEP == FRAME_STEP - 1) {
mTimestamp = System.currentTimeMillis();
mAverageFps = FPSUtil.fpsAVG(FRAME_STEP);
mAverageRenderTime = (double) mSumRenderTimeInNano / FRAME_STEP / 1_000_000;
mSumRenderTimeInNano = 0;
mHandler.post(new Runnable() {
@Override
public void run() {
mCpuUsed = mCPUInfoUtil.getProcessCpuUsed();
mMemory = MemoryInfoUtil.getMemory(mActivityManager.getProcessMemoryInfo(new int[]{Process.myPid()}));
String strCPU = String.format(Locale.getDefault(), "%.2f", mCpuUsed);
String strMemory = String.format(Locale.getDefault(), "%.2f", mMemory);
StringBuilder stringBuilder = new StringBuilder();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS", Locale.getDefault());
stringBuilder.append(dateFormat.format(new Date(mTimestamp))).append(COMMA)
.append(String.format(Locale.getDefault(), "%.2f", mAverageFps)).append(COMMA)
.append(String.format(Locale.getDefault(), "%.2f", mAverageRenderTime)).append(COMMA)
.append(strCPU).append(COMMA)
.append(strMemory).append(COMMA);
if (extraInfo != null) {
stringBuilder.append(extraInfo);
}
stringBuilder.append("\n");
flush(stringBuilder);
}
});
}
mFrameRate++;
}
private void flush(StringBuilder stringBuilder) {
if (mStreamWriter == null) {
return;
}
try {
mStreamWriter.write(stringBuilder.toString());
mStreamWriter.flush();
} catch (IOException e) {
Log.e(TAG, "flush: ", e);
}
}
public void close() {
Log.d(TAG, "close: ");
mHandler.post(new Runnable() {
@Override
public void run() {
if (mStreamWriter != null) {
try {
mStreamWriter.close();
mStreamWriter = null;
} catch (IOException e) {
Log.e(TAG, "close: ", e);
}
}
}
});
mHandler.getLooper().quitSafely();
mHandler = null;
mCPUInfoUtil.close();
}
public double getCpuUsed() {
return mCpuUsed;
}
public double getMemory() {
return mMemory;
}
public double getAverageRenderTime() {
return mAverageRenderTime;
}
public double getAverageFps() {
return mAverageFps;
}
}