From d40dc0076975eaf2ec95af4a9d8537fe010c156a Mon Sep 17 00:00:00 2001 From: Emmanuel Hansen Date: Sun, 25 Feb 2024 22:06:54 +0000 Subject: [PATCH] android - add performance monitor android - update dependencies android - set isStarted check early android - add performance stats android - close file handles in performance monitor --- src/RyujinxAndroid/app/build.gradle | 25 +++--- .../main/java/org/ryujinx/android/GameHost.kt | 3 +- .../java/org/ryujinx/android/MainActivity.kt | 16 ++-- .../org/ryujinx/android/PerformanceMonitor.kt | 90 +++++++++++++++++++ .../java/org/ryujinx/android/UiHandler.kt | 2 +- .../org/ryujinx/android/views/GameViews.kt | 30 +++++-- .../org/ryujinx/android/views/SettingViews.kt | 1 - src/RyujinxAndroid/build.gradle | 6 +- .../gradle/wrapper/gradle-wrapper.properties | 2 +- 9 files changed, 139 insertions(+), 36 deletions(-) create mode 100644 src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PerformanceMonitor.kt diff --git a/src/RyujinxAndroid/app/build.gradle b/src/RyujinxAndroid/app/build.gradle index 2740c03c7..121823144 100644 --- a/src/RyujinxAndroid/app/build.gradle +++ b/src/RyujinxAndroid/app/build.gradle @@ -5,14 +5,14 @@ plugins { android { namespace 'org.ryujinx.android' - compileSdk 33 + compileSdk 34 defaultConfig { applicationId "org.ryujinx.android" minSdk 30 - targetSdk 33 - versionCode 10010 - versionName '1.0.10' + targetSdk 34 + versionCode 10026 + versionName '1.0.26t' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { @@ -52,7 +52,7 @@ android { buildConfig true } composeOptions { - kotlinCompilerExtensionVersion '1.3.2' + kotlinCompilerExtensionVersion '1.5.2' } packagingOptions { jniLibs { @@ -77,17 +77,17 @@ tasks.named("preBuild") { dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' - implementation 'com.google.android.material:material:1.9.0' + implementation 'com.google.android.material:material:1.11.0' implementation platform('androidx.compose:compose-bom:2023.03.00') implementation platform('androidx.compose:compose-bom:2023.03.00') androidTestImplementation platform('androidx.compose:compose-bom:2023.03.00') androidTestImplementation platform('androidx.compose:compose-bom:2023.03.00') runtimeOnly project(":libryujinx") - implementation 'androidx.core:core-ktx:1.10.1' + implementation 'androidx.core:core-ktx:1.12.0' implementation platform('org.jetbrains.kotlin:kotlin-bom:1.8.0') - implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' - implementation "androidx.navigation:navigation-compose:2.6.0" - implementation 'androidx.activity:activity-compose:1.7.2' + implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.7.0' + implementation "androidx.navigation:navigation-compose:2.7.6" + implementation 'androidx.activity:activity-compose:1.8.2' implementation platform('androidx.compose:compose-bom:2023.06.00') implementation 'androidx.compose.ui:ui' implementation 'androidx.compose.ui:ui-graphics' @@ -96,12 +96,15 @@ dependencies { implementation 'com.github.swordfish90:radialgamepad:2.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' implementation "com.anggrayudi:storage:1.5.5" - implementation "androidx.preference:preference-ktx:1.2.0" + implementation "androidx.preference:preference-ktx:1.2.1" implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.2' implementation 'com.google.code.gson:gson:2.10.1' implementation 'net.lingala.zip4j:zip4j:2.11.5' implementation("br.com.devsrsouza.compose.icons:css-gg:1.1.0") implementation "io.coil-kt:coil-compose:2.4.0" + implementation("com.halilibo.compose-richtext:richtext-ui:0.20.0") + implementation("com.halilibo.compose-richtext:richtext-commonmark:0.20.0") + implementation("com.halilibo.compose-richtext:richtext-ui-material3:0.20.0") testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt index 9eca1df52..4b1ed3d56 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/GameHost.kt @@ -85,6 +85,8 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su if (_isStarted) return + _isStarted = true + game = if (mainViewModel.isMiiEditorLaunched) null else mainViewModel.gameModel; _nativeRyujinx.inputInitialize(width, height) @@ -102,7 +104,6 @@ class GameHost(context: Context?, private val mainViewModel: MainViewModel) : Su _guestThread = thread(start = true) { runGame() } - _isStarted = true _updateThread = thread(start = true) { var c = 0 diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt index 04db5d07b..a55d4e34d 100644 --- a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/MainActivity.kt @@ -18,7 +18,6 @@ import androidx.core.view.WindowCompat import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsControllerCompat import com.anggrayudi.storage.SimpleStorageHelper -import com.halilibo.richtext.ui.RichTextThemeIntegration import org.ryujinx.android.ui.theme.RyujinxAndroidTheme import org.ryujinx.android.viewmodels.MainViewModel import org.ryujinx.android.viewmodels.QuickSettings @@ -38,6 +37,7 @@ class MainActivity : BaseActivity() { var mainViewModel: MainViewModel? = null var AppPath : String = "" var StorageHelper: SimpleStorageHelper? = null + val performanceMonitor = PerformanceMonitor() @JvmStatic fun updateRenderSessionPerformance(gameTime : Long) @@ -111,14 +111,12 @@ class MainActivity : BaseActivity() { mainViewModel?.apply { setContent { RyujinxAndroidTheme { - RichTextThemeIntegration(contentColor = { MaterialTheme.colorScheme.onSurface }) { - // A surface container using the 'background' color from the theme - Surface( - modifier = Modifier.fillMaxSize(), - color = MaterialTheme.colorScheme.background - ) { - MainView.Main(mainViewModel = this) - } + // A surface container using the 'background' color from the theme + Surface( + modifier = Modifier.fillMaxSize(), + color = MaterialTheme.colorScheme.background + ) { + MainView.Main(mainViewModel = this) } } } diff --git a/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PerformanceMonitor.kt b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PerformanceMonitor.kt new file mode 100644 index 000000000..7c3fdafc1 --- /dev/null +++ b/src/RyujinxAndroid/app/src/main/java/org/ryujinx/android/PerformanceMonitor.kt @@ -0,0 +1,90 @@ +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 + +class PerformanceMonitor { + val numberOfCores = Runtime.getRuntime().availableProcessors() + + fun getFrequencies() : List { + val frequencies = mutableListOf() + for (i in 0.. { + val mem = mutableListOf() + 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..