diff --git a/app/androidApp/src/main/kotlin/com/example/aiapp/DebugStats.kt b/app/androidApp/src/main/kotlin/com/example/aiapp/DebugStats.kt index 3d36bd4..145b1a5 100644 --- a/app/androidApp/src/main/kotlin/com/example/aiapp/DebugStats.kt +++ b/app/androidApp/src/main/kotlin/com/example/aiapp/DebugStats.kt @@ -33,6 +33,15 @@ object DebugStats { at(counts, name).addAndGet(by) } + /** Keeps [name] at the largest value it has been given, for a high-water mark. */ + fun atLeast(name: String, value: Long) { + val slot = at(counts, name) + while (true) { + val had = slot.get() + if (value <= had || slot.compareAndSet(had, value)) break + } + } + /** Records one occurrence of [name] that took [elapsed] nanoseconds. */ fun record(name: String, elapsed: Long) { count(name) diff --git a/app/androidApp/src/main/kotlin/com/example/aiapp/TranscriptScroll.kt b/app/androidApp/src/main/kotlin/com/example/aiapp/TranscriptScroll.kt index d2f2bc8..c35cdc1 100644 --- a/app/androidApp/src/main/kotlin/com/example/aiapp/TranscriptScroll.kt +++ b/app/androidApp/src/main/kotlin/com/example/aiapp/TranscriptScroll.kt @@ -138,8 +138,20 @@ class TranscriptScroll(internal val scroll: ScrollState) { val top = tops.getOrNull(index) ?: return true val viewportTop = scroll.maxValue - scroll.value val margin = scroll.viewportSize - return top + height >= viewportTop - margin && - top <= viewportTop + scroll.viewportSize + margin + val near = + top + height >= viewportTop - margin && + top <= viewportTop + scroll.viewportSize + margin + // Counted so that "drawing costs too much" can be told apart from "drawing was skipped and + // still costs too much". They need opposite fixes: the first is a row that should not have + // been drawn, the second is a single row too tall to record cheaply -- and one enormous + // reply on screen records as many glyph runs as a hundred short ones. + if (near) { + DebugStats.count("row drawn") + DebugStats.atLeast("tallest drawn row px", height.toLong()) + } else { + DebugStats.count("row skipped") + } + return near } /** Where the last touch went down, in the content's own coordinates. */