Untitled

 avatar
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