麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

GPUImageAPI文檔之GPUImageFramebufferCache類

2019-11-14 17:55:47
字體:
供稿:網(wǎng)友

  GPUImageFramebufferCache類負責管理GPUImageFramebuffer對象,是一個GPUImageFramebuffer對象的緩存。

  方法

  - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture

  說明:從cache中獲取一個GPUImageFramebuffer對象,如果獲取失敗,那么創(chuàng)建一個新的GPUImageFramebuffer對象。

  參數(shù):framebufferSize是對象的大小,textureOptions是紋理的配置信息,onlyTexture指示是否只為紋理,是否包含framebuffer對象。

  返回:一個GPUImageFramebuffer對象

  實現(xiàn)

 

- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture;{    __block GPUImageFramebuffer *framebufferFromCache = nil;//    dispatch_sync(framebufferCacheQueue, ^{    runSynchronouslyOnVideoPRocessingQueue(^{        NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture];        NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash];        NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue];                if ([numberOfMatchingTexturesInCache integerValue] < 1)        {            // Nothing in the cache, create a new framebuffer to use            framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture];        }        else        {            // Something found, pull the old framebuffer and decrement the count            NSInteger currentTextureID = (numberOfMatchingTextures - 1);            while ((framebufferFromCache == nil) && (currentTextureID >= 0))            {                NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)currentTextureID];                framebufferFromCache = [framebufferCache objectForKey:textureHash];                // Test the values in the cache first, to see if they got invalidated behind our back                if (framebufferFromCache != nil)                {                    // Withdraw this from the cache while it's in use                    [framebufferCache removeObjectForKey:textureHash];                }                currentTextureID--;            }                        currentTextureID++;                        [framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash];                        if (framebufferFromCache == nil)            {                framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture];            }        }    });    [framebufferFromCache lock];    return framebufferFromCache;}

 

 

 

  - (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize onlyTexture:(BOOL)onlyTexture

  說明:同上

  實現(xiàn)

 

- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize onlyTexture:(BOOL)onlyTexture;{    GPUTextureOptions defaultTextureOptions;    defaultTextureOptions.minFilter = GL_LINEAR;    defaultTextureOptions.magFilter = GL_LINEAR;    defaultTextureOptions.wrapS = GL_CLAMP_TO_EDGE;    defaultTextureOptions.wrapT = GL_CLAMP_TO_EDGE;    defaultTextureOptions.internalFormat = GL_RGBA;    defaultTextureOptions.format = GL_BGRA;    defaultTextureOptions.type = GL_UNSIGNED_BYTE;        return [self fetchFramebufferForSize:framebufferSize textureOptions:defaultTextureOptions onlyTexture:onlyTexture];}

 

  - (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer

  說明:向GPUImageFramebuffer緩存加添加GPUImageFramebuffer對象

  參數(shù):需要添加的GPUImageFramebuffer對象

  實現(xiàn)

 

- (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer;{    [framebuffer clearAllLocks];    //    dispatch_async(framebufferCacheQueue, ^{    runAsynchronouslyOnVideoProcessingQueue(^{        CGSize framebufferSize = framebuffer.size;        GPUTextureOptions framebufferTextureOptions = framebuffer.textureOptions;        NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions onlyTexture:framebuffer.missingFramebuffer];        NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash];        NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue];                NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)numberOfMatchingTextures];        //        [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)];        [framebufferCache setObject:framebuffer forKey:textureHash];        [framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash];    });}

 

  - (void)purgeAllUnassignedFramebuffers

  說明:清理緩存中的紋理緩存,清理framebufferCache中的所有對象

  實現(xiàn)

 

- (void)purgeAllUnassignedFramebuffers;{    runAsynchronouslyOnVideoProcessingQueue(^{//    dispatch_async(framebufferCacheQueue, ^{        [framebufferCache removeAllObjects];        [framebufferTypeCounts removeAllObjects];#if TARGET_ipHONE_SIMULATOR || TARGET_OS_IPHONE        CVOpenGLESTextureCacheFlush([[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], 0);#else#endif    });}

 

 

 

  - (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer

  說明:

  實現(xiàn)

 

- (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer;{    runAsynchronouslyOnVideoProcessingQueue(^{//    dispatch_async(framebufferCacheQueue, ^{        [activeImageCaptureList addObject:framebuffer];    });}

 

  - (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer

  說明:

  實現(xiàn)

 

- (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer;{    runAsynchronouslyOnVideoProcessingQueue(^{//  dispatch_async(framebufferCacheQueue, ^{        [activeImageCaptureList removeObject:framebuffer];    });}

 

 

 

完整代碼

#import <Foundation/Foundation.h>#import <QuartzCore/QuartzCore.h>#import "GPUImageFramebuffer.h"@interface GPUImageFramebufferCache : NSObject// Framebuffer management- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture;- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize onlyTexture:(BOOL)onlyTexture;- (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer;- (void)purgeAllUnassignedFramebuffers;- (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer;- (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer;@end

 

#import "GPUImageFramebufferCache.h"#import "GPUImageContext.h"#import "GPUImageOutput.h"#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE#import <UIKit/UIKit.h>#else#endif@interface GPUImageFramebufferCache(){//    NSCache *framebufferCache;    NSMutableDictionary *framebufferCache;    NSMutableDictionary *framebufferTypeCounts;    NSMutableArray *activeImageCaptureList; // Where framebuffers that may be lost by a filter, but which are still needed for a UIImage, etc., are stored    id memoryWarningObserver;    dispatch_queue_t framebufferCacheQueue;}- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture;@end@implementation GPUImageFramebufferCache#pragma mark -#pragma mark Initialization and teardown- (id)init;{    if (!(self = [super init]))    {        return nil;    }    #if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE    memoryWarningObserver = [[NSNotificationCenter defaultCenter] addObserverForName:UIapplicationDidReceiveMemoryWarningNotification object:nil queue:nil usingBlock:^(NSNotification *note) {                [self purgeAllUnassignedFramebuffers];    }];#else#endif//    framebufferCache = [[NSCache alloc] init];    framebufferCache = [[NSMutableDictionary alloc] init];    framebufferTypeCounts = [[NSMutableDictionary alloc] init];    activeImageCaptureList = [[NSMutableArray alloc] init];    framebufferCacheQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.framebufferCacheQueue", NULL);        return self;}#pragma mark -#pragma mark Framebuffer management- (NSString *)hashForSize:(CGSize)size textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture;{    if (onlyTexture)    {        return [NSString stringWithFormat:@"%.1fx%.1f-%d:%d:%d:%d:%d:%d:%d-NOFB", size.width, size.height, textureOptions.minFilter, textureOptions.magFilter, textureOptions.wrapS, textureOptions.wrapT, textureOptions.internalFormat, textureOptions.format, textureOptions.type];    }    else    {        return [NSString stringWithFormat:@"%.1fx%.1f-%d:%d:%d:%d:%d:%d:%d", size.width, size.height, textureOptions.minFilter, textureOptions.magFilter, textureOptions.wrapS, textureOptions.wrapT, textureOptions.internalFormat, textureOptions.format, textureOptions.type];    }}- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize textureOptions:(GPUTextureOptions)textureOptions onlyTexture:(BOOL)onlyTexture;{    __block GPUImageFramebuffer *framebufferFromCache = nil;//    dispatch_sync(framebufferCacheQueue, ^{    runSynchronouslyOnVideoProcessingQueue(^{        NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture];        NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash];        NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue];                if ([numberOfMatchingTexturesInCache integerValue] < 1)        {            // Nothing in the cache, create a new framebuffer to use            framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture];        }        else        {            // Something found, pull the old framebuffer and decrement the count            NSInteger currentTextureID = (numberOfMatchingTextures - 1);            while ((framebufferFromCache == nil) && (currentTextureID >= 0))            {                NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)currentTextureID];                framebufferFromCache = [framebufferCache objectForKey:textureHash];                // Test the values in the cache first, to see if they got invalidated behind our back                if (framebufferFromCache != nil)                {                    // Withdraw this from the cache while it's in use                    [framebufferCache removeObjectForKey:textureHash];                }                currentTextureID--;            }                        currentTextureID++;                        [framebufferTypeCounts setObject:[NSNumber numberWithInteger:currentTextureID] forKey:lookupHash];                        if (framebufferFromCache == nil)            {                framebufferFromCache = [[GPUImageFramebuffer alloc] initWithSize:framebufferSize textureOptions:textureOptions onlyTexture:onlyTexture];            }        }    });    [framebufferFromCache lock];    return framebufferFromCache;}- (GPUImageFramebuffer *)fetchFramebufferForSize:(CGSize)framebufferSize onlyTexture:(BOOL)onlyTexture;{    GPUTextureOptions defaultTextureOptions;    defaultTextureOptions.minFilter = GL_LINEAR;    defaultTextureOptions.magFilter = GL_LINEAR;    defaultTextureOptions.wrapS = GL_CLAMP_TO_EDGE;    defaultTextureOptions.wrapT = GL_CLAMP_TO_EDGE;    defaultTextureOptions.internalFormat = GL_RGBA;    defaultTextureOptions.format = GL_BGRA;    defaultTextureOptions.type = GL_UNSIGNED_BYTE;        return [self fetchFramebufferForSize:framebufferSize textureOptions:defaultTextureOptions onlyTexture:onlyTexture];}- (void)returnFramebufferToCache:(GPUImageFramebuffer *)framebuffer;{    [framebuffer clearAllLocks];    //    dispatch_async(framebufferCacheQueue, ^{    runAsynchronouslyOnVideoProcessingQueue(^{        CGSize framebufferSize = framebuffer.size;        GPUTextureOptions framebufferTextureOptions = framebuffer.textureOptions;        NSString *lookupHash = [self hashForSize:framebufferSize textureOptions:framebufferTextureOptions onlyTexture:framebuffer.missingFramebuffer];        NSNumber *numberOfMatchingTexturesInCache = [framebufferTypeCounts objectForKey:lookupHash];        NSInteger numberOfMatchingTextures = [numberOfMatchingTexturesInCache integerValue];                NSString *textureHash = [NSString stringWithFormat:@"%@-%ld", lookupHash, (long)numberOfMatchingTextures];        //        [framebufferCache setObject:framebuffer forKey:textureHash cost:round(framebufferSize.width * framebufferSize.height * 4.0)];        [framebufferCache setObject:framebuffer forKey:textureHash];        [framebufferTypeCounts setObject:[NSNumber numberWithInteger:(numberOfMatchingTextures + 1)] forKey:lookupHash];    });}- (void)purgeAllUnassignedFramebuffers;{    runAsynchronouslyOnVideoProcessingQueue(^{//    dispatch_async(framebufferCacheQueue, ^{        [framebufferCache removeAllObjects];        [framebufferTypeCounts removeAllObjects];#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE        CVOpenGLESTextureCacheFlush([[GPUImageContext sharedImageProcessingContext] coreVideoTextureCache], 0);#else#endif    });}- (void)addFramebufferToActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer;{    runAsynchronouslyOnVideoProcessingQueue(^{//    dispatch_async(framebufferCacheQueue, ^{        [activeImageCaptureList addObject:framebuffer];    });}- (void)removeFramebufferFromActiveImageCaptureList:(GPUImageFramebuffer *)framebuffer;{    runAsynchronouslyOnVideoProcessingQueue(^{//  dispatch_async(framebufferCacheQueue, ^{        [activeImageCaptureList removeObject:framebuffer];    });}@end

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 97精品国产高清在线看入口 | 久久国产综合精品 | 黑人一区二区三区四区五区 | 男女无遮挡羞羞视频 | av不卡免费在线观看 | 日本爽快片100色毛片视频 | 91久久夜色精品国产网站 | 亚洲草逼视频 | 毛片一级片 | av国产免费 | 亚洲视频欧美 | 久久免费精品 | 视频一区二区视频 | 羞羞答答www网站进入 | www.54271.com | 成人在线97 | 成人毛片100部免费观看 | h色视频在线观看 | 91精品国产日韩91久久久久久360 | 亚洲欧美成aⅴ人在线观看 免费看欧美黑人毛片 | 久久久久久亚洲国产精品 | 精品一区二区久久久 | 亚州成人在线观看 | 另类亚洲孕妇分娩网址 | 成人一级免费 | 日本在线不卡一区二区 | 久久人人人 | 97人操 | 日韩视频一区二区三区四区 | 亚洲国产超高清a毛毛片 | 国产在线观看av | 999久久国精品免费观看网站 | 久久99亚洲精品 | 一本一道久久久a久久久精品91 | 一区二区视频在线看 | 伊人二本二区 | 久久国产精品久久久久久久久久 | 久久精品av | 在线免费观看毛片 | 91在线视频网址 | 成人福利视频 |