iOS画像フィレット処理

3472 ワード

フィレットの処理

AsyncDisplayKit からのDeomo SocialAppLayoutこれは新浪微博、appのようなレイアウトの単一ページです.顔が丸みであることはよく知られていますが、layerを使用して丸みを処理すると、性能が損なわれるに違いありません.次に、SocialAppLayoutがどのようにしたかを見てみましょう.
興味のある方はgitからコードをダウンロードしてみてください.
// User pic   Node      node           ,     ,    ,       。
        _avatarNode = [[ASNetworkImageNode alloc] init];
        ///       
        _avatarNode.imageModificationBlock = ^UIImage *(UIImage *image) {
            
            UIImage *modifiedImage;
            CGRect rect = CGRectMake(0, 0, image.size.width, image.size.height);
            
            UIGraphicsBeginImageContextWithOptions(image.size, false, [[UIScreen mainScreen] scale]);
            
            [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:44.0] addClip];
            [image drawInRect:rect];
            modifiedImage = UIGraphicsGetImageFromCurrentImageContext();
            
            UIGraphicsEndImageContext();
            
            return modifiedImage;
            
        };

imageModificationBlockは、ピクチャ復号が完了した後に呼び出されます.ここで、パラメータimageは復号後の正方形ピクチャです.
に合格
[[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:44.0] addClip];

フィレットを設定します.(PS:プロジェクトで直接使用可能).
もちろん毎回フィレットの処理をするわけではありませんが、キャッシュはやはりします.
……
///   ASWeakMapEntry   
ASWeakMapEntry *entry = [self.class contentsForkey:contentsKey isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled];
    if (entry == nil) {  // If nil, we were cancelled.
        return nil;
    }
    _weakCacheEntry = entry; // Retain so that the entry remains in the weak cache
    
……
ASWeakMapEntryの声明は以下の通りである.
@interface ASWeakMapEntry : NSObject

@property (nonatomic, retain, readonly) Value value;

@end


ここにはUIImageオブジェクトが1つしか保存されていません.
キャッシュから画像を取得する手順を見てみましょう
+ (ASWeakMapEntry *)contentsForkey:(ASImageNodeContentsKey *)key isCancelled:(asdisplaynode_iscancelled_block_t)isCancelled
{
  {
    ASDN::MutexLocker l(cacheLock);
    if (!cache) {
      cache = [[ASWeakMap alloc] init];
    }
    ///      ,    
    ASWeakMapEntry *entry = [cache entryForKey:key];
    if (entry != nil) {
      // cache hit
      return entry;
    }
  }

  //      ,    。
  UIImage *contents = [self createContentsForkey:key isCancelled:isCancelled];
  if (contents == nil) { // If nil, we were cancelled
    return nil;
  }

  {
    ASDN::MutexLocker l(cacheLock);
    return [cache setObject:contents forKey:key];
  }
}


EntryオブジェクトはすべてASWeakMapに存在します.
ここにキャッシュがない場合は、createContentsForkeyメソッドを直接呼び出して作成します.作成プロセスは、現在のピクチャを復号し、imageModificationBlockの呼び出しを復号したことにほかならない.ここでblockを使うのは、他に効果があるかもしれないからです.ASWeakMapの声明は以下の通りである.
@interface ASWeakMap<__covariant key="" :="" nsobject="" value=""> : NSObject

/**
 * Read from the cache.  The Value object is accessible from the returned ASWeakMapEntry.
 */
- (nullable ASWeakMapEntry *)entryForKey:(Key)key;

/**
 * Put a value into the cache.  If an entry with an equal key already exists, then the value is updated on the existing entry.
 */
- (ASWeakMapEntry *)setObject:(Value)value forKey:(Key)key;

@end

画像のフィレットがパフォーマンスに影響を与える場合は、ここを参照してください.ASWeakMapはAsyncDisplayKitから直接取り出すことができ、何の依存もありません.