问题详情
GPUImage2.0 录制视频启动时卡顿很久的问题
自己想做一个录制视频的 demo, 顺便学习使用一下 GPUImage 这个传说中的🐮框架, 但是正在写好界面, 开始测试的时候, 发现录制视频启动时卡顿一会儿, 画面和 UI 才出来, 经过查找, 发现控制台输出有一个子线程操作 UI 的问题, 根据经验这个是会造成卡顿的.
- 控制台输出如下:
根据 Xcode 的提示, 就找到了子线程操作 UI 的代码位置. 很明显就只有 self.layer 这个代码涉及 UI, RenderView 的实例就是视频渲染的 view, 那么问题大概是清楚了. 接着就想办法解决吧, 先把这个问题解决掉, 再看看情况如何.
sharedImageProcessingContext.context.renderbufferStorage(Int(GL_RENDERBUFFER), from:self.layer as! CAEAGLLayer)
解决方案
其实一开始也并不确定怎么修改, 试过把这行代码放到主线程去执行, 结果是直接崩溃. 我就不展示过程了. 最后去官网查 issues, 上网查资料, 都没有结果.
但是有一个 OC 版的类似问题, 也就是 1.0 版本, 用一个临时变量记录自己 bounds. 使用这个临时变量就没有问题. 所以我也就模仿着试了一下;
用一个新的属性 tmpLayer 记录自己的 layer, 然后用的时候使用 tmpLayer, 代码修改如下:
// 临时属性声明
var tmpLayer: CAEAGLLayer!
// 具体调用位置
sharedImageProcessingContext.context.renderbufferStorage(Int(GL_RENDERBUFFER), from:tmpLayer)
项目运行起来启动时候不会卡顿很久了, 但是看实际效果, 还是卡了一下下, 就是闪一下, 应该是还有其他问题需要优化. 至于为会什么能解决, 我也不是很清楚, 按道理 layer 也是 class 类型, tmpLayer 还是指向自己 layer, 难道只是骗过编译器, 如果你知道怎么回事, 请一定要留言, 感谢了.
- 子线程操作UI输出没有了
注意: 我在测试的过程中有崩溃过一次, 不知道是什么原因. 也可能是这种方案不彻底, 也有可能是还有其他问题. 本文只供学习参考.