使用 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: 方法是不是适用于存储在“文档”中的图像文件?