diff --git a/src/activities/reader/EpubReaderActivity.cpp b/src/activities/reader/EpubReaderActivity.cpp index be0c1466..96bbaa4a 100644 --- a/src/activities/reader/EpubReaderActivity.cpp +++ b/src/activities/reader/EpubReaderActivity.cpp @@ -1207,7 +1207,17 @@ void EpubReaderActivity::render(RenderLock&& lock) { renderContents(std::move(p), orientedMarginTop, orientedMarginRight, orientedMarginBottom, orientedMarginLeft); LOG_DBG("ERS", "Rendered page in %dms", millis() - start); } - saveProgress(currentSpineIndex, section->currentPage, section->estimatedTotalPages()); + // Only persist when the position actually changed. render() also runs on menu, + // bookmark and screenshot re-renders, and writeAtomic is several FAT ops for 6 bytes. + // Every real page turn changes currentPage, so progress durability is unaffected. + if (currentSpineIndex != lastSavedSpineIndex || section->currentPage != lastSavedPage || + section->pageCount != lastSavedPageCount) { + if (saveProgress(currentSpineIndex, section->currentPage, section->estimatedTotalPages())) { + lastSavedSpineIndex = currentSpineIndex; + lastSavedPage = section->currentPage; + lastSavedPageCount = section->estimatedTotalPages(); + } + } showPendingSyncSaveError(); diff --git a/src/activities/reader/EpubReaderActivity.h b/src/activities/reader/EpubReaderActivity.h index e9973508..0fcdae8f 100644 --- a/src/activities/reader/EpubReaderActivity.h +++ b/src/activities/reader/EpubReaderActivity.h @@ -63,6 +63,12 @@ class EpubReaderActivity final : public Activity { SavedPosition savedPositions[MAX_FOOTNOTE_DEPTH] = {}; int footnoteDepth = 0; + // Last position persisted by render()'s saveProgress, used to skip redundant + // writeAtomic calls on no-op re-renders (menu/bookmark/screenshot). + int lastSavedSpineIndex = -1; + int lastSavedPage = -1; + int lastSavedPageCount = -1; + void renderContents(std::unique_ptr page, int orientedMarginTop, int orientedMarginRight, int orientedMarginBottom, int orientedMarginLeft); void renderStatusBar() const;