Untitled
unknown
plain_text
10 months ago
3.0 kB
21
Indexable
package org.runestar.cs2
class FrameRateManager {
private val frameTimes: MutableList<Long> = mutableListOf()
companion object {
const val MAX_FRAME_SAMPLES = 10
const val TARGET_FPS = 30.0
}
/**
* Records the time it took to render the current frame
* @param frameTimeMs - time in milliseconds for this frame
*/
fun recordFrame(frameTimeMs: Long) {
require(frameTimeMs >= 0) { "Frame time is negative" }
frameTimes.add(frameTimeMs)
if (frameTimes.size > MAX_FRAME_SAMPLES) {
frameTimes.removeAt(0)
}
}
/**
* Calculate current FPS based on the most recent frame
* @return current FPS, or 0 if no frames recorded
*/
fun getCurrentFPS(): Double {
if (frameTimes.isEmpty()) return 0.0
val lastFrameTimeMs = frameTimes.last()
return lastFrameTimeMs.takeIf { it > 0 }?.let { 1000.0 / it } ?: 0.0
}
/**
* Calculate average FPS over recent frames
* @return average FPS, or 0 if no frames recorded
*/
fun getAverageFPS(): Double {
if (frameTimes.isEmpty()) return 0.0
val positiveFrameTimes = frameTimes.filter { it > 0 }
if (positiveFrameTimes.isEmpty()) return 0.0
val sumOfPositiveFrameTimes = positiveFrameTimes.sum()
if (sumOfPositiveFrameTimes == 0L) return 0.0
val averageFrameTimeMs = sumOfPositiveFrameTimes.toDouble() / positiveFrameTimes.size
return averageFrameTimeMs.takeIf { it > 0 }?.let { 1000.0 / it } ?: 0.0
}
/**
* Check if game is running smoothly
* @return true if average FPS >= TARGET_FPS
*/
val isRunningSmooth: Boolean
get() = getAverageFPS() >= TARGET_FPS
/**
* Get number of frames recorded
* @return number of frames in our sample
*/
val frameCount: Int
get() = frameTimes.size
}
fun main() {
val manager = FrameRateManager()
val testFrames = longArrayOf(16, 17, 16, 33, 33, 50, 0, 16, 17, 16, 15, 60, 20)
println("=== Game Frame Rate Test ===")
testFrames.forEachIndexed { index, frameTimeMs ->
try {
manager.recordFrame(frameTimeMs)
val currentFpsStr = "%.1f".format(manager.getCurrentFPS())
val averageFpsStr = "%.1f".format(manager.getAverageFPS())
val smoothStatus = if (manager.isRunningSmooth) "YES" else "NO"
println(
"Frame ${index + 1}: ${frameTimeMs}ms | " +
"Frame count : ${manager.frameCount} | " +
"Current FPS: $currentFpsStr | " +
"Average FPS: $averageFpsStr | " +
"Smooth: $smoothStatus"
)
} catch (e: IllegalArgumentException) {
println("Frame ${index + 1}: Error recording frame time ${frameTimeMs}ms - ${e.message}")
}
}
}
Editor is loading...
Leave a Comment