Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iPhone编程太慢了_Iphone_Performance_Drawing_Quartz Graphics - Fatal编程技术网

iPhone编程太慢了

iPhone编程太慢了,iphone,performance,drawing,quartz-graphics,Iphone,Performance,Drawing,Quartz Graphics,我正在制作一个需要在屏幕上绘制多个图像的游戏。我使用的代码是: - (void)drawRect:(CGRect)rect { for (i=1;i<=totalImages;i++) { if (imageExists[i]) { [image drawAtPoint:CGPointmake(imageX[i],imageY[i])]; } } } 游戏循环被计时器称为每秒60个计时器: [NSTimer schedule

我正在制作一个需要在屏幕上绘制多个图像的游戏。我使用的代码是:

- (void)drawRect:(CGRect)rect {
   for (i=1;i<=totalImages;i++) {
       if (imageExists[i]) {
           [image drawAtPoint:CGPointmake(imageX[i],imageY[i])];
       }
   }
} 
游戏循环被计时器称为每秒60个计时器:

[NSTimer scheduledTimerWithTimerInterval:0.01666 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];
imageExists[]、imageX[]和imageY[]是我在游戏代码中用于在屏幕上创建/删除和移动图像的数组

我的问题是,当我有大约40幅图像在帧间移动时,速度几乎比只有一幅图像时降低了一半。我的游戏最多需要88张图像(只有在我的iPodtouch上测试时才会出现这种情况,在模拟器中一切正常…)


我的问题是:为什么drawrect函数那么慢,还是drawAtPoint?我怎样才能解决这个问题?我真的应该用它来绘制图像,还是应该学习OpenGL ES来制作游戏?

我的建议是研究一个游戏库,它可以在幕后为您处理大部分OpenGL内容。与Quartz和CoreAnimation相比,它将在典型游戏功能中获得更高的性能,并包括用于集成游戏交互的物理和声音库


为2D游戏编写OpenGL的首要任务是更好地管理进入视频内存的内容,而不是留在RAM中的内容,这在将精灵快速移动到屏幕上的正确位置时非常重要。

我的建议是查看一个像这样的游戏库,它在幕后为您处理大部分OpenGL内容。与Quartz和CoreAnimation相比,它将在典型游戏功能中获得更高的性能,并包括用于集成游戏交互的物理和声音库

对于2D游戏来说,写入OpenGL的首要任务是更好地管理进入视频内存的内容,而不是内存中的内容,这在将精灵快速移动到屏幕上的正确位置时非常重要。

有几件事:

  • 不要使用计时器。使用CADisplayLink。它就像一个计时器,只是它在vsync上启动。看看苹果的医生

  • 是的,你肯定想走OpenGL的路。这里的问题是,在每一帧重绘时,您将40多个纹理从CPU推送到GPU。在OpenGL中,您可以一次推送所有纹理,然后告诉GPU“移动”它们。这样会更有效率。(即稳定的60fps,CPU使用率非常低)

    • 有几件事:

      • 不要使用计时器。使用CADisplayLink。它就像一个计时器,只是它在vsync上启动。看看苹果的医生

      • 是的,你肯定想走OpenGL的路。这里的问题是,在每一帧重绘时,您将40多个纹理从CPU推送到GPU。在OpenGL中,您可以一次推送所有纹理,然后告诉GPU“移动”它们。这样会更有效率。(即稳定的60fps,CPU使用率非常低)


      我不打算将此作为答案,因为我不知道效果如何,但如果您改用CALayers作为精灵,会发生什么。只需在Calayer上调用-setContents,然后设置它们的边界并传递一个CGImage来初始化它们中的每一个。然后通过在层上调用-setPosition(或使用显式动画)来设置精灵的动画。我建议这样做的原因是,核心动画运行在OpenGL之上,而不必显式使用OpenGL。我只是想知道这是否会给你带来更好的性能。@Matt-你应该回答这个问题,因为这是解决他性能问题的一个非常有效的解决方案。我不打算建议你回答这个问题,因为我不知道效果如何,但是如果你改用CALayers作为你的精灵会发生什么。只需在Calayer上调用-setContents,然后设置它们的边界并传递一个CGImage来初始化它们中的每一个。然后通过在层上调用-setPosition(或使用显式动画)来设置精灵的动画。我建议这样做的原因是,核心动画运行在OpenGL之上,而不必显式使用OpenGL。我只是想知道它是否会给你带来更好的性能。@Matt-你应该回答这个问题,因为这是解决他性能问题的一个非常有效的方法。我会研究Cocos2d iPhone谢谢^^我会研究Cocos2d iPhone谢谢^^
      [NSTimer scheduledTimerWithTimerInterval:0.01666 target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];