* 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
3.0
sha..rd 14 years ago
parent ae2fda8626
commit f15107da95
  1. 11
      engine/src/desktop/com/jme3/asset/AssetCache.java
  2. 146
      engine/src/test/jme3test/asset/TestAssetCache.java

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

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

Loading…
Cancel
Save