【发布时间】:2010-08-26 14:56:40
【问题描述】:
我正在制作一个需要在屏幕上绘制多个图像的游戏。我为此使用的代码是:
- (void)drawRect:(CGRect)rect {
for (i=1;i<=totalImages;i++) {
if (imageExists[i]) {
[image drawAtPoint:CGPointmake(imageX[i],imageY[i])];
}
}
}
这个drawRect被一个函数调用:
-(void) gameLoop {
[self setNeedsDisplay];
}
并且游戏循环被计时器每秒调用 60 个计时器:
[NSTimer scheduledTimerWithTimerInterval:0.01666 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];
imageExists[]、imageX[] 和 imageY[] 是我在游戏代码中用来创建/删除和在屏幕上移动图像的数组。
我的问题是,当我有大约 40 张图像在移动时,帧速度几乎比只有 1 张图像时减半。我的游戏最多需要 88 张图片。 (这只发生在我在我的 iPod Touch 上测试它时,在模拟器中一切正常......)
我的问题是:为什么 drawrect 函数这么慢,还是 drawAtPoint?我该如何解决这个问题?我应该实际使用它来绘制图像,还是应该学习 OpenGL ES 来制作游戏?
【问题讨论】:
-
我不建议将其作为答案,因为我不知道效果,但是如果您改为使用 CALayers 作为精灵会发生什么。只需在 CALayers 上调用 -setContents ,然后通过 CGImage 设置它们的边界来初始化它们中的每一个。然后通过在图层上调用 -setPosition(或使用显式动画)为精灵设置动画。我建议这样做的原因是因为核心动画在 OpenGL 之上运行,而无需显式使用 OpenGL。我只是想知道它是否会给您带来更好的性能。
-
@Matt - 你应该把这个作为答案,因为它是解决他的性能问题的完美解决方案。
标签: iphone performance drawing quartz-graphics