GUPImage库的队列管理

GPUImage3 整个框架 理解 昨天 做完视频的 旋转 缩放 平移 正交投影后 花了一天的时间 简单的看了下GPUImage3的整个框架 想看看能自己结合GUPImage3的思路 想出一个套更加 合理的多级渲染协议 所以就简单的 过了一遍GPUImage3的基础源码 总结如下 字写的不好看 有读者的话 就凑合一下吧 只是自己做笔记当备忘录的 下面是主要的几个类 和 协议 1. ImageSource public extension ImageSource { func addTarget(_ target:ImageCon 阅读详情

最近项目进度不是很紧张,开始研究GUPImage库的源码,发现GUPImage中的队列管理方式设计的很巧妙,值得学习和分享。
在GPUImageOutput.h这个文件,声明了5种不同类型的队列执行方法:

void runOnMainQueueWithoutDeadlocking(void (^block)(void));
void runSynchronouslyOnVideoProcessingQueue(void (^block)(void));
void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void));
void runSynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void));
void runAsynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void));

从这些方法的名字我们就能知道:
方法1:主线程执行并且不死锁。
方法2:在VideoProcessQueue中同步执行。
方法3:在VideoProcessQueue中异步执行。
方法4:在指定的GPUImageContext实例的VideoProcessingQueue中同步执行。
方法5:在指定的GPUImageContext实例的VideoProcessingQueue中异步执行。

如果这么说,你还是觉得很晕的话,下面我贴出起实现文件,一定会茅塞顿开。

void runOnMainQueueWithoutDeadlocking(void (^block)(void))
{
    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), block);
    }
}

void runSynchronouslyOnVideoProcessingQueue(void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue];
#if !OS_OBJECT_USE_OBJC
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    if (dispatch_get_current_queue() == videoProcessingQueue)
#pragma clang diagnostic pop
#else
    if (dispatch_get_specific([GPUImageContext contextKey]))
#endif
    {
        block();
    }else
    {
        dispatch_sync(videoProcessingQueue, block);
    }
}

void runAsynchronouslyOnVideoProcessingQueue(void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [GPUImageContext sharedContextQueue];

#if !OS_OBJECT_USE_OBJC
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    if (dispatch_get_current_queue() == videoProcessingQueue)
#pragma clang diagnostic pop
#else
    if (dispatch_get_specific([GPUImageContext contextKey]))
#endif
    {
        block();
    }else
    {
        dispatch_async(videoProcessingQueue, block);
    }
}

void runSynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [context contextQueue];
#if !OS_OBJECT_USE_OBJC
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    if (dispatch_get_current_queue() == videoProcessingQueue)
#pragma clang diagnostic pop
#else
        if (dispatch_get_specific([GPUImageContext contextKey]))
#endif
        {
            block();
        }else
        {
            dispatch_sync(videoProcessingQueue, block);
        }
}

void runAsynchronouslyOnContextQueue(GPUImageContext *context, void (^block)(void))
{
    dispatch_queue_t videoProcessingQueue = [context contextQueue];

#if !OS_OBJECT_USE_OBJC
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
    if (dispatch_get_current_queue() == videoProcessingQueue)
#pragma clang diagnostic pop
#else
        if (dispatch_get_specific([GPUImageContext contextKey]))
#endif
        {
            block();
        }else
        {
            dispatch_async(videoProcessingQueue, block);
        }
}

方法1:如果当前是运行在主线程,直接执行block。如果不是,则切换到主线程执行。
方法2:首先获取类的queue,然后同步执行。需要注意的是,类的queue是不能直接创建的,而是通过一个GPUImageContext的单例来维护的。很巧妙吧。
方法3:和方法2类似,只不过是异步执行的。
方法4:首先获取指定的GPUImageContext实例的queue,然后同步执行。
方法5:首先获取指定的GPUImageContext实例的queue,然后异步执行。

通过这些方法,就给GUPImage中的队列提供了一个统一的管理工具,减轻了队列管理的难度。

GPUImage 滤波算法详解 #import "GPUImageFilter.h" #import "GPUImagePicture.h" #import //GPUImage 源码详解 //顶点着色器 //vertex.shader //顶点着色器是一个可编程的处理单元,执行顶点变换、纹理坐标变换、光照、材质等顶点的相关操作,每顶点执行一次。替代了传统渲染管线中顶点变换、光照以及纹理坐标的处理,开发人员可以根据自己的 阅读详情

相关推荐

Sokuji状态管理最佳实践:Zustand在复杂翻译应用中的高级应用

Sokuji是一款基于设备端AI和云服务提供商(如OpenAI、Google Gemini、Palabra.ai等)的实时语音翻译应用。在这样的复杂应用中,状态管理是确保用户体验流畅的关键环节。本文将深入探讨Sokuji如何利用Zustand实现高效、可扩展的状态管理,为开发者提供在复杂翻译应用中应用Zustand的最佳实践。 ## 为什么选择Zustand? 在React应用中,状态管理方案

gitblog_00544的博客 695

GPUImage源码解读(十六)

GPUImageTextureInput继承自GPUImageOutput,可以用传入的纹理生成帧缓存对象。因此,可以作为响应链源使用。 构造方法。构造方法只有一个,接收的参数是纹理对象和纹理大小 - (id)initWithTexture:(GLuint)newInputTexture size:(CGSize)newTextureSize; 构造的时候,主要是用传入的纹理生成帧...

Philm_iOS的博客 344

GPUImage详细解析(二)

http://www.jianshu.com/p/1eea8bf8451e 解析 GPUImage详细解析(一) 上一篇介绍的是GPUImageFramebuffer和GPUImageFilter。 简单回顾一下: GPUImageFilter就是用来接收源图像,通过自定义的顶点、片元着色器来渲染新的图像,并在绘制完成后通知响应链的下一个对象。GPUImageFr

xiaota00的博客 1347

GPUimage

登录 | 注册 收藏成功 确定 收藏失败,请重新收藏 确定 标题 标题不能为空 网址 标签 摘要

weixin_33409246的博客 880

关于C# RunSynchronously()方法

run = 运行 synchronously = 同步地 相当于同步运行一个Task对象的内容。 使用它将不会另开线程执行Task对象。

dreameating的博客 1140

.NET(C#) Task RunSynchronously()和Start()的使用与区别

Task 类有两个方法 RunSynchronously 和 Start,它们可以用来启动任务,但它们的行为有所不同。调用 RunSynchronously 时,任务会在调用线程上同步执行,而不是被排队到线程池中。Start 方法用于启动一个已创建但未启动的任务。使用 Task.Start 方法时,任务会被排队到默认的任务调度器上(通常是基于线程池的调度器),然后在某个线程上运行。// 任务已经在当前线程上完成,不需要等待。// 创建一个任务,但未启动。// 创建一个任务,但未启动。

weixin_42098295的博客 702

GPUImage源码解读(六)

介绍GPUImage框架中的GPUImageInput协议以及GPUImageOutput类 GPUImageInput GPUImageInput 在GPUImageContext.h中定义, 协议提供了方法列表,细节由实现的对象实现。GPUImage中实现GPUImageInput的协议的类比较多,常见的有 GPUImageFilter、GPUImageView、GPUImageRa...

Philm_iOS的博客 536

GPUImage源码解读(四)

GPUImageFramebuffer类用于管理帧缓冲对象,负责帧缓冲对象的创建和销毁,读取帧缓冲内容,其中纹理附件涉及到了相关的纹理选项。因此,它提供的属性也是和帧缓存、纹理附件、纹理选项等相关。 ###### 属性 // 帧缓存大小 @property(readonly) CGSize size; // 纹理选项 @property(readonly) GPUTextureOpti...

Philm_iOS的博客 518

IOS技术分享| 在iOS WebRTC 中添加美颜滤镜

在使用WebRTC的时候,对视频进行美颜处理一般有两种方式:替换WebRTC中的采集模块和对视频数据进行美颜。 一、替换WebRTC中的采集模块 替换WebRTC中的采集模块,相对比较简单,使用GPUImageVideoCamera替换WebRTC中的视频采集,得到经过GPUImage添加美颜处理后的图像,发送给WebRTC的OnFrame方法。 参考基于WebRTC框架开发的全平台推拉流SDK:Github 设置美颜 - (void)setBeautyFace:(BOOL)beautyFace{

anyRTC的博客 1199

GPUImage源码解读(十)

GPUImageVideoCamera继承自GPUImageOutput,实现了 AVCaptureVideoDataOutputSampleBufferDelegate 和 AVCaptureAudioDataOutputSampleBufferDelegate 协议。GPUImageVideoCamera可以调用相机进行视频拍摄,拍摄之后会生成帧缓存对象,我们可以使用GPUImageView显...

Philm_iOS的博客 718

我是一个请求,我是如何被发送的?

摘要:本文主要分析使用cse提供的RestTemplate的场景,其实cse提供的rpc注解(RpcReference)的方式最后的调用逻辑和RestTemplate是殊途同归的。

华为云官方博客 1569

GPUImage 原理

最近在学习图像处理相关的内容,看了GPUImage的源码,查阅了相关资料,收集了许多人博客的基础上做出了整理,再次感谢给博主!GPUImage 是一个开源的基于GPU的图片或视频的处理框架,其本身内置了多达120多种常见的滤镜效果,并且支持照相机和摄像机的实时滤镜,并且能够自定义图像滤镜。 美颜基本概念 OpenGL ES:(Open Graphics Library For Embedded S

ago_lei的博客 1254

图像处理GPUImage简单使用

一、介绍 GPUImage是一个基于OpenGL ES 2.0的开源的图像处理,作者是Brad Larson。GPUImage将OpenGL ES封装为简洁的Objective-C或Swift接口,可以用来给图像、实时相机视频、电影等添加滤镜。 二、使用 1.导入GPUImage两种方式 a.使用cocopods导入 platform :ios, '9.0' target 'GPUImageDemo' do pod 'GPUImage' end b.手动导入 (1).首先下...

阿福的专栏 4197

GPUImage解析

GPUImage解析(一) —— 基本概览(一)  刀客传奇 关注 2017.09.01 22:45* 字数 3673 阅读 826评论 0喜欢 6 版本记录 版本号 时间 V1.0 2017.09.01 前言 GPUImage是直接利用显卡实现视频或者图像处理的技术。 作者 先看一下GPUImage 下面给出该框架的地址。GPUImage - GitH...

流媒体巅峰之路 1408

GPUImage

概念:GPUImage是基于GUP图像和视频处理的开源iOS框架,支持多种图片处理滤镜,基于GPU的图像加速,所以支持照相机、摄像机的实时滤镜处理。 首先了解GPUImage的几个基本的概念: - input 输入源 - ouput 输出源 - filter 滤镜 处理流程:GPUImageFilter是GPUImage里面重要的一个类,GPUImageFilter和响应链的其他元素实现了...

qq_18951479的博客 2089

05 GUPImage混合模式滤镜的使用

前几天一直在研究GPUImage,忽然发现混合模式的滤镜没有使用方法,各种搜索后发现也只是对GPUImage的简单使用,甚至在GPUImage的GitHub上的Demo里面都没有找到这一部分的内容的介绍,花费了很大力气后终于琢磨出来一点用法,可以对两个视频添加滤镜,效果是讲两个视频集成为一个视频,同时显示,中间会有渐变或者高亮等滤镜效果

白鹤的博客 650

GPUImage 滤镜大全

共125个滤镜, 分为四类 1、Color adjustments: 31 filters, 颜色处理相关 2、Image processing: 40 filters, 图像处理相关. 3、Blending modes: 29 filters, 混合模式相关. 4、Visual effects: 25 filters, 视觉效果相关. 1 2 3 4 #import <Foundatio...

mazegong的博客 1750
上一篇: git ignore project.xcworkspace无效
下一篇: 利用AVMutableVideoComposition在特定时间添加水印
lvmaker
博客等级 码龄16年 118粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值