目前我在计时器上有一个PNG动画,每隔0.01秒发射一次。但是,性能不是最佳的,动画明显很慢。我有超过2000张图片。有没有更好的方法来实现这一目标?我发布了类似于以下方法的内容。
timer_ = [NSTimer scheduledTimerWithTimeInterval:.01 target:self
selector:@selector(switchImage) userInfo:nil repeats:YES];
-(void)switchImage
{
p = [p stringByAppendingFormat:@"/Movie Clipping 1 000%i.png",i];
imageView_.image = [UIImage imageWithContentsOfFile:p];
i = i++;
}
答案 0 :(得分:7)
究竟是什么尺寸 (我的意思是KB以及确切的像素大小)是您的PNG?
我们已经做了很多相关的工作,并且可以毫不费力地播放动画片,大约500x500。所以我只是想知道,谢谢。
一个直接的问题是 你试图以100hz运行,每秒100次?!
这绝对不可能。没有任何东西以100 fps运行。 20fps是“非常平滑”,30fps是“令人难以置信的平滑”,40fps是“令人难以置信的人类视觉 - 研究水平如果能够实现平滑”并且无法达到100 fps。
这绝对与OpenGLES无关。
普通环境会很快为您加载帧。
首先回到30 fps (最多!)并丢弃每个第2和第3张图片,以便动画看起来一样。即,“i = i ++”在您的代码行中变为“i + = 3”。
这可能是破坏你努力的压倒性问题!
下一个问题!如果你按照这样的方式加载每个图像,你几乎肯定需要 动态释放它们 ,因为你选择了一对类似的行。 ..
[happy.image release];
happy.image = [[UIImage alloc] initWithContentsOfFile:
[[NSBundle mainBundle] pathForResource:@"blah" ofType:@"png"]];
如果你不那样做就行不了。
下一个问题!使用视频的想法并不好,但您可以使用日常动画图像吗?因此...
#define BI(X) [[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@X ofType:@"tif"]]
happyDays = [[NSArray alloc] initWithObjects:
BI("hh00"), BI("hh01"), BI("hh02"), BI("hh03"), BI("hh04"), BI("hh05"), BI("hh06"), BI("hh07"), BI("hh08"), BI("hh09"),
BI("hh10"), BI("hh11"), BI("hh12"), BI("hh13"), BI("hh14"), BI("hh15"), BI("hh16"), BI("hh17"), BI("hh18"), BI("hh19"), etc etc etc
nil];
animArea.animationImages = happyDays;
animArea.animationDuration = 2.88;
// that is overall seconds. hence: frames divided by about 30 or 20.
[animArea startAnimating];
对你的情况没有好处?
无论如何,总而言之,你的问题是100 fps。更改为20 fps,您将毫无困难。 并告诉我们精确的图像尺寸(kb / x.y)。
答案 1 :(得分:1)
管理fps CADisplayLink怎么样?
OpenGLES需要花时间将图像转换为纹理,纹理需要仔细的内存管理。当内存不足时,它会产生一个完整的白色纹理。
答案 2 :(得分:-1)
将动画编码为视频,然后播放视频。