From 03ab4354018f1198e53459765eee49f0f7d4fe3f Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 14 Aug 2024 12:58:06 +0800 Subject: [PATCH] Fix preload in reader (#1517) * Fix preload in reader * Reduce preload page count for ArchivePageLoader --- .../ehviewer/gallery/ArchivePageLoader.kt | 32 ++++++++++++++----- .../hippo/ehviewer/gallery/EhPageLoader.kt | 7 ++-- .../com/hippo/ehviewer/ui/reader/PagerItem.kt | 6 ++-- .../tachiyomi/ui/reader/loader/PageLoader.kt | 10 +++--- 4 files changed, 37 insertions(+), 18 deletions(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt b/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt index 3c3b898ab..ae89d7016 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/gallery/ArchivePageLoader.kt @@ -91,13 +91,17 @@ class ArchivePageLoader( override fun onRequest(index: Int) { synchronized(mJobMap) { - val current = mJobMap[index] - if (current?.isActive != true) { - mJobMap[index] = launch { - mWorkerMutex.withLock(index) { - mSemaphore.withPermit { - doRealWork(index) - } + enqueue(index) + } + } + + private fun enqueue(index: Int) { + val current = mJobMap[index] + if (current?.isActive != true) { + mJobMap[index] = launch { + mWorkerMutex.withLock(index) { + mSemaphore.withPermit { + doRealWork(index) } } } @@ -161,7 +165,19 @@ class ArchivePageLoader( false } - override fun preloadPages(pages: List, pair: Pair) {} + override val preloadPageCount = 3 + + override fun preloadPages(pages: List, bounds: Pair) { + synchronized(mJobMap) { + val (min, max) = bounds + mJobMap.forEach { (i, job) -> + if (i < min || i > max) { + job.cancel() + } + } + pages.forEach(::enqueue) + } + } } private const val DEBUG_TAG = "ArchivePageLoader" diff --git a/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt b/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt index 1d1de8680..f97e435be 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/gallery/EhPageLoader.kt @@ -15,6 +15,7 @@ */ package com.hippo.ehviewer.gallery +import com.hippo.ehviewer.Settings import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.GalleryInfo import com.hippo.ehviewer.image.Image @@ -105,7 +106,9 @@ class EhPageLoader(private val mGalleryInfo: GalleryInfo, startPage: Int) : notifyPageFailed(index, error) } - override fun preloadPages(pages: List, pair: Pair) { - mSpiderQueen.preloadPages(pages, pair) + override val preloadPageCount = Settings.preloadImage + + override fun preloadPages(pages: List, bounds: Pair) { + mSpiderQueen.preloadPages(pages, bounds) } } diff --git a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt index 87ab35592..d2ded43d8 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/ui/reader/PagerItem.kt @@ -45,13 +45,13 @@ fun PagerItem( contentScale: ContentScale, modifier: Modifier = Modifier, ) { + LaunchedEffect(Unit) { + pageLoader.request(page.index) + } val defaultError = stringResource(id = R.string.decode_image_error) val state by page.status.collectAsState() when (state) { Page.State.QUEUE, Page.State.LOAD_PAGE, Page.State.DOWNLOAD_IMAGE -> { - LaunchedEffect(Unit) { - pageLoader.request(page.index) - } Box( modifier = Modifier.fillMaxWidth().aspectRatio(DEFAULT_ASPECT), contentAlignment = Alignment.Center, diff --git a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt index 5dbb69952..ab2b129e1 100644 --- a/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt +++ b/app/src/main/kotlin/eu/kanade/tachiyomi/ui/reader/loader/PageLoader.kt @@ -33,7 +33,7 @@ abstract class PageLoader { (0 until size).map { ReaderPage(it) } } - private val preloads = com.hippo.ehviewer.Settings.preloadImage.coerceIn(0, 100) + abstract val preloadPageCount: Int @CallSuper open suspend fun awaitReady(): Boolean { @@ -66,11 +66,11 @@ abstract class PageLoader { onRequest(index) } - val pagesAbsent = ((index - 5).coerceAtLeast(0) until (preloads + index).coerceAtMost(size)) - .mapNotNullTo(mutableListOf()) { it.takeIf { it != index && cache[it] == null } } + val preloadRange = (index - 3).coerceAtLeast(0) until (index + preloadPageCount).coerceAtMost(size) + val pagesAbsent = preloadRange.mapNotNullTo(mutableListOf()) { it.takeIf { it != index && cache[it] == null } } // Load forward first, then load backward from the nearest index pagesAbsent.sortBy { (index - it).coerceAtLeast(0) } - preloadPages(pagesAbsent, (index - 10).coerceAtLeast(0) to (preloads + index + 10).coerceAtMost(size)) + preloadPages(pagesAbsent, (preloadRange.first - 5).coerceAtLeast(0) to (preloadRange.last + 10).coerceAtMost(size)) } fun retryPage(index: Int, orgImg: Boolean = false) { @@ -78,7 +78,7 @@ abstract class PageLoader { onForceRequest(index, orgImg) } - protected abstract fun preloadPages(pages: List, pair: Pair) + protected abstract fun preloadPages(pages: List, bounds: Pair) protected abstract fun onRequest(index: Int)