diff --git a/src/net/torvald/btex/BTeXDocument.kt b/src/net/torvald/btex/BTeXDocument.kt index eb203a4a4..b74347758 100644 --- a/src/net/torvald/btex/BTeXDocument.kt +++ b/src/net/torvald/btex/BTeXDocument.kt @@ -8,6 +8,7 @@ import com.badlogic.gdx.graphics.g2d.TextureRegion import com.badlogic.gdx.utils.Disposable import net.torvald.terrarum.FlippingSpriteBatch import net.torvald.terrarum.ceilToInt +import net.torvald.terrarum.concurrent.ThreadExecutor import net.torvald.terrarum.imagefont.TinyAlphNum import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.archivers.ClusteredFormatDOM import net.torvald.terrarum.modulecomputers.virtualcomputer.tvd.archivers.Clustfile @@ -21,6 +22,7 @@ import net.torvald.terrarumsansbitmap.gdx.CodepointSequence import net.torvald.terrarumsansbitmap.gdx.TerrarumSansBitmap import java.io.File import java.io.RandomAccessFile +import java.util.concurrent.Callable import java.util.zip.Deflater /** @@ -161,14 +163,35 @@ class BTeXDocument : Disposable { pageTextures = Array(pages.size) { null } pagePixmaps = Array(pages.size) { null } - pages.forEachIndexed { pageNum, page -> - val pixmap = Pixmap(pageDimensionWidth, pageDimensionHeight, Pixmap.Format.RGBA8888).also { - it.blending = Pixmap.Blending.SourceOver - it.filter = Pixmap.Filter.NearestNeighbour + if (!multithread) { + pages.forEachIndexed { pageNum, page -> + val pixmap = Pixmap(pageDimensionWidth, pageDimensionHeight, Pixmap.Format.RGBA8888).also { + it.blending = Pixmap.Blending.SourceOver + it.filter = Pixmap.Filter.NearestNeighbour + } + page.renderToPixmap(pixmap, 0, 0, pageMarginH, pageMarginV) + printPageNumber(pixmap, pageNum, 0, 0) + pagePixmaps[pageNum] = pixmap + } + } + else { + val jobs = pages.indices.map { pageNum -> Callable { + val page = pages[pageNum] + val pixmap = Pixmap(pageDimensionWidth, pageDimensionHeight, Pixmap.Format.RGBA8888).also { + it.blending = Pixmap.Blending.SourceOver + it.filter = Pixmap.Filter.NearestNeighbour + } + page.renderToPixmap(pixmap, 0, 0, pageMarginH, pageMarginV) + printPageNumber(pixmap, pageNum, 0, 0) + pagePixmaps[pageNum] = pixmap + } } + + // my experiment tells 4, 8, 16, 32 threads all perform the same + ThreadExecutor(Runtime.getRuntime().availableProcessors().div(2).coerceIn(1..4)).also { + it.renew() + it.submitAll(jobs) + it.join() } - page.renderToPixmap(pixmap, 0, 0, pageMarginH, pageMarginV) - printPageNumber(pixmap, pageNum, 0, 0) - pagePixmaps[pageNum] = pixmap } isFinalised = true diff --git a/src/net/torvald/terrarum/tests/BTeXTest.kt b/src/net/torvald/terrarum/tests/BTeXTest.kt index 557877ba0..c2a327036 100644 --- a/src/net/torvald/terrarum/tests/BTeXTest.kt +++ b/src/net/torvald/terrarum/tests/BTeXTest.kt @@ -26,9 +26,9 @@ import kotlin.system.measureTimeMillis */ class BTeXTest : ApplicationAdapter() { - val filePath = "btex_ko.xml" +// val filePath = "btex_ko.xml" // val filePath = "test.xml" -// val filePath = "literature/en/daniel_defoe_robinson_crusoe.btxbook" + val filePath = "literature/en/daniel_defoe_robinson_crusoe.xml" // val filePath = "literature/ruRU/anton_chekhov_palata_no_6.xml" // val filePath = "literature/koKR/yisang_nalgae.btxbook" @@ -72,7 +72,7 @@ class BTeXTest : ApplicationAdapter() { } measureTimeMillis { - document.finalise() + document.finalise(true) }.also { println("Time spent on finalising [ms]: $it") } @@ -103,7 +103,7 @@ class BTeXTest : ApplicationAdapter() { gdxClearAndEnableBlend(.063f, .070f, .086f, 1f) if (::document.isInitialized) { - if (document.isFinalised) { + if (document.isFinalised || document.fromArchive) { val drawX = (1280 - (pageGap + document.pageDimensionWidth * 2)) / 2 val drawY = 24