Update DiskShaderCacheProgress.kt

This commit is contained in:
MNCHL 2023-12-05 22:17:49 +08:00 committed by GitHub
parent 7297cc1ad5
commit 4f60f05ca7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -5,46 +5,63 @@ package org.yuzu.yuzu_emu.disk_shader_cache
import androidx.annotation.Keep
import androidx.lifecycle.ViewModelProvider
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import org.yuzu.yuzu_emu.NativeLibrary
import org.yuzu.yuzu_emu.R
import org.yuzu.yuzu_emu.activities.EmulationActivity
import org.yuzu.yuzu_emu.model.EmulationViewModel
import org.yuzu.yuzu_emu.utils.Log
@Keep
object DiskShaderCacheProgress {
private lateinit var emulationViewModel: EmulationViewModel
private lateinit var emulationActivity: EmulationActivity
private fun prepareViewModel() {
emulationViewModel =
ViewModelProvider(
NativeLibrary.sEmulationActivity.get() as EmulationActivity
)[EmulationViewModel::class.java]
val activity = NativeLibrary.sEmulationActivity.get() as? EmulationActivity
?: throw IllegalStateException("EmulationActivity 不存在")
emulationActivity = activity
emulationViewModel = ViewModelProvider(emulationActivity)[EmulationViewModel::class.java]
}
@JvmStatic
fun loadProgress(stage: Int, progress: Int, max: Int) {
val emulationActivity = NativeLibrary.sEmulationActivity.get()
if (emulationActivity == null) {
Log.error("[DiskShaderCacheProgress] EmulationActivity not present")
return
}
val activity = NativeLibrary.sEmulationActivity.get() as? EmulationActivity
?: return
emulationActivity.runOnUiThread {
when (LoadCallbackStage.values()[stage]) {
LoadCallbackStage.Prepare -> prepareViewModel()
LoadCallbackStage.Build -> emulationViewModel.updateProgress(
emulationActivity.getString(R.string.building_shaders),
progress,
max
)
LoadCallbackStage.Complete -> {}
when (LoadCallbackStage.values()[stage]) {
LoadCallbackStage.Prepare -> {
prepareViewModel()
showMessage(activity.getString(R.string.prepare_loading_message))
}
LoadCallbackStage.Build -> {
GlobalScope.launch(Dispatchers.Main) {
updateProgressAsync(activity.getString(R.string.building_shaders), progress, max)
}
}
LoadCallbackStage.Complete -> {}
}
}
// Equivalent to VideoCore::LoadCallbackStage
private suspend fun updateProgressAsync(title: String, progress: Int, max: Int) {
withContext(Dispatchers.Main) {
showMessage("$title:异步进度执行中")
}
// 模拟一些处理时间
kotlinx.coroutines.delay(1000)
withContext(Dispatchers.Main) {
emulationViewModel.updateProgress(title, progress, max)
}
}
private fun showMessage(message: String) {
emulationActivity.showToast(message)
}
enum class LoadCallbackStage {
Prepare, Build, Complete
}