gpt4 book ai didi

iphone - 动画数组加载缓慢。我怎样才能加快这个过程?

转载 作者:行者123 更新时间:2023-12-03 21:16:47 24 4
gpt4 key购买 nike

我们正在将大约 30 张完整的 320 x 480 图像加载到动画数组中。这些图像的大小非常小,每张图像大约 5 - 7Kb。问题是,当我们运行循环来填充图像数组时,在填充该数组时似乎会暂停整个应用程序。是否有一种方法可以在单独的线程中加载带有图像的可变数组,或者允许在不影响性能的情况下填充数组?谢谢

    NSMutableArray *totalAnimationImages  = [[NSMutableArray alloc] initWithCapacity:numOfImages];

for(int i = 1; i < numOfImages; i++) {
[totalAnimationImages addObject:[UIImage imageNamed:
[NSString stringWithFormat:@"%@%d.png", image, i]]];
}

annImage.animationImages = totalAnimationImages;
annImage.animationDuration = speed; //.4 second
annImage.animationRepeatCount = 1; //infinite loop

[annImage startAnimating]; //start the animation

[totalAnimationImages release];

在解决这个问题时,并使用 shabzco 提供的线程建议,我提出了以下代码来处理循环,更改 ImageView 中的图像,这似乎绝对不会影响性能。它一次只保存一张图像,而不是 NSMutableArray 中的 30 张图像。正如理查德·J·罗斯三世所说,一旦动画开始,它就会将所有图像处理为“内存中位图格式”。这就是漫长的等待/滞后的来源。在下面的代码中,每次图像更新仅发生一次,而不是仅仅为了启动动画而发生 30 次。我在建议的调度线程中使用带有计时器的 while 循环,以防止该计时器影响主线程,从而可能在动画期间产生不稳定的性能。请提供有关此解决方案的反馈!谢谢

更新:Shabzco 建议我将“ImageNamed”替换为“imageWithContentsOfFile”,以避免由于 ImageNamed 可能在内存中缓存图像而导致奇怪的内存泄漏。这是在运行 xcode profiler 并观察“真实内存”计数器后发现的。很明显,每次运行动画时,实际内存都会增加越来越多,直到最终应用程序崩溃。将“ImageNamed”替换为“imageWithContentsOfFile”后,问题就消失了。我更新了以下代码。

annImage.image = [UIImage imageNamed:@""];
[annImage setAlpha:1.0];
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
NSTimeInterval timeout = 1.00 / speed; // Number of seconds before giving up
NSTimeInterval idle = 1.00 / 8; // Number of seconds to pause within loop
BOOL timedOut = NO;
NSDate *timeoutDate;
for(int i = 1; i < numOfImages; i++) {
timeoutDate = [[NSDate alloc] initWithTimeIntervalSinceNow:timeout];
timedOut = NO;
while (!timedOut)
{
NSDate *tick = [[NSDate alloc] initWithTimeIntervalSinceNow:idle];
[[NSRunLoop currentRunLoop] runUntilDate:tick];
timedOut = ([tick compare:timeoutDate] == NSOrderedDescending);
[tick release];
}
dispatch_async(dispatch_get_main_queue(), ^{
//annImage.image = [UIImage imageNamed:
// [NSString stringWithFormat:@"%@%d.png", image, i]];
NSString *filePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@%d", image, i] ofType:@"png"];
annImage.image = [UIImage imageWithContentsOfFile:filePath];
});
}

dispatch_async(dispatch_get_main_queue(), ^{
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.3];
[annImage setAlpha:0.0];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
[UIView commitAnimations];

});
});

最佳答案

这将使您的 for 循环发生在不同的线程中,并在加载所有内容后开始动画。

@autoreleasepool {
NSMutableArray *totalAnimationImages = [[NSMutableArray alloc] initWithCapacity:numOfImages];
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(concurrentQueue, ^{
for(int i = 1; i < numOfImages; i++) {
[totalAnimationImages addObject:[UIImage imageNamed:
[NSString stringWithFormat:@"%@%d.png", image, i]]];
}
annImage.animationImages = totalAnimationImages;
annImage.animationDuration = speed; //.4 second
annImage.animationRepeatCount = 1; //infinite loop
[annImage startAnimating]; //start the animation
dispatch_async(dispatch_get_main_queue(), ^{

[totalAnimationImages release];

});
});
}

关于iphone - 动画数组加载缓慢。我怎样才能加快这个过程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11364381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com