3

我正在通过网络从相机 (MJPEG) 接收一系列 JPEG。我在 UIView 中收到图像时显示它们。我看到的是我的应用程序在我看来是 UIView 更新中花费了 50% 的 CPU(设备和模拟器测试)。

是否有一种 CPU 密集度较低的方式来进行此屏幕更新?在将 JPEG 交给 UIView 之前,我应该以某种方式处理它吗?接收方式:

UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(),^{
    [cameraView updateVideoImage:image];
});

更新方法:

- (void) updateVideoImage:(UIImage*)image {
    myUIView.image = image;
    ...

在此处输入图像描述

更新:添加了更好的屏幕截图

update2:OpenGL 是否会为 JPEG 提供更快的渲染表面?我不清楚 Instruments 的时间花在哪里,渲染或解码。我将按照建议整理一个测试用例并从那里开始工作。

4

1 回答 1

1

iOS 针对 PNG 图像进行了优化。虽然 JPEG 大大减小了传输图像的大小,但它是一种复杂得多的格式,因此这种渲染花费大量时间并不让我感到惊讶。人们说设备上有 jpeg 硬件辅助,但我不确定,即使它在那里,它也可能针对某些图像类型进行了调整。

所以 - 一些建议。设计一个测试,在其中获取您现在拥有的一个 jpeg,并将其渲染到上下文中,这次是基线。拍摄相同的图像并在预览中打开它,然后将其以稍微不同的质量值保存到另一个文件中,然后尝试(预览将从图像中去除不必要的“垃圾”,甚至先将其转换为 png 然后再转换回一个 jpeg。这里的想法是使用预览中的图像输出,这将是一个干净的图像,你将获得。图像更好吗?

您也可以尝试使用 libjpegturbo,看看它是否可以更快地渲染您的图像。您可以在 github 项目 PhotoScrollerNetwork 中看到该库的运行情况。您可能会发现使用该项目,因为它在接收到 jpeg(使用该库)时实时解码它们,然后使用 CATiledLayers 支持可缩放查看。

于 2012-08-07T12:45:19.633 回答