使用 UIImage imageNamed 方法渲染图块的性能问题

Posted

技术标签:

【中文标题】使用 UIImage imageNamed 方法渲染图块的性能问题【英文标题】:Performance issue rendering tiles with UIImage imageNamed method 【发布时间】:2011-04-20 02:27:47 【问题描述】:

我有 5 个图块。每个都是 16x16 像素,大小为 8kb。它们都是使用 imageNamed 加载的。例如,[UIImage imageNamed:@"dirt.png"]。它们在 init 中加载到 drawRect 之外。我有一个名为“map”的数组,它映射出这些瓷砖的去向。在 DrawRect 中,我有一段代码使用两个 for 循环来渲染舞台,如下所示。

tileNum = startPoint;
for(int i = 0; i< stageHeight; i++)
    for(int ii = 0; ii< stageWidth; ii++)
        if(map[tileNum] == 0)
            [dirt drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)];
        else if(map[tileNum] ==1)
            [tree1 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)];
        else if(map[tileNum] ==2)
            [tree2 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)];
        else if(map[tileNum] ==3)
            [tree3 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)];
        else if(map[tileNum] ==4)
            [tree4 drawInRect:CGRectMake(ii*tileSize, i*tileSize, tileSize, tileSize)];
        
        tileNum++;
    
    tileNum += (mapWidth - stageWidth);

模拟器中的一切都很棒,正是我想要的。但是当我在设备上(3GS)时,帧速率会慢到爬行(大约每秒 1 帧)。我怀疑这可能与使用 imageNamed 有关。或者仅仅是因为我渲染了太多的瓷砖? (在 16x16 时,我每帧渲染 600 个图块,但它们是很小的文件,并且 90% 的图块是“脏”图块)。如果是这样,创建简单的磁贴引擎的更好方法是什么?

这是我第一次尝试发布问题。感谢任何提供帮助的人。

【问题讨论】:

【参考方案1】:

对于此类工作,您最终可能会比单独的图像文件更幸运地使用纹理图集。很难准确地说出那里发布的代码量,但我猜你正在开发某种游戏,这意味着你可能想要使用 opengl 进行绘图。

我建议您以 Apple 的 OpenGL ES Programming Guide 为起点,尤其是 Texture Data 部分,当我开始深入研究 gamedev 时,它帮助了我很多。

【讨论】:

感谢大家的提醒。我会检查 OpenGL。您是否发现这是一个学习曲线? 我实际上在学校上过 OpenGL 课,所以从普通的 OpenGL 跳到 OpenGL ES 几乎没有学习曲线。查看GLTextureAtlas 以获得一个很棒的起点。

以上是关于使用 UIImage imageNamed 方法渲染图块的性能问题的主要内容,如果未能解决你的问题,请参考以下文章

UIImage 的 -imageNamed: 方法是不是适用于存储在“文档”中的图像文件?

UIImage imageName

ios8 UIImage imageNamed:崩溃

五种创建UIImage的类方法

UIImage + NSCache 与 [UIImage imageNamed:]

UIImage imageNamed 不使用 xcode 4.4 显示图像