feat: cache resource move from global to each context
This commit is contained in:
parent
3ac737db00
commit
96266921ff
@ -35,6 +35,7 @@ import java.util.HashMap;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.WeakHashMap;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
import pub.doric.async.AsyncResult;
|
import pub.doric.async.AsyncResult;
|
||||||
@ -42,6 +43,7 @@ import pub.doric.navbar.IDoricNavBar;
|
|||||||
import pub.doric.navigator.IDoricNavigator;
|
import pub.doric.navigator.IDoricNavigator;
|
||||||
import pub.doric.performance.DoricPerformanceProfile;
|
import pub.doric.performance.DoricPerformanceProfile;
|
||||||
import pub.doric.plugin.DoricJavaPlugin;
|
import pub.doric.plugin.DoricJavaPlugin;
|
||||||
|
import pub.doric.resource.DoricResource;
|
||||||
import pub.doric.shader.RootNode;
|
import pub.doric.shader.RootNode;
|
||||||
import pub.doric.shader.ViewNode;
|
import pub.doric.shader.ViewNode;
|
||||||
import pub.doric.utils.DoricConstant;
|
import pub.doric.utils.DoricConstant;
|
||||||
@ -66,6 +68,7 @@ public class DoricContext {
|
|||||||
private final Map<String, Map<String, ViewNode<?>>> mHeadNodes = new HashMap<>();
|
private final Map<String, Map<String, ViewNode<?>>> mHeadNodes = new HashMap<>();
|
||||||
private final DoricPerformanceProfile performanceProfile;
|
private final DoricPerformanceProfile performanceProfile;
|
||||||
private final Map<String, Animator> animators = new HashMap<>();
|
private final Map<String, Animator> animators = new HashMap<>();
|
||||||
|
private final Map<String, DoricResource> cachedResources = new WeakHashMap<>();
|
||||||
|
|
||||||
public Collection<ViewNode<?>> allHeadNodes(String type) {
|
public Collection<ViewNode<?>> allHeadNodes(String type) {
|
||||||
Map<String, ViewNode<?>> headNode = mHeadNodes.get(type);
|
Map<String, ViewNode<?>> headNode = mHeadNodes.get(type);
|
||||||
@ -216,6 +219,7 @@ public class DoricContext {
|
|||||||
javaPlugin.onTearDown();
|
javaPlugin.onTearDown();
|
||||||
}
|
}
|
||||||
mPluginMap.clear();
|
mPluginMap.clear();
|
||||||
|
cachedResources.clear();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}, ThreadMode.UI);
|
}, ThreadMode.UI);
|
||||||
@ -355,4 +359,12 @@ public class DoricContext {
|
|||||||
public void removeAnimator(String animatorId) {
|
public void removeAnimator(String animatorId) {
|
||||||
animators.remove(animatorId);
|
animators.remove(animatorId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void cacheResource(String resId, DoricResource doricResource) {
|
||||||
|
this.cachedResources.put(resId, doricResource);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DoricResource getCachedResource(String resId) {
|
||||||
|
return this.cachedResources.get(resId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,6 @@ import com.github.pengfeizhou.jscore.JSObject;
|
|||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.WeakHashMap;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
@ -32,7 +31,6 @@ import pub.doric.DoricContext;
|
|||||||
*/
|
*/
|
||||||
public class DoricResourceManager {
|
public class DoricResourceManager {
|
||||||
private final Map<String, DoricResourceLoader> mResourceLoaders = new HashMap<>();
|
private final Map<String, DoricResourceLoader> mResourceLoaders = new HashMap<>();
|
||||||
private final Map<String, DoricResource> cachedResources = new WeakHashMap<>();
|
|
||||||
|
|
||||||
public synchronized void registerLoader(DoricResourceLoader loader) {
|
public synchronized void registerLoader(DoricResourceLoader loader) {
|
||||||
mResourceLoaders.put(loader.resourceType(), loader);
|
mResourceLoaders.put(loader.resourceType(), loader);
|
||||||
@ -48,7 +46,7 @@ public class DoricResourceManager {
|
|||||||
String resId = resource.getProperty("resId").asString().value();
|
String resId = resource.getProperty("resId").asString().value();
|
||||||
String type = resource.getProperty("type").asString().value();
|
String type = resource.getProperty("type").asString().value();
|
||||||
String identifier = resource.getProperty("identifier").asString().value();
|
String identifier = resource.getProperty("identifier").asString().value();
|
||||||
DoricResource doricResource = cachedResources.get(resId);
|
DoricResource doricResource = doricContext.getCachedResource(resId);
|
||||||
if (doricResource == null) {
|
if (doricResource == null) {
|
||||||
if ("arrayBuffer".equals(type)) {
|
if ("arrayBuffer".equals(type)) {
|
||||||
doricResource = new DoricArrayBufferResource(
|
doricResource = new DoricArrayBufferResource(
|
||||||
@ -59,7 +57,7 @@ public class DoricResourceManager {
|
|||||||
DoricResourceLoader loader = mResourceLoaders.get(type);
|
DoricResourceLoader loader = mResourceLoaders.get(type);
|
||||||
if (loader != null) {
|
if (loader != null) {
|
||||||
doricResource = loader.load(doricContext, identifier);
|
doricResource = loader.load(doricContext, identifier);
|
||||||
cachedResources.put(resId, doricResource);
|
doricContext.cacheResource(resId, doricResource);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ NS_ASSUME_NONNULL_BEGIN
|
|||||||
@property(nonatomic, copy) NSString *extra;
|
@property(nonatomic, copy) NSString *extra;
|
||||||
@property(nonatomic, assign) BOOL destroyed;
|
@property(nonatomic, assign) BOOL destroyed;
|
||||||
@property(nonatomic, strong) DoricPerformanceProfile *performanceProfile;
|
@property(nonatomic, strong) DoricPerformanceProfile *performanceProfile;
|
||||||
|
@property(nonatomic, strong) NSMapTable <NSString *, __kindof DoricResource *> *cachedResources;
|
||||||
|
|
||||||
- (instancetype)initWithScript:(NSString *)script source:(NSString *)source extra:(NSString *)extra;
|
- (instancetype)initWithScript:(NSString *)script source:(NSString *)source extra:(NSString *)extra;
|
||||||
|
|
||||||
|
@ -42,6 +42,9 @@ - (instancetype)initWithScript:(NSString *)script source:(NSString *)source extr
|
|||||||
_headNodes = [NSMutableDictionary new];
|
_headNodes = [NSMutableDictionary new];
|
||||||
DoricRootNode *rootNode = [[DoricRootNode alloc] initWithContext:self];
|
DoricRootNode *rootNode = [[DoricRootNode alloc] initWithContext:self];
|
||||||
_rootNode = rootNode;
|
_rootNode = rootNode;
|
||||||
|
_cachedResources = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsCopyIn
|
||||||
|
valueOptions:NSPointerFunctionsWeakMemory
|
||||||
|
capacity:0];
|
||||||
[self init:extra];
|
[self init:extra];
|
||||||
[self callEntity:DORIC_ENTITY_CREATE withArgumentsArray:@[]];
|
[self callEntity:DORIC_ENTITY_CREATE withArgumentsArray:@[]];
|
||||||
}
|
}
|
||||||
@ -66,6 +69,7 @@ - (void)dealloc {
|
|||||||
[[DoricContextManager instance] destroyContext:self];
|
[[DoricContextManager instance] destroyContext:self];
|
||||||
[self callEntity:DORIC_ENTITY_DESTROY withArgumentsArray:@[]];
|
[self callEntity:DORIC_ENTITY_DESTROY withArgumentsArray:@[]];
|
||||||
[self.driver destroyContext:self.contextId];
|
[self.driver destroyContext:self.contextId];
|
||||||
|
[self.cachedResources removeAllObjects];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (DoricAsyncResult *)callEntity:(NSString *)method, ... {
|
- (DoricAsyncResult *)callEntity:(NSString *)method, ... {
|
||||||
|
@ -18,10 +18,10 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
#import "DoricResourceManager.h"
|
#import "DoricResourceManager.h"
|
||||||
|
#import "DoricContext.h"
|
||||||
|
|
||||||
@interface DoricResourceManager ()
|
@interface DoricResourceManager ()
|
||||||
@property(nonatomic, strong) NSMutableDictionary <NSString *, id <DoricResourceLoader>> *loaders;
|
@property(nonatomic, strong) NSMutableDictionary <NSString *, id <DoricResourceLoader>> *loaders;
|
||||||
@property(nonatomic, strong) NSMapTable <NSString *, __kindof DoricResource *> *cachedResources;
|
|
||||||
@property(nonatomic, strong) dispatch_queue_t mapQueue;
|
@property(nonatomic, strong) dispatch_queue_t mapQueue;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -30,9 +30,6 @@ - (instancetype)init {
|
|||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
_loaders = [NSMutableDictionary new];
|
_loaders = [NSMutableDictionary new];
|
||||||
_mapQueue = dispatch_queue_create("doric.resource", DISPATCH_QUEUE_SERIAL);
|
_mapQueue = dispatch_queue_create("doric.resource", DISPATCH_QUEUE_SERIAL);
|
||||||
_cachedResources = [[NSMapTable alloc] initWithKeyOptions:NSPointerFunctionsCopyIn
|
|
||||||
valueOptions:NSPointerFunctionsWeakMemory
|
|
||||||
capacity:0];
|
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@ -56,11 +53,11 @@ - (__kindof DoricResource *)load:(NSDictionary *)resource
|
|||||||
NSString *resId = resource[@"resId"];
|
NSString *resId = resource[@"resId"];
|
||||||
__block __kindof DoricResource *doricResource;
|
__block __kindof DoricResource *doricResource;
|
||||||
dispatch_sync(self.mapQueue, ^() {
|
dispatch_sync(self.mapQueue, ^() {
|
||||||
doricResource = [self.cachedResources objectForKey:resId];
|
doricResource = [context.cachedResources objectForKey:resId];
|
||||||
if (!doricResource) {
|
if (!doricResource) {
|
||||||
id <DoricResourceLoader> loader = self.loaders[type];
|
id <DoricResourceLoader> loader = self.loaders[type];
|
||||||
doricResource = [loader load:identifier withContext:context];
|
doricResource = [loader load:identifier withContext:context];
|
||||||
[self.cachedResources setObject:doricResource forKey:resId];
|
[context.cachedResources setObject:doricResource forKey:resId];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return doricResource;
|
return doricResource;
|
||||||
|
Reference in New Issue
Block a user