From 2d72523ade7708273f07de94c0f8bfb6edcc8d3c Mon Sep 17 00:00:00 2001 From: mcfans Date: Thu, 21 Apr 2022 20:32:56 +0800 Subject: [PATCH 1/2] fix: use source image for synchronized correct --- Source/ASImageNode.mm | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/Source/ASImageNode.mm b/Source/ASImageNode.mm index 49b35d6f4..2a859fcce 100644 --- a/Source/ASImageNode.mm +++ b/Source/ASImageNode.mm @@ -456,6 +456,7 @@ + (UIImage *)displayWithParameters:(id)parameter isCancelled:(NS_NOESC } static ASWeakMap *cache = nil; +static ASWeakMap *workingKeySourceImageMap = nil; + (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key drawParameters:(id)drawParameters isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled { @@ -464,20 +465,29 @@ + (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key drawParameters: dispatch_once(&onceToken, ^{ cacheLock = new AS::Mutex(); }); + + UIImage *sourceImage = key.image; { AS::MutexLocker l(*cacheLock); if (!cache) { cache = [[ASWeakMap alloc] init]; + workingKeySourceImageMap = [[ASWeakMap alloc] init]; } ASWeakMapEntry *entry = [cache entryForKey:key]; if (entry != nil) { return entry; } + ASWeakMapEntry *sourceImageEntry = [workingKeySourceImageMap entryForKey: key]; + if (sourceImageEntry != nil) { + sourceImage = sourceImageEntry.value; + } else { + [workingKeySourceImageMap setObject:sourceImage forKey:key]; + } } // cache miss - UIImage *contents = [self createContentsForkey:key drawParameters:drawParameters isCancelled:isCancelled]; + UIImage *contents = [self createContentsForkey:contentsKey sourceImage:sourceImage drawParameters:drawParameters isCancelled:isCancelled]; if (contents == nil) { // If nil, we were cancelled return nil; } @@ -488,7 +498,7 @@ + (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key drawParameters: } } -+ (UIImage *)createContentsForkey:(ASImageNodeContentsKey *)key drawParameters:(id)parameter isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled ++ (UIImage *)createContentsForkey:(ASImageNodeContentsKey *)key sourceImage:(UIImage *)sourceImage drawParameters:(id)parameter isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled { // The following `ASGraphicsCreateImage` call will sometimes take take longer than 5ms on an // A5 processor for a 400x800 backingSize. @@ -537,7 +547,7 @@ + (UIImage *)createContentsForkey:(ASImageNodeContentsKey *)key drawParameters:( [key.tintColor setFill]; } - @synchronized(image) { + @synchronized(sourceImage) { [image drawInRect:key.imageDrawRect blendMode:blendMode alpha:1]; } From 7cb67e27bd9e2f261eb38f8a0b7aa8ecdbea77a0 Mon Sep 17 00:00:00 2001 From: mcfans Date: Thu, 21 Apr 2022 21:11:40 +0800 Subject: [PATCH 2/2] fix: typo --- Source/ASImageNode.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ASImageNode.mm b/Source/ASImageNode.mm index 2a859fcce..6f7994cdf 100644 --- a/Source/ASImageNode.mm +++ b/Source/ASImageNode.mm @@ -487,7 +487,7 @@ + (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key drawParameters: } // cache miss - UIImage *contents = [self createContentsForkey:contentsKey sourceImage:sourceImage drawParameters:drawParameters isCancelled:isCancelled]; + UIImage *contents = [self createContentsForkey:key sourceImage:sourceImage drawParameters:drawParameters isCancelled:isCancelled]; if (contents == nil) { // If nil, we were cancelled return nil; }