package com.glview.hwui.cache; import android.support.v4.util.LruCache; import com.glview.graphics.mesh.BasicMesh; import com.glview.libgdx.graphics.Mesh; public class MeshCache { final static int DEFAULT_VERTEX_CACHE_SIZE = 2 * 1024 * 1024; //10MB MeshLruCache mCache; public MeshCache() { mCache = new MeshLruCache(DEFAULT_VERTEX_CACHE_SIZE); } public void clear() { mCache.evictAll(); } public Mesh get(BasicMesh basicMesh) { MeshDescription entry = mCache.get(basicMesh.getKey()); if (entry == null) { entry = new MeshDescription(); entry.mesh = new Mesh(false, basicMesh.getVertexCount(), basicMesh.getIndexCount(), basicMesh.getVertexAttributes()); mCache.put(basicMesh.getKey(), entry); } entry.basicMesh = basicMesh; if (!entry.valid || basicMesh.needReload()) { entry.mesh.setVertices(basicMesh.getVertices()); entry.mesh.setIndices(basicMesh.getIndices()); entry.valid = true; } return entry.mesh; } static class MeshDescription { Mesh mesh; BasicMesh basicMesh; boolean valid = false; } class MeshLruCache extends LruCache<Object, MeshDescription> { public MeshLruCache(int maxSize) { super(maxSize); } @Override protected int sizeOf(Object key, MeshDescription value) { Mesh mesh = value.mesh; return mesh.getVertexSize() * mesh.getMaxVertices() + mesh.getMaxIndices() * 2; } @Override protected void entryRemoved(boolean evicted, Object key, MeshDescription oldValue, MeshDescription newValue) { oldValue.mesh.dispose(); } } }