Skip to content

Commit d670290

Browse files
committed
improve preheat
1 parent 069a67c commit d670290

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

app/src/main/java/com/awxkee/avif/coil/MainActivity.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class MainActivity : AppCompatActivity() {
2727
.newBuilder()
2828
.logger(DebugLogger())
2929
.components {
30-
add(AnimatedAvifDecoder.Factory(preheatFrames = 5))
30+
add(AnimatedAvifDecoder.Factory(preheatFrames = 10))
3131
}
3232
.bitmapConfig(Bitmap.Config.ARGB_8888)
3333
.build()

avifcoillibrary/src/main/java/com/github/awxkee/avifcoil/decoder/animation/AnimatedDrawable.kt

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,27 +78,39 @@ public class AnimatedDrawable(
7878

7979
private val measuredTimesStore = mutableListOf<Int>()
8080

81-
private fun makeDecodingRunner(nextFrameIndex: Int): Runnable {
82-
return DecodeFrameRunnable(
83-
syncedFrames,
84-
frameStore,
85-
lock,
86-
nextFrameIndex,
87-
measuredTimesStore
88-
)
89-
}
81+
private var shouldClearCache = frameStore.framesCount > preheatFrames
82+
83+
private fun makeDecodingRunner(
84+
nextFrameIndex: Int
85+
): Runnable = DecodeFrameRunnable(
86+
syncedFrames = syncedFrames,
87+
frameStore = frameStore,
88+
lock = lock,
89+
nextFrameIndex = nextFrameIndex,
90+
measuredTimesStore = measuredTimesStore,
91+
preheatFrames = preheatFrames,
92+
shouldClearCache = shouldClearCache
93+
)
9094

9195
private class DecodeFrameRunnable(
9296
private val syncedFrames: MutableList<SyncedFrame>,
9397
private val frameStore: AnimatedFrameStore,
9498
private val lock: Any,
9599
private val nextFrameIndex: Int,
96100
private val measuredTimesStore: MutableList<Int>,
101+
private val preheatFrames: Int,
102+
private val shouldClearCache: Boolean
97103
) : Runnable {
98104
override fun run() {
99105
val measureTime = measureTimeMillis {
100106
val syncedNextFrame = syncedFrames.firstOrNull { it.frameIndex == nextFrameIndex }
101107
if (syncedNextFrame == null) {
108+
if (shouldClearCache) {
109+
val firstFromNext = nextFrameIndex - preheatFrames
110+
if (syncedFrames.firstOrNull { it.frameIndex == firstFromNext } != null) {
111+
syncedFrames.removeIf { it.frameIndex == firstFromNext }
112+
}
113+
}
102114
val nextFrame = frameStore.getFrame(nextFrameIndex)
103115
val nextFrameDuration = frameStore.getFrameDuration(nextFrameIndex)
104116
synchronized(lock) {

0 commit comments

Comments
 (0)