亮度控制滑块在iOS中的响应速度非常慢



我真的需要帮助。

我正在创建简单的图像处理应用程序,从相机胶卷加载图像或拍照。我有一个亮度控件(滑块(,可以调整图像的亮度。问题是滑块在模拟器上实时工作,但在 ipad 上响应有小延迟。我已经尝试了所有方法,但似乎没有任何运气。

请帮忙。我见过其他应用程序,其中滑块可以顺利运行,没有任何延迟。我做错了什么?

谢谢

我将

对最初问题中遗漏的一些事情进行猜测。

1(澄清一下,问题是:滑块的运动不顺畅。2( 此外,由于此 UI 粗糙度或与这种 UI 粗糙度结合使用,图像更改存在延迟。

我不确定你的实现是什么样的,但是,听起来你在主线程上做了太多的工作和/或太多。

因此,以下是正常运行的实现可能执行的操作:

- (void)sliderChanged:(UISlider *)sender
{
    [self adjustImageBrightnessWithValue:sender.value;
}
- (void)adjustImageBrightnessWithValue:(CGFloat)value
{
    [self cancelCurrentWork]; // Maintain a reference to an operation and cancel it
    [self adjustImageBrightnessAsyncWithValue:(CGFloat)value originalImage:self.imageView.image completion:^(UIImage *finalImage)
    {
        self.imageView.image = finalImage;
    }
}

adjustImageBrightnessAsyncWithValue 采用一个值、原始图像和完成块。 它创建一个操作(通过 NSOperation 或 NSOperationQueue,可能两者兼而有之(并跟踪该操作。 该操作将算法应用于背景中的原始图像。 完成后,完成块会在主线程上设置图像视图中的最终图像。

主线程上发生的唯一事情是:获取滑块更改回调、取消以前的工作、开始新工作以及设置最终图像。 其他一切都应该在后台进行。 取消工作是对以下情况的优化:用户移动滑块的速度太快,以至于在值再次更改之前无法修改图像。 一旦滑块没有更改足够长的时间来进行修改,结果将可见。 滑块应始终平滑,因为没有任何东西阻塞主线程。

编辑

使用操作队列...声明一个成员变量:

NSOperationQueue *m_queue;

在 init 方法中初始化它:

m_queue = [NSOperationQueue new];
m_queue.maxConcurrentOperationCount = 1; // So it only does one brightness calculation at a time and there are no concurrency issues.

- (void)adjustImageBrightnessWithValue:(CGFloat)value
{
    [m_queue cancelAllOperations];
    [m_queue addOperationWithBlock:^
    {
        UIImage *adjustedImage = [mainimage brightness:value]; // Not sure where this method is coming from, but this code assumes it returns a copy of mainimage with the brightness adjusted.
        dispatch_async(dispatch_get_main_queue(), ^
        {
            imageview.image = adjustedImage;
        });
    }];
}
另外,顺便说一句,

你可以看看GPUImage,在这里讨论:http://nshipster.com/gpuimage/许多快速,强大的图像修改技术/API。

使用

slider.isContinuous = false

这样就能解决问题。

最新更新