feat: cache resource move from global to each context

This commit is contained in:
pengfei.zhou 2021-11-26 11:58:39 +08:00 committed by osborn
parent 3ac737db00
commit 96266921ff
5 changed files with 22 additions and 10 deletions

View File

@ -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);
}
} }

View File

@ -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);
} }
} }
} }

View File

@ -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;

View File

@ -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, ... {

View File

@ -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;