Commit 4c99e1d3 authored by Igor Demin's avatar Igor Demin

SkiaWindowPerfomanceTest. Fix compilation issue

parent 6e79a5c8
...@@ -44,94 +44,94 @@ native crash in SkiaWindowTest "render single window" ...@@ -44,94 +44,94 @@ native crash in SkiaWindowTest "render single window"
// .popStyle() // .popStyle()
// .build() // .build()
@Test private class TestWindow(
fun `FPS is near display refresh rate (multiple windows)`() = swingTest { width: Int,
class TestWindow( height: Int,
width: Int, private val frameCount: Int,
height: Int, private val deviatedTerminalCount: Int
private val frameCount: Int, ) : SkiaWindow() {
private val deviatedTerminalCount: Int private val expectedDeviatePercent1 = 0.05
) : SkiaWindow() { private val expectedDeviatePercent2 = 0.15
private val expectedDeviatePercent1 = 0.05 private val expectedDeviatePercent3 = 0.30
private val expectedDeviatePercent2 = 0.15 private val expectedDeviatePercentTerminal = 0.50
private val expectedDeviatePercent3 = 0.30
private val expectedDeviatePercentTerminal = 0.50 private val expectedFrameNanos = 1E9 / graphicsConfiguration.device.displayMode.refreshRate
private val frameTimes = mutableListOf<Long>()
private val expectedFrameNanos = 1E9 / graphicsConfiguration.device.displayMode.refreshRate private var canCollect = false
private val frameTimes = mutableListOf<Long>()
private var canCollect = false val frameTimeDeltas get() = frameTimes.zipWithNext { a, b -> b - a }
val frameTimeDeltas get() = frameTimes.zipWithNext { a, b -> b - a } val isCollected get() = frameTimes.size >= frameCount
val isCollected get() = frameTimes.size >= frameCount private fun deviated(deviatePercent: Double) = frameTimeDeltas.filter {
abs(log2(it / expectedFrameNanos)) > log2(1 + deviatePercent)
private fun deviated(deviatePercent: Double) = frameTimeDeltas.filter { }
abs(log2(it / expectedFrameNanos)) > log2(1 + deviatePercent)
}
init { init {
setSize(width, height) setSize(width, height)
defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
layer.renderer = object : SkiaRenderer { layer.renderer = object : SkiaRenderer {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) { override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
if (canCollect && frameTimes.size < frameCount) { if (canCollect && frameTimes.size < frameCount) {
frameTimes.add(System.nanoTime()) // we check the real time, not the time provided by the argument frameTimes.add(System.nanoTime()) // we check the real time, not the time provided by the argument
}
layer.needRedraw()
} }
layer.needRedraw()
} }
isUndecorated = true
isVisible = true
} }
isUndecorated = true
isVisible = true
}
fun startCollect() { fun startCollect() {
canCollect = true canCollect = true
} }
fun printInfo() { fun printInfo() {
println("[Window frame times ($frameCount frames)]") println("[Window frame times ($frameCount frames)]")
val millis = frameTimeDeltas.map { it / 1E6 } val millis = frameTimeDeltas.map { it / 1E6 }
println("Deltas " + millis.map { String.format("%.1f", it) }) println("Deltas " + millis.map { String.format("%.1f", it) })
println("Average %.2f".format(millis.average())) println("Average %.2f".format(millis.average()))
println("Standard deviation %.2f".format(millis.stddev())) println("Standard deviation %.2f".format(millis.stddev()))
fun deviateMessage(percent: Double, deviated: List<Long>): String { fun deviateMessage(percent: Double, deviated: List<Long>): String {
val deviatedStr = deviated.map { String.format("%.1f", it / 1E6) } val deviatedStr = deviated.map { String.format("%.1f", it / 1E6) }
val percentTStr = (percent * 100).roundToInt() val percentTStr = (percent * 100).roundToInt()
return "$deviatedStr deviate by $percentTStr%" return "$deviatedStr deviate by $percentTStr%"
} }
val deviated1 = deviated(expectedDeviatePercent1) val deviated1 = deviated(expectedDeviatePercent1)
val deviated2 = deviated(expectedDeviatePercent2) val deviated2 = deviated(expectedDeviatePercent2)
val deviated3 = deviated(expectedDeviatePercent3) val deviated3 = deviated(expectedDeviatePercent3)
val deviatedTerminal = deviated(expectedDeviatePercentTerminal) val deviatedTerminal = deviated(expectedDeviatePercentTerminal)
println(deviateMessage(expectedDeviatePercent1, deviated1 - deviated2 - deviated3 - deviatedTerminal)) println(deviateMessage(expectedDeviatePercent1, deviated1 - deviated2 - deviated3 - deviatedTerminal))
println(deviateMessage(expectedDeviatePercent2, deviated2 - deviated3 - deviatedTerminal)) println(deviateMessage(expectedDeviatePercent2, deviated2 - deviated3 - deviatedTerminal))
println(deviateMessage(expectedDeviatePercent3, deviated3 - deviatedTerminal)) println(deviateMessage(expectedDeviatePercent3, deviated3 - deviatedTerminal))
if (deviatedTerminal.size > deviatedTerminalCount) { if (deviatedTerminal.size > deviatedTerminalCount) {
throw AssertionError(deviateMessage(expectedDeviatePercentTerminal, deviatedTerminal)) throw AssertionError(deviateMessage(expectedDeviatePercentTerminal, deviatedTerminal))
} else { } else {
println(deviateMessage(expectedDeviatePercentTerminal, deviatedTerminal)) println(deviateMessage(expectedDeviatePercentTerminal, deviatedTerminal))
}
println()
} }
private fun List<Double>.stddev(): Double { println()
val average = average()
fun f(x: Double) = (x - average) * (x - average)
return sqrt(map(::f).average())
}
} }
suspend fun awaitFrameCollection(windows: List<TestWindow>) { private fun List<Double>.stddev(): Double {
while (!windows.all(TestWindow::isCollected)) { val average = average()
delay(100) fun f(x: Double) = (x - average) * (x - average)
} return sqrt(map(::f).average())
} }
}
private suspend fun awaitFrameCollection(windows: List<TestWindow>) {
while (!windows.all(TestWindow::isCollected)) {
delay(100)
}
}
@Test
fun `FPS is near display refresh rate (multiple windows)`() = swingTest {
val windows = (1..3).map { index -> val windows = (1..3).map { index ->
TestWindow(width = 40, height = 20, frameCount = 300, deviatedTerminalCount = 10).apply { TestWindow(width = 40, height = 20, frameCount = 300, deviatedTerminalCount = 10).apply {
location = Point((index + 1) * 200, 200) location = Point((index + 1) * 200, 200)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment