【问题标题】:Why do I get poor performance when rendering different images with UIImage on iPhone为什么在 iPhone 上使用 UIImage 渲染不同图像时性能不佳
【发布时间】:2009-04-13 15:53:01
【问题描述】:

我正在使用 UIImage 从 32x32 块渲染游戏地图。代码如下

for( int x = 0; x < rwidth; ++x)
{
    for(int y = 0; y < rheight; ++y)
    {
        int bindex = [current_map GetTileIndex:x :y];
        CGPoint p;
        p.x = x * tile_size_x;
        p.y = y * tile_size_x;
        [img_list[bindex] drawAtPoint:p];
    }
}

这最终会渲染大约 150 个图块。我的问题是当我运行这段代码时,我的渲染时间会下降到每秒 2-3 帧。

我认为 iPhone 是填充绑定的,但是如果我强制 bindex = 1(即渲染同一块 150 次),那么我会得到全帧率。

我不敢相信从不同的 UIImage 进行渲染会如此昂贵。

谁能告诉我我做错了什么...

哦,我忘了提及我使用 CGImageCreateWithImageInRect 从更大的纹理页面创建的图像列表。

谢谢 丰富

【问题讨论】:

  • img_list 中的每个索引是否引用从不同文件加载的不同纹理/图像?
  • 哦,我忘了提到我的图像列表是使用 CGImageCreateWithImageInRect 从更大的纹理页面创建的。
  • 很抱歉回答你的问题,没有。
  • 这可能是一个愚蠢的问题,但是您的 GetTileIndex 函数做了多少工作?
  • return map_index[map_width * y + x];

标签: iphone performance uiimage render


【解决方案1】:

破解打开 Instruments 并分析您的代码。看起来您正在绘制 UIView,并且它们并没有真正针对游戏进行优化。由于 UIView 是支持层的,因此 drawAtPoint: 需要在图像出现在屏幕上之前多次绘制图像(到屏幕外缓冲区)。

话虽如此,UIImage 并不是真正为游戏设计的。作为 UIKit 的一部分有很多开销。你并不是真的要拥有数百个。

按大约速度顺序(从最慢到最快):

  • UIImage(通常在您有几张大图时使用)
  • CALayers(如果您需要精细的动画控制或者您有大约 20 到 100 个图块/图像)
  • OpelGL 纹理(大多数游戏应该使用的)

【讨论】:

  • 谢谢,我打算直接去 opengl,但是文档一直在说服我 CGDrawImage 是高度优化的。因为我只需要一个平铺的背景,所以我认为这已经足够了......猜不出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-25
  • 2013-06-06
  • 2019-04-29
相关资源
最近更新 更多