Existe uma maneira com melhor desempenho de animar uma sequência de imagens?
-
10-07-2019 - |
Pergunta
Temo que este seja um código maligno:
CGRect iRect = CGRectMake(0.0f, 0.0f, 320.0f, 400.0f);
UIImageView *imgView = [[UIImageView alloc] initWithFrame:iRect];
imgView.animationImages = [NSArray arrayWithObjects:
[UIImage imageNamed:@"b0001.png"],
[UIImage imageNamed:@"b0002.png"],
// 150 more
[UIImage imageNamed:@"b0152.png"],
nil];
Lembro-me um pouco daquela imagemNamed:é mau.Se eu fizer assim, e eu ter para fornecer objetos UIImage, esses objetos UIImage carregam imediatamente esses arquivos de imagem na memória, certo?E, além disso, todos esses 152 objetos UIImage pesados fazem uma grande pausa na memória porque são liberados automaticamente, não é?
Concluindo, usar essa técnica é uma droga.Não é?Não sei.No meu antigo iPod touch de primeira geração, isso parece funcionar sem atraso a 25 fps.Muito suave e agradável.A única coisa que temo é que alguns outros dispositivos possam pensar diferente sobre isso.Embora eu tenha o iPod touch programável mais fraco disponível.
De qualquer forma, alguém vê alguma possibilidade de melhoria aí?Ou não devo usar isso e usar setImage:do UIImageView em um algoritmo próprio que carregaria e definiria essas imagens com seletores atrasados usando aquela coisa robusta de imageWithContentsOfFile (pode ter um nome diferente), sem liberação automática?Talvez algum cara inteligente tenha escrito uma pequena biblioteca para vídeos de polegar de alto desempenho que consistem em sequências de imagens?
(não, o vídeo não é uma opção no iphone;os frameworks da Apple para isso suportam apenas tela cheia, e não sei de mais nada que possa fazer isso)
Solução
Eu evitaria tentar carregar tantas imagens em um array UIImageView.Uma pergunta semelhante foi perguntou aqui.O método de buffer que descrevo também deve se aplicar à sua situação.
Outras dicas
Você está certo sobre imageNamed ...você não deve usá-lo em muitos casos, pois ele armazena a imagem em cache internamente.Usar:
[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"image1" ofType:@"png"];
A única vez que você deseja usar imageNamed é quando
1) Você está reutilizando um ícone repetidamente (tableviews etc...)
2) Você não implementou seu próprio sistema de cache