From cd2883885b3791da2c977d9a2f6fd5a279c58d8a Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Mon, 26 Jun 2023 02:07:47 +0530 Subject: [PATCH] cache that expires --- src/DifBuilder.hx | 17 +++++++----- src/LRUCache.hx | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 src/LRUCache.hx diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index 0974de07..7ff13c8b 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -36,6 +36,7 @@ import src.MarbleGame; import src.ResourceLoaderWorker; import src.Console; import src.Debug; +import src.LRUCache; class DifBuilderTriangle { public var texture:String; @@ -98,7 +99,7 @@ typedef VertexBucket = { } class DifBuilder { - static var difCache:Map = []; + static var difCache:LRUCache = new LRUCache(16); static var materialDict:Map { var diffuseTex = ResourceLoader.getTexture(baseTexture).resource; diffuseTex.wrap = Repeat; - diffuseTex.mipMap = Nearest; + diffuseTex.mipMap = Linear; + diffuseTex.filter = Linear; var normalTex = ResourceLoader.getTexture(normalTexture).resource; normalTex.wrap = Repeat; normalTex.mipMap = Nearest; @@ -230,7 +232,8 @@ class DifBuilder { var worker = new ResourceLoaderWorker(() -> { var diffuseTex = ResourceLoader.getTexture(baseTexture).resource; diffuseTex.wrap = Repeat; - diffuseTex.mipMap = Nearest; + diffuseTex.mipMap = Linear; + diffuseTex.filter = Linear; var normalTex = ResourceLoader.getTexture(normalTexture).resource; normalTex.wrap = Repeat; normalTex.mipMap = Nearest; @@ -262,7 +265,8 @@ class DifBuilder { var worker = new ResourceLoaderWorker(() -> { var diffuseTex = ResourceLoader.getTexture(baseTexture).resource; diffuseTex.wrap = Repeat; - diffuseTex.mipMap = Nearest; + diffuseTex.mipMap = Linear; + diffuseTex.filter = Linear; var shader = new DefaultNormalMaterial(diffuseTex, shininess, specularColor, uvScaleFactor); onFinish(shader); }); @@ -274,7 +278,8 @@ class DifBuilder { var worker = new ResourceLoaderWorker(() -> { var diffuseTex = ResourceLoader.getTexture('data/textures/${baseTexture}').resource; diffuseTex.wrap = Repeat; - diffuseTex.mipMap = Nearest; + diffuseTex.mipMap = Linear; + diffuseTex.filter = Linear; var normalTex = ResourceLoader.getTexture('data/textures/tile_intermediate.normal.png').resource; normalTex.wrap = Repeat; normalTex.mipMap = Nearest; @@ -973,7 +978,7 @@ class DifBuilder { } else { texture = ResourceLoader.getTextureRealpath(tex(grp)).resource; // ResourceLoader.getTexture(tex(grp), false).resource; texture.wrap = Wrap.Repeat; - texture.mipMap = Nearest; + texture.mipMap = Linear; material.texture = texture; material.shadows = false; material.receiveShadows = true; diff --git a/src/LRUCache.hx b/src/LRUCache.hx new file mode 100644 index 00000000..a569439d --- /dev/null +++ b/src/LRUCache.hx @@ -0,0 +1,66 @@ +package src; + +@:publicFields +@:generic +class LRUCacheValue { + var value:V; + var age:Int; + + public function new() {} +} + +@:generic +class LRUCache { + var cacheMap:Map>; + var size = 10; + var curSize = 0; + + public function new(size:Int) { + cacheMap = new Map>(); + this.size = size; + } + + function tick() { + for (k => v in cacheMap) { + v.age >>= 1; + } + } + + public function get(k:String) { + var cv = cacheMap.get(k); + return (cv != null) ? cv.value : null; + } + + public function exists(k:String) { + return cacheMap.exists(k); + } + + public function set(k:String, v:V) { + var cv = cacheMap.get(k); + if (cv != null) { + cv.value = v; + cv.age = 0xFFFF; + } else { + cv = new LRUCacheValue(); + cv.value = v; + cv.age = 0xFFFF; + cacheMap[k] = cv; + curSize += 1; + } + tick(); + if (curSize > size) { + var minAge = 0xFFFF; + var minAgeKey = null; + for (k => v in cacheMap) { + if (v.age < minAge) { + minAge = v.age; + minAgeKey = k; + } + } + if (minAgeKey != null) { + cacheMap.remove(minAgeKey); + curSize -= 1; + } + } + } +}