Browse Source

* All asset cache operations can now work on smart cache
* Added better test for asset cache

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7917 75d07b2b-3a1a-0410-a2c5-0572b91ccdca

sha..rd 14 years ago
parent
commit
f15107da95

+ 6 - 5
engine/src/desktop/com/jme3/asset/AssetCache.java

@@ -84,12 +84,12 @@ public class AssetCache {
      * <font color="red">Thread-safe.</font>
      */
     public boolean deleteFromCache(AssetKey key){
-        if (key.useSmartCache()){
-            throw new UnsupportedOperationException("You cannot delete from the smart cache");
-        }
-
         synchronized (regularCache){
-            return regularCache.remove(key) != null;
+            if (key.useSmartCache()){
+                return smartCache.remove(key) != null;
+            }else{
+                return regularCache.remove(key) != null;
+            }
         }
     }
 
@@ -125,6 +125,7 @@ public class AssetCache {
     public void deleteAllAssets(){
         synchronized (regularCache){
             regularCache.clear();
+            smartCache.clear();
         }
     }
 }

+ 117 - 51
engine/src/test/jme3test/asset/TestAssetCache.java

@@ -32,74 +32,140 @@
 
 package jme3test.asset;
 
+import com.jme3.asset.Asset;
 import com.jme3.asset.AssetCache;
 import com.jme3.asset.AssetKey;
+import java.util.ArrayList;
+import java.util.List;
 
 public class TestAssetCache {
+    
+    /**
+     * Keep references to loaded assets
+     */
+    private final static boolean KEEP_REFERENCES = false;
+    
+    /**
+     * Enable smart cache use
+     */
+    private final static boolean USE_SMART_CACHE = true;
+    
+    /**
+     * Enable cloneable asset use
+     */
+    private final static boolean CLONEABLE_ASSET = true;
 
-    private static class MyAsset {
-        
-        private String name;
-        private byte[] bytes = new byte[100];
+    private static int counter = 0;
+    
+    private static class DummyData implements Asset {
+
+        private AssetKey key;
+        private byte[] data = new byte[10000];
 
-        public MyAsset(String name) {
-            this.name = name;
+        public byte[] getData(){
+            return data;
+        }
+        
+        public AssetKey getKey() {
+            return key;
         }
 
-        public String getName() {
-            return name;
+        public void setKey(AssetKey key) {
+            this.key = key;
+        }
+    }
+    
+    private static class SmartKey extends AssetKey {
+        
+        public SmartKey(){
+            super(".");
+            counter++;
+        }
+        
+        @Override
+        public int hashCode(){
+            return 0;
+        }
+        
+        @Override
+        public boolean equals(Object other){
+            return false;
+        }
+        
+        @Override
+        public boolean useSmartCache(){
+            return true;
+        }
+        
+        @Override
+        public Object createClonedInstance(Object asset){
+            DummyData data = new DummyData();
+            return data;
+        }
+    }
+    
+    private static class DumbKey extends AssetKey {
+        
+        public DumbKey(){
+            super(".");
+            counter++;
+        }
+        
+        @Override
+        public int hashCode(){
+            return 0;
+        }
+        
+        @Override
+        public boolean equals(Object other){
+            return false;
         }
         
-    } 
+        @Override
+        public Object createClonedInstance(Object asset){
+            if (CLONEABLE_ASSET){
+                DummyData data = new DummyData();
+                return data;
+            }else{
+                return asset;
+            }
+        }
+    }
     
-//    private static final long memoryUsage(){
-//        return Runtime.getRuntime().
-//    }
-//
     public static void main(String[] args){
+        List<Object> refs = new ArrayList<Object>(5000);
+        
         AssetCache cache = new AssetCache();
-
-        System.gc();
-        System.gc();
-        System.gc();
-        System.gc();
-
-        long startMem = Runtime.getRuntime().freeMemory();
-
-        for (int i = 0; i < 10000; i++){
-            MyAsset asset = new MyAsset("asset"+i);
-            AssetKey key = new AssetKey(asset.getName());
-        }
-
-        long endMem = Runtime.getRuntime().freeMemory();
-        System.out.println("No cache    diff:\t"+(startMem-endMem));
-
+        
         System.gc();
         System.gc();
         System.gc();
         System.gc();
-
-        endMem = Runtime.getRuntime().freeMemory();
-        System.out.println("No cache gc diff:\t"+(startMem-endMem));
-        startMem = endMem;
-
-        for (int i = 0; i < 10000; i++){
-            MyAsset asset = new MyAsset("asset"+i);
-            AssetKey key = new AssetKey(asset.getName());
-            cache.addToCache(key, asset);
+        
+        long memory = Runtime.getRuntime().freeMemory();
+        
+        while (true){
+            AssetKey key;
+            
+            if (USE_SMART_CACHE){
+                key = new SmartKey();
+            }else{
+                key = new DumbKey();
+            }
+            
+            DummyData data = new DummyData();
+            cache.addToCache(key, data);
+            
+            if (KEEP_REFERENCES){
+                refs.add(data);
+            }
+            
+            if ((counter % 100) == 0){
+                long newMem = Runtime.getRuntime().freeMemory();
+                System.out.println("Allocated objects: " + counter);
+                System.out.println("Allocated memory: " + ((memory - newMem)/1024) + "K" );
+                memory = newMem;
+            }
         }
-
-        endMem = Runtime.getRuntime().freeMemory();
-        System.out.println("Cache       diff:\t"+(startMem-endMem));
-
-        System.gc();
-        System.gc();
-        System.gc();
-        System.gc();
-
-        endMem = Runtime.getRuntime().freeMemory();
-        System.out.println("Cache gc    diff:\t"+(startMem-endMem));
-//        System.out.println("Estimated usage: "+)
     }
-
 }