cache that expires

This commit is contained in:
RandomityGuy 2023-06-26 02:07:47 +05:30
parent c58b995143
commit cd2883885b
2 changed files with 77 additions and 6 deletions

View file

@ -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<String, DifCache> = [];
static var difCache:LRUCache<DifCache> = new LRUCache(16);
static var materialDict:Map<String, {
friction:Float,
@ -213,7 +214,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;
@ -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;

66
src/LRUCache.hx Normal file
View file

@ -0,0 +1,66 @@
package src;
@:publicFields
@:generic
class LRUCacheValue<V> {
var value:V;
var age:Int;
public function new() {}
}
@:generic
class LRUCache<V> {
var cacheMap:Map<String, LRUCacheValue<V>>;
var size = 10;
var curSize = 0;
public function new(size:Int) {
cacheMap = new Map<String, LRUCacheValue<V>>();
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<V>();
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;
}
}
}
}