CGContextDrawImage 性能不佳,因为它调用了可疑的调试函数

Posted

技术标签:

【中文标题】CGContextDrawImage 性能不佳,因为它调用了可疑的调试函数【英文标题】:Bad performance of GCContextDrawImage due to it calling suspicious debug functions 【发布时间】:2019-10-11 11:16:17 【问题描述】:

调用GCContextDrawImage 成为我的 Mac OS X 应用程序的瓶颈,尤其是在视网膜屏幕上。我设法通过Avoiding colorspace transformations when blitting, Mac OS X 10.11 SDK 稍微缓解了它,但它似乎仍然比我预期的要慢。

在使用 Instruments 调查堆栈转储时,我注意到在两个名称高度可疑的函数上花费了大量时间,vImageDebug_CheckDestBuffer 正在调用 _ERROR_Buffer_Write__Too_Small_For_Arguments_To_vImage__CheckBacktrace。请参阅下面的完整堆栈转储。

在我看来,这像是某种调试断言?我是否在没有意识到的情况下运行 vImage 库的调试版本?我可以做些什么来阻止这些功能占用我所有宝贵的周期吗?

【问题讨论】:

如果我没记错的话,这些函数只是触摸图像的第一个和最后一个字节以确保它在那里,所以应该不会花费太多时间。这个想法是,如果缓冲区丢失或太小,它将在一个命名良好的函数中崩溃,指出您的错误。它出现在探查器中表明探查器对回溯深感困惑,或者对缓冲区有些不满意。缓存被禁止?已退出? 【参考方案1】:

通过确保源位图的每条扫描线中的像素数据的开头与 16 字节对齐,解决了性能问题。这样做似乎会使图像绘制相当更快。如果您分配新图像,默认情况下可能会发生这种情况,但我们将 CGImage 包裹在未对齐的现有像素缓冲区周围。

【讨论】:

VImageBuffer_Init 会做这种对齐。它还尝试调整大小以避免连续行的错误别名停止。【参考方案2】:

图形上下文(第一个参数)呢?你从其他线程传递它吗?如果你将在主线程中获取上下文,然后在主线程中绘制图像怎么办?

【讨论】:

以上是关于CGContextDrawImage 性能不佳,因为它调用了可疑的调试函数的主要内容,如果未能解决你的问题,请参考以下文章

巨大的内存峰值 - CGContextDrawImage

CGContextDrawImage 画大图很模糊

Swift 3 和 CGContextDrawImage

-[UIImage drawInRect:] / CGContextDrawImage() 不释放内存?

CGContextDrawImage 的优化替代方案

CGContextDrawImage 崩溃