- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有几个过滤器——全部堆叠在一起——来处理图像,我使用 slider 来修改这些过滤器的设置。我遇到了一些内存限制,正在考虑使用 prepareForImageCapture
来提高内存和性能,但想知道在哪里/何时应用它?这仅适用于 iOS 7。
UIImage
创建一个 GPUImagePicture
GPUImageFilter
并将 GPUImagePicture
中的目标添加到 GPUImageFilter
GPUImageFilters
,通过 addTarget:
将它们全部链接起来GPUImageView
并以最后一个 GPUImageFilter
为目标GPUImagePicture
我应该在哪里调用 prepareForImageCapture
?我应该在每个 GPUImageFilter
上调用它吗?如果是,何时以什么顺序调用它?
最佳答案
在滤镜上使用时,-prepareForImageCapture
设置要通过纹理缓存访问的滤镜的渲染目标纹理。
这意味着当您在过滤器上调用它时,下次您使用 -imageFromCurrentlyProcessedOutput
或其中一种照片捕获方法时,您从该过滤器返回的 UIImage 将包含一个过滤器内部纹理的内存映射表示。这会将当时所需的内存减少一半,因为内存中只存在图像字节的一个副本,而不是 UIImage 和过滤器的支持纹理的单独副本。
但是,由于内存映射现在在 UIImage 和 GPUImageFilter 之间共享,过滤器会锁定在它渲染的最后一张图像上,直到提取的 UIImage 被释放。如果为新图像重新渲染过滤器,结果将覆盖 UIImage 中的字节。这就是默认情况下并非所有过滤器都启用的原因,因为人们可能会对这种行为感到困惑。
对于您在屏幕上显示的示例,您不需要为任何这些过滤器设置此项。它只影响您从中提取静止图像的过滤器。更好的方法是在链中的第一个过滤器上使用 -forceProcessingAtSize:
并使用目标 View 的尺寸(以像素为单位)作为强制大小。渲染您在最终 View 中看不到的额外像素是没有意义的,这将节省在内部表示此图像所需的内存。不过,在将最终处理后的图像捕获到磁盘之前强制将大小设置为 0,0,以使这些过滤器恢复到完整大小。
我正在对过滤器链进行长期改进,涉及缓存用于过滤器的帧缓冲区,以便它们可以重复使用。这将使您可以创建任意长的过滤器链,而不会造成额外的内存损失。不过,我无法保证什么时候可以正常工作。
关于ios - 在长过滤器链中何时何地使用 prepareForImageCapture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21029941/
我有使用 namespace 的代码,其中有一些,我的大脑有些困惑。 如果我有类似的东西: #include protected: vector mRegistryList; 编译器提示 v
是否有好的算法/分词器/正则表达式或其他一些技术可以检测用户输入的英语句子的哪一部分是“谁”、“什么”、“何时”和“哪里”? 理想情况下,它可以在 Elasticsearch 或 javascript
我因使用 uint 而不是 size_t 而受到很多批评,但每次我检查我正在使用的工具链时都会发现 size_t 被定义为一个 uint。 是否有任何编译器实现中 size_t 实际上不是 uint?
在使用 MongoDB 的应用程序中,何时/何地是进行关系数据库中迁移的数据库更改的最佳位置? 比如创建索引或者设置shard key应该如何管理?这段代码应该去哪里? 最佳答案 最好有意识地在 sh
我是一名优秀的程序员,十分优秀!