btex: better multithreaded rendering

This commit is contained in:
minjaesong
2024-06-02 22:02:22 +09:00
parent 408e976dd8
commit 9948566ce4

View File

@@ -12,6 +12,7 @@ import net.torvald.terrarum.btex.BTeXDocument.Companion.HREF_UNDERLINE_SHADOW
import net.torvald.terrarum.btex.BTeXDocument.Companion.UNDERLINE_Y import net.torvald.terrarum.btex.BTeXDocument.Companion.UNDERLINE_Y
import net.torvald.terrarum.ceilToInt import net.torvald.terrarum.ceilToInt
import net.torvald.terrarum.concurrent.ThreadExecutor import net.torvald.terrarum.concurrent.ThreadExecutor
import net.torvald.terrarum.concurrent.sliceEvenly
import net.torvald.terrarum.imagefont.TinyAlphNum import net.torvald.terrarum.imagefont.TinyAlphNum
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.archivers.ClusteredFormatDOM import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.archivers.ClusteredFormatDOM
import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.archivers.Clustfile import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.archivers.Clustfile
@@ -227,7 +228,9 @@ class BTeXDocument : Disposable {
} }
} }
else { else {
val jobs = pages.indices.map { pageNum -> Callable { // my experiment tells 4, 8, 16, 32 threads all perform the same
val THREAD_COUNT = Runtime.getRuntime().availableProcessors().div(2).coerceIn(1..4)
val jobs = pages.indices.sliceEvenly(THREAD_COUNT).map { Callable { it.forEach { pageNum ->
val page = pages[pageNum] val page = pages[pageNum]
val pixmap = Pixmap(pageDimensionWidth, pageDimensionHeight, Pixmap.Format.RGBA8888).also { val pixmap = Pixmap(pageDimensionWidth, pageDimensionHeight, Pixmap.Format.RGBA8888).also {
it.blending = Pixmap.Blending.SourceOver it.blending = Pixmap.Blending.SourceOver
@@ -238,10 +241,9 @@ class BTeXDocument : Disposable {
pagePixmaps[pageNum] = pixmap pagePixmaps[pageNum] = pixmap
progressIndicator.getAndAdd(1) progressIndicator.getAndAdd(1)
Unit Unit
} } } } }
// my experiment tells 4, 8, 16, 32 threads all perform the same ThreadExecutor(THREAD_COUNT).also {
ThreadExecutor(Runtime.getRuntime().availableProcessors().div(2).coerceIn(1..4)).also {
it.renew() it.renew()
it.submitAll(jobs) it.submitAll(jobs)
it.join() it.join()