0

我必须进行一些持续约 30 秒的复杂计算(解码一些键)。我添加并运行了简单的动画(在 lottie 但我认为没关系),这样用户就不需要不耐烦了。由于计算和处理器使用,我的动画步履蹒跚。

我尝试将 [动画播放] 方法放入主队列,但没有帮助。我可以以任何方式保证我的动画使用 10% 的处理器资源吗?或者减慢其他操作(以便不使用所有可用资源)?

项目示例:https ://github.com/Redysz/Lottie-Pi-Issue

在我的 iPhone SE 上启动后,“时钟”动画可能会在几个第一个电路的某个地方停止一段时间。

4

2 回答 2

2

这是你的问题:

for(int i = 0; i < 1000; i++) {
    [self performSelectorInBackground:@selector(someHardComputations) withObject:nil];
    [self performSelectorInBackground:@selector(someHardComputations) withObject:nil];
}

(虽然我意识到someHardComputations这只是一个示例,但我假设您的实际代码仍然使用performSelectorInBackground:.)

这会创建不合理数量的后台线程(2000)。它并没有让事情变得更快(你仍然只有一定数量的核心)。它只是极大地增加了线程争用并干扰了主线程。在现代程序中没有充分的理由使用performSelectorInBackground:.

GCD (dispatch_queue) 是你想要的工具。特别是,您希望将此工作放在具有 QoS 类 UTILITY(也称为 LOW 优先级)的队列上,这样它就不会与您的主队列竞争。

有关如何使用 GCD 的介绍,请参阅并发编程指南。我不能给你一个确切的解决方案,因为究竟如何实现这个在很大程度上取决于someHardComputations.

于 2017-11-28T14:41:10.147 回答
0

_animationSpeed = 0.5;我正在检查您的演示应用程序并解决您的问题,您应该对此代码或以下代码的 LOTAnimationView 库进行更改

更新删除您的 1000 次循环调用并使用计时器它工作得很好!

NSTimer *timer =  [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(someHardComputations) userInfo:nil repeats:YES];
[timer fire];


- (void)_commonInit {
   // _animationSpeed = 1;
   _animationSpeed = 0.7;
   _animationProgress = 0;
   _loopAnimation = NO;
   _autoReverseAnimation = NO;
   _playRangeEndFrame = nil;
   _playRangeStartFrame = nil;
   _playRangeEndProgress = 0;
   _playRangeStartProgress = 0;
} 
于 2017-11-28T09:52:43.483 回答