android - add performance stats

This commit is contained in:
Emmanuel Hansen 2024-01-20 21:09:07 +00:00
parent 96c4edb697
commit e926499e32
3 changed files with 137 additions and 9 deletions

View File

@ -37,6 +37,7 @@ class MainActivity : BaseActivity() {
var mainViewModel: MainViewModel? = null var mainViewModel: MainViewModel? = null
var AppPath : String = "" var AppPath : String = ""
var StorageHelper: SimpleStorageHelper? = null var StorageHelper: SimpleStorageHelper? = null
val performanceMonitor = PerformanceMonitor()
@JvmStatic @JvmStatic
fun updateRenderSessionPerformance(gameTime : Long) fun updateRenderSessionPerformance(gameTime : Long)
@ -120,6 +121,8 @@ class MainActivity : BaseActivity() {
} }
} }
} }
val freq = performanceMonitor.getFrequencies()
} }
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {

View File

@ -0,0 +1,113 @@
package org.ryujinx.android
import android.app.ActivityManager
import android.content.Context.ACTIVITY_SERVICE
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import java.io.RandomAccessFile
import kotlin.concurrent.thread
class PerformanceMonitor {
val numberOfCores = Runtime.getRuntime().availableProcessors()
private var isMonitoring: Boolean = false
fun startMonitoring() {
if(isMonitoring)
return
isMonitoring = true
thread {
monitor()
}
}
init {
}
fun monitor(){
while(isMonitoring) {
//lastCpuUsages = HardwarePropertiesManager.
//Thread.sleep(1000);
}
}
fun getFrequencies() : List<Double> {
val frequencies = mutableListOf<Double>()
for (i in 0..<numberOfCores){
var freq = 0.0;
try {
val reader = RandomAccessFile(
"/sys/devices/system/cpu/cpu${i}/cpufreq/scaling_cur_freq",
"r"
)
val f = reader.readLine()
freq = f.toDouble() / 1000.0
}
catch (e:Exception){
}
frequencies.add(freq)
}
return frequencies.toList()
}
fun getMemoryUsage() : List<Int> {
val mem = mutableListOf<Int>()
MainActivity.mainViewModel?.activity?.apply {
val actManager = getSystemService(ACTIVITY_SERVICE) as ActivityManager
val memInfo = ActivityManager.MemoryInfo()
actManager.getMemoryInfo(memInfo)
val availMemory = memInfo.availMem.toDouble()/(1024*1024)
val totalMemory= memInfo.totalMem.toDouble()/(1024*1024)
mem.add((totalMemory - availMemory).toInt())
mem.add(totalMemory.toInt())
}
return mem.toList()
}
@Composable
fun RenderUsage() {
LazyColumn{
val frequencies = getFrequencies()
val mem = getMemoryUsage()
for (i in 0..<numberOfCores){
item {
Row {
Text(modifier = Modifier.padding(2.dp), text = "CPU ${i}")
Spacer(Modifier.weight(1f))
Text(text = "${frequencies[i]} MHz")
}
}
}
if(mem.isNotEmpty()) {
item {
Row {
Text(modifier = Modifier.padding(2.dp), text = "Used")
Spacer(Modifier.weight(1f))
Text(text = "${mem[0]} MB")
}
}
item {
Row {
Text(modifier = Modifier.padding(2.dp), text = "Total")
Spacer(Modifier.weight(1f))
Text(text = "${mem[1]} MB")
}
}
}
}
}
}

View File

@ -8,6 +8,7 @@ import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.layout.wrapContentWidth import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
@ -18,11 +19,13 @@ import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.LinearProgressIndicator
import androidx.compose.material3.LocalTextStyle
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -30,7 +33,9 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.pointer.PointerEventType import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.AndroidView
import androidx.compose.ui.window.Popup import androidx.compose.ui.window.Popup
import compose.icons.CssGgIcons import compose.icons.CssGgIcons
@ -197,8 +202,10 @@ class GameViews {
mainViewModel.motionSensorManager?.unregister() mainViewModel.motionSensorManager?.unregister()
}) })
} }
Row(modifier = Modifier.padding(8.dp), Row(
horizontalArrangement = Arrangement.SpaceBetween) { modifier = Modifier.padding(8.dp),
horizontalArrangement = Arrangement.SpaceBetween
) {
IconButton(modifier = Modifier.padding(4.dp), onClick = { IconButton(modifier = Modifier.padding(4.dp), onClick = {
showMore.value = false showMore.value = false
showController.value = !showController.value showController.value = !showController.value
@ -338,13 +345,18 @@ class GameViews {
modifier = Modifier.padding(16.dp), modifier = Modifier.padding(16.dp),
color = MaterialTheme.colorScheme.background.copy(0.4f) color = MaterialTheme.colorScheme.background.copy(0.4f)
) { ) {
Column { CompositionLocalProvider(LocalTextStyle provides TextStyle(fontSize = 10.sp)) {
var gameTimeVal = 0.0 Column {
if (!gameTime.value.isInfinite()) var gameTimeVal = 0.0
gameTimeVal = gameTime.value if (!gameTime.value.isInfinite())
Text(text = "${String.format("%.3f", fifo.value)} %") gameTimeVal = gameTime.value
Text(text = "${String.format("%.3f", gameFps.value)} FPS") Text(text = "${String.format("%.3f", fifo.value)} %")
Text(text = "${String.format("%.3f", gameTimeVal)} ms") Text(text = "${String.format("%.3f", gameFps.value)} FPS")
Text(text = "${String.format("%.3f", gameTimeVal)} ms")
Box(modifier = Modifier.width(84.dp)) {
MainActivity.performanceMonitor.RenderUsage()
}
}
} }
} }