mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
Cache: Rewrite based on lua-lru
Ought to be faster than our naive array-based approach. Especially for the glyph cache, which has a solid amount of elements, and is mostly cache hits. (There are few things worse for performance in Lua than table.remove @ !tail and table.insert @ !tail, which this was full of :/). DocCache: New module that's now an actual Cache instance instead of a weird hack. Replaces "Cache" (the instance) as used across Document & co. Only Cache instance with on-disk persistence. ImageCache: Update to new Cache. GlyphCache: Update to new Cache. Also, actually free glyph bbs on eviction.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
local Blitbuffer = require("ffi/blitbuffer")
|
||||
local Cache = require("cache")
|
||||
local CacheItem = require("cacheitem")
|
||||
local Configurable = require("configurable")
|
||||
local DocCache = require("document/doccache")
|
||||
local DrawContext = require("ffi/drawcontext")
|
||||
local CanvasContext = require("document/canvascontext")
|
||||
local Geom = require("ui/geometry")
|
||||
@@ -172,14 +172,14 @@ end
|
||||
-- this might be overridden by a document implementation
|
||||
function Document:getNativePageDimensions(pageno)
|
||||
local hash = "pgdim|"..self.file.."|"..pageno
|
||||
local cached = Cache:check(hash)
|
||||
local cached = DocCache:check(hash)
|
||||
if cached then
|
||||
return cached[1]
|
||||
end
|
||||
local page = self._document:openPage(pageno)
|
||||
local page_size_w, page_size_h = page:getSize(self.dc_null)
|
||||
local page_size = Geom:new{ w = page_size_w, h = page_size_h }
|
||||
Cache:insert(hash, CacheItem:new{ page_size })
|
||||
DocCache:insert(hash, CacheItem:new{ page_size })
|
||||
page:close()
|
||||
return page_size
|
||||
end
|
||||
@@ -372,10 +372,10 @@ end
|
||||
function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
local hash_excerpt
|
||||
local hash = self:getFullPageHash(pageno, zoom, rotation, gamma, render_mode, self.render_color)
|
||||
local tile = Cache:check(hash, TileCacheItem)
|
||||
local tile = DocCache:check(hash, TileCacheItem)
|
||||
if not tile then
|
||||
hash_excerpt = hash.."|"..tostring(rect)
|
||||
tile = Cache:check(hash_excerpt)
|
||||
tile = DocCache:check(hash_excerpt)
|
||||
end
|
||||
if tile then return tile end
|
||||
|
||||
@@ -385,7 +385,7 @@ function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
-- this will be the size we actually render
|
||||
local size = page_size
|
||||
-- we prefer to render the full page, if it fits into cache
|
||||
if not Cache:willAccept(size.w * size.h * (self.render_color and 4 or 1) + 512) then
|
||||
if not DocCache:willAccept(size.w * size.h * (self.render_color and 4 or 1) + 512) then
|
||||
-- whole page won't fit into cache
|
||||
logger.dbg("rendering only part of the page")
|
||||
--- @todo figure out how to better segment the page
|
||||
@@ -430,7 +430,7 @@ function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
local page = self._document:openPage(pageno)
|
||||
page:draw(dc, tile.bb, size.x, size.y, render_mode)
|
||||
page:close()
|
||||
Cache:insert(hash, tile)
|
||||
DocCache:insert(hash, tile)
|
||||
|
||||
self:postRenderPage()
|
||||
return tile
|
||||
@@ -440,7 +440,7 @@ end
|
||||
--- @todo this should trigger a background operation
|
||||
function Document:hintPage(pageno, zoom, rotation, gamma, render_mode)
|
||||
--- @note: Crappy safeguard around memory issues like in #7627: if we're eating too much RAM, drop half the cache...
|
||||
Cache:memoryPressureCheck()
|
||||
DocCache:memoryPressureCheck()
|
||||
|
||||
logger.dbg("hinting page", pageno)
|
||||
self:renderPage(pageno, nil, zoom, rotation, gamma, render_mode)
|
||||
|
||||
Reference in New Issue
Block a user