- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,我正在研究GPUImage的源代码,以提高我的OpenGL ES技能。当我阅读GPUImageContext
类的代码时,我发现它存储了对queue
的引用,该引用已在库的其他部分中使用。
例如,在GPUImageView.m
中,队列在commonInit
中与runSynchronouslyOnVideoProcessingQueue
一起使用,以执行与上下文不直接相关的某些操作(例如向着色器添加属性)。
我的问题是,为什么开发人员决定在“辅助”队列上执行这些操作,将这个队列存储到GPUImageContext
这样的类中的好处是什么。
我知道这个问题与GPUImage框架严格相关,但是我认为这可能是一个很好的机会,可以了解像Brad Larson这样的熟练开发人员如何决定构建iOS中最著名的图像处理库之一。
P.s.
我希望我不要因为好奇而冒犯作者。
最佳答案
这样做的原因是为了提供一定程度的线程安全性。一次只能从一个线程安全地访问OpenGL ES上下文。为此,我使用了与OpenGL ES上下文相关联的串行调度队列,并调度了与该队列上的上下文相关的所有事件。
使用串行调度队列是确保一次只接触一件事的有效方法。它避免了昂贵的锁带来的开销,并使在非主线程上执行处理操作变得容易。
您可以选择仅在主线程上执行所有这些操作,这是我最初所做的,但是这样做有一些缺点。缓慢的处理可能会阻塞UI。在后台线程上执行OpenGL ES渲染具有显着的性能优势,范围甚至从单核设备提高了10%,到多核iOS硬件提高了40%以上。您还可以防止使用该框架的开发人员从非主线程访问该实例的情况。
关于ios - GPUImage:EAGLContext和线程队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18687656/
我想在并发 GCD 队列中的 OpenGL ES 项目中做一些工作。是否可以为每个线程创建 EAGLContext?我打算用这样的方式来做: queue_ = dispatch_queue_creat
我想将图像实时添加到摄像机视频源中,但只需要显示它们,不需要保存。如果我使用标准的 Core Image 程序,它工作正常,但我需要更多的帧速率。但是,如果我取消注释此代码并在接下来进行注释,则不会。
我正在将我的游戏引擎移植到 iOS 并在我的 [EAGLContext presentRenderbuffer:] 调用中遇到异常。我的引擎将所有渲染代码放在与主线程不同的线程上;引擎通过在主线程上创
我在我的 IOS 应用程序中使用 openGLES。在某些情况下会发生死锁。死锁的线程如下。看来 EAGLContext PresentRenderbuffer 导致同步队列中的 semaphore:
我正在编写一些具有 GridView 的代码(屏幕上同时显示约 20 个 subview )。每个 subview 在 GL 中绘制其内容,并有自己的绘制线程和 EAGLContext。 这样做的好处
我想为我的应用程序使用 native 过滤器,该功能有效,但我想避免将从文档中删除的方法。我在整个互联网上搜索,没有解决方案。 我搜索了整个互联网,但没有找到解决我问题的方法。 public func
Khronos 的一般 OpenGL-ES 2.0 文档似乎不完整,至少在 iOS 实现方面 https://www.khronos.org/registry/OpenGL-Refpages/es2.
EAGLContext 中的“EA”代表什么? CAEAGLLayer 中的“EA”是否也一样? 最佳答案 EAGL(嵌入式 Apple 图形库)是 Apple 对 EGL API 的实现。 EA =
我正在尝试了解 iPhone 操作系统上的 OpenGL 对象模型。我当前正在屏幕上渲染到几个不同的 UIView(基于 CAEAGLayer 构建)。我目前将其中每一个都使用单独的 EAGLCont
我正在使用 OpenTok(TokBox) 使用此演示开发实时视频通话应用程序:https://github.com/opentok/opentok-ios-sdk-samples/tree/deve
我在 iOS 11 上的 EAGLContext presentRenderbuffer 中遇到了很多崩溃,但仅限于 iPhone 6/6+ 和 旧。 根据 this post ,我认为我们已经通过重
我正在尝试使用 FFMPEG 创建一个播放器,该播放器可以使用 OpenGL 显示帧。 player类有三个线程:一个用于渲染(运行一个 runloop 并处理每 N 毫秒触发的渲染事件。) - 它获
我正在使用 iPhone 上的后置摄像头使用 AVCaptureSession 捕获实时视频,使用 CoreImage 应用一些过滤器,然后尝试使用 OpenGL ES 输出生成的视频。大部分代码来自
我想更好地了解 iOS 下 OpenGL ES 帧缓冲区、渲染缓冲区等的创建、分配和绑定(bind)。我知道 EAGLContext 和 EAGLSharegroup 类通常管理此类对象的分配和绑定(
如果我像这样初始化 EAGLContext _eaglContext = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] 程序
我正在开发 iOS openGL ES 应用程序。 我正在做通常的 EAGLView/ES2Render 事情。 在启动时,frambuffer 创建成功,使用以下代码: - (BOOL) creat
我有一个简单的 Swift 命令行 MacOS 应用程序,我正在努力设置 EAGLContext: let openGLContext = EAGLContext(API: .OpenGLES3) l
当我设置 GLKViewController/GLKView 以使用 CoreImage 进行绘图时,有时会在标题中收到通知。 设置如下所示: _context = [[EAGLContext all
我们正在从带有注释的 map View 开始开发 iPad 应用程序。 当我们切换到另一个具有基于 opengl 的图表解决方案 (shinobi) 的 View 时,通过使用 Storyboard。
我们有一个使用 OpenGL 和 MKMapView 的应用程序。当我们切换到 iOS 6 时,每当我们在设置我们自己的 EAGLContext 后尝试显示 map 时,它开始在 [EAGLConte
我是一名优秀的程序员,十分优秀!