mirror of
https://github.com/bitsycore/skiko.git
synced 2026-10-07 15:37:27 +00:00
This PR contain: 1. Using shared metal textures with this JBR API - [SharedTextures](https://github.com/JetBrains/JetBrainsRuntimeApi/blob/main/src/com/jetbrains/SharedTextures.java). See `AcceleratedSwingPainter`. 2. Not ultimate, but visible improvement of the not accelerated painting for Windows(~%25), and MacOS(~20%). Unfortunately, didn't manage to see a positive change on Linux with XRender pipeline(about the same, probably few percents down). With opengl pipeline it also got ~20% faster. But currently our pipeline on linux is XRender I got rid of make one extra copy of the raster image. See `SoftwareSwingPainter` `com.jetbrains:jbr-api` size is about 44kb Benchmarks: `Redraw` - time to prepare the offscreen image including sync, but not including fetching texture to the CPU RAM `Paint` - time to get the image from GPU(if needed) and draw onto `Graphics2D` `Total` - total time to deliver the frame ``` MetalSwingRedrawer: Image size: 3200x2344 Test: ClocksAwt MacBook Pro M1 Max java2d pipeline = Metal Current SoftwareSwingPainter AcceleratedSwingPainter FPS 66 80 141 Redraw(ms) 7.13 7.13 6.92 Paint(ms) 7.65 6.07 0.006 Total(ms) 14.78 12.16 6.92 Direct3DSwingRedrawer Image size: 3176x2284 Dell Prescision 5570, i9-12900H + GPU Nvidia Test: ClocksAwt java2d pipeline = GDI Current SoftwareSwingPainter FPS 32 41 Redraw(ms) 12.58 11.57 Paint(ms) 17.43 11.54 Total(ms) 29.93 23.11 LinuxOpenGLSwingRedrawer Image size: 3192x2230 Dell Prescision 5570, i9-12900H + GPU Nvidia Test: ClocksAwt java2d pipeline = XRender Current SoftwareSwingPainter FPS 24 23 Redraw(ms) 20.07 19.64 Paint(ms) 19.69 22.73 Total(ms) 39.77 42.39 ``` --------- Co-authored-by: Igor Demin <igordmn@users.noreply.github.com>
89 lines
2.7 KiB
Kotlin
89 lines
2.7 KiB
Kotlin
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
|
|
|
|
plugins {
|
|
kotlin("jvm") version "1.8.0"
|
|
application
|
|
}
|
|
|
|
repositories {
|
|
mavenLocal()
|
|
mavenCentral()
|
|
maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
|
|
}
|
|
|
|
val osName = System.getProperty("os.name")
|
|
val targetOs = when {
|
|
osName == "Mac OS X" -> "macos"
|
|
osName.startsWith("Win") -> "windows"
|
|
osName.startsWith("Linux") -> "linux"
|
|
else -> error("Unsupported OS: $osName")
|
|
}
|
|
|
|
val osArch = System.getProperty("os.arch")
|
|
var targetArch = when (osArch) {
|
|
"x86_64", "amd64" -> "x64"
|
|
"aarch64" -> "arm64"
|
|
else -> error("Unsupported arch: $osArch")
|
|
}
|
|
|
|
val target = "${targetOs}-${targetArch}"
|
|
|
|
var version = "0.0.0-SNAPSHOT"
|
|
if (project.hasProperty("skiko.version")) {
|
|
version = project.properties["skiko.version"] as String
|
|
}
|
|
|
|
dependencies {
|
|
implementation(platform("org.jetbrains.kotlin:kotlin-bom"))
|
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
|
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-swing:1.5.0")
|
|
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:1.5.0")
|
|
implementation("org.jetbrains.skiko:skiko-awt-runtime-$target:$version")
|
|
implementation("org.jetbrains.runtime:jbr-api:1.5.0")
|
|
testImplementation("org.jetbrains.kotlin:kotlin-test")
|
|
testImplementation("org.jetbrains.kotlin:kotlin-test-junit")
|
|
}
|
|
|
|
application {
|
|
mainClass.set("SkiaAwtSample.AppKt")
|
|
}
|
|
|
|
val additionalArguments = mutableMapOf<String, String>()
|
|
|
|
val casualRun = tasks.named<JavaExec>("run") {
|
|
systemProperty("skiko.fps.enabled", "true")
|
|
systemProperty("skiko.linux.autodpi", "true")
|
|
systemProperty("skiko.hardwareInfo.enabled", "true")
|
|
systemProperty("skiko.win.exception.logger.enabled", "true")
|
|
systemProperty("skiko.win.exception.handler.enabled", "true")
|
|
jvmArgs?.add("-ea")
|
|
// jvmArgs?.add("-Xcheck:jni")
|
|
// Use systemProperty("skiko.library.path", "/tmp") to test loader.
|
|
System.getProperties().entries
|
|
.associate {
|
|
(it.key as String) to (it.value as String)
|
|
}
|
|
.filterKeys { it.startsWith("skiko.") }
|
|
.forEach { systemProperty(it.key, it.value) }
|
|
additionalArguments.forEach { systemProperty(it.key, it.value) }
|
|
}
|
|
|
|
tasks.register("runSoftware") {
|
|
additionalArguments += mapOf("skiko.renderApi" to "DIRECT_SOFTWARE")
|
|
dependsOn(casualRun)
|
|
}
|
|
|
|
tasks.register("runWithTransparency") {
|
|
additionalArguments += mapOf("skiko.transparency" to "true")
|
|
dependsOn(casualRun)
|
|
}
|
|
|
|
tasks.register("runInterop") {
|
|
additionalArguments += mapOf("skiko.swing.interop" to "true")
|
|
dependsOn(casualRun)
|
|
}
|
|
|
|
tasks.withType<KotlinCompile>().configureEach {
|
|
kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
|
|
}
|