美文网首页
GPUImage recalculateViewGeometry

GPUImage recalculateViewGeometry

作者: 那月无痕 | 来源:发表于2021-01-13 18:47 被阅读0次

原因:
更新xocde11.4之后发现GPUImage视频画面渲染特别慢,并且控制台输出如下信息:

Main Thread Checker: UI API called on a background thread: -[UIView bounds]
PID: 7360, TID: 1812926, Thread name: (none), Queue name: com.sunsetlakesoftware.GPUImage.openGLESContextQueue, QoS: 0
Backtrace:
4   KXLive                              0x0000000100e12e60 __39-[GPUImageView recalculateViewGeometry]_block_invoke + 52
5   KXLive                              0x0000000100dec788 runSynchronouslyOnVideoProcessingQueue + 108
6   KXLive                              0x0000000100e12e0c -[GPUImageView recalculateViewGeometry] + 108
7   KXLive                              0x0000000100e13804 __37-[GPUImageView setInputSize:atIndex:]_block_invoke + 312
8   KXLive                              0x0000000100dec788 runSynchronouslyOnVideoProcessingQueue + 108
9   KXLive                              0x0000000100e136ac -[GPUImageView setInputSize:atIndex:] + 136
10  KXLive                              0x0000000100e0ee38 -[GPUImageVideoCamera updateTargetsForVideoCameraUsingCacheTextureAtWidth:height:time:] + 660
11  KXLive                              0x0000000100e0fb48 -[GPUImageVideoCamera processVideoSampleBuffer:] + 2120
12  KXLive                              0x0000000100e106c4 __74-[GPUImageVideoCamera captureOutput:didOutputSampleBuffer:fromConnection:]_block_invoke + 180
13  libdispatch.dylib                   0x0000000105e5d260 _dispatch_call_block_and_release + 24
14  libdispatch.dylib                   0x0000000105e5d220 _dispatch_client_callout + 16
15  libdispatch.dylib                   0x0000000105e6be80 _dispatch_queue_serial_drain + 768
16  libdispatch.dylib                   0x0000000105e60730 _dispatch_queue_invoke + 328
17  libdispatch.dylib                   0x0000000105e6cdd8 _dispatch_root_queue_drain_deferred_wlh + 352
18  libdispatch.dylib                   0x0000000105e73ebc _dispatch_workloop_worker_thread + 676
19  libsystem_pthread.dylib             0x0000000181e6fe70 _pthread_wqthread + 860
20  libsystem_pthread.dylib             0x0000000181e6fb08 start_wqthread + 4

意思是在子线程中UIView对象调用了bounds ,导致视频画面迟迟渲染不出来。
查找发现GPUImageView的视频渲染类的

(void)recalculateViewGeometry;

方法中有两处调用了bounds。
解决办法:
在GPUImageView中声明一个属性viewBounds来保存view的bounds值,在- (void)layoutSubviews方法中给viewBounds赋值,用viewBounds代替bounds就可以了,此时可以很快的调起摄像头并且渲染出画面。

- (void)layoutSubviews {
    [super layoutSubviews];
    self.viewBounds = self.bounds;
    // The frame buffer needs to be trashed and re-created when the view size changes.
    if (!CGSizeEqualToSize(self.bounds.size, boundsSizeAtFrameBufferEpoch) &&
        !CGSizeEqualToSize(self.bounds.size, CGSizeZero)) {
        runSynchronouslyOnVideoProcessingQueue(^{
            [self destroyDisplayFramebuffer];
            [self createDisplayFramebuffer];
            [self recalculateViewGeometry];
        });
    }
}

- (void)recalculateViewGeometry;
{
    runSynchronouslyOnVideoProcessingQueue(^{
        CGFloat heightScaling, widthScaling;
        
        CGSize currentViewSize = self.viewBounds.size;
        
        //    CGFloat imageAspectRatio = inputImageSize.width / inputImageSize.height;
        //    CGFloat viewAspectRatio = currentViewSize.width / currentViewSize.height;
        
        CGRect insetRect = AVMakeRectWithAspectRatioInsideRect(inputImageSize, self.viewBounds);

在xcode11和iOS13开始,系统对在子线程中做UI操作要求更加严格。千万不要在子线程中使用与UI相关的代码

相关文章

  • GPUImage recalculateViewGeometry

    原因:更新xocde11.4之后发现GPUImage视频画面渲染特别慢,并且控制台输出如下信息: 意思是在子线程中...

  • GPUImage2 的导入

    首先,GPUImage有3个版本分别是:GPUImage,GPUImage2,GPUImage3 GPUImage...

  • GPUImage概览

    读GPUImage源码,深入了解GPUImage原理及OpenGL ES。 关于GPUImage GPUImage...

  • GPUImage 解析

    GPUImage解析(一) —— 基本概览(一)GPUImage解析(二) —— 基本概览(二)GPUImage解...

  • GPUImage架构-思维导图

    GPUImage架构 参考文章: GPUImage架构

  • 视频滤镜

    GPUImage原生美颜 GPUImage原生美颜 步骤一:使用Cocoapods导入GPUImage步骤二:创建...

  • iOS GPUImage blog收集

    iOS GPUImage blog收集 GPUImage详解(简书博客) GPUImage(五):五种类型输入源(...

  • GPUImage(四):GPUImageFramebuffer

    GPUImage概览GPUImage(一):视频采集GPUImageVideoCameraGPUImage(二):...

  • iOS-DIY美颜相机

    本例是使用GPUImage开源框架,生成美颜相机。实时采集画面,进行美颜。 GPUImage GPUImage是开...

  • GPUImage源码分析与使用(一)

    GPUImage简介 GPUImage是链式编程,可以处理图片和视频,支持iOS和Mac。 GPUImage1.0...

网友评论

      本文标题:GPUImage recalculateViewGeometry

      本文链接:https://www.haomeiwen.com/subject/turpaktx.html