* 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. 168
      engine/src/test/jme3test/asset/TestAssetCache.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();
}
}
}

@ -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: "+)
}
}

Loading…
Cancel
Save