Vaz*_*zyb 8 iphone cocoa-touch objective-c uikit uiview
这不是一个关于解决特定问题的问题,而是更多要求指向正确方向的问题.
我正在制作一个应用程序,我同时将几个图像(保存为JPG)加载到屏幕上,这必须是它的方式,我无法卸载其中任何一个因为它们都被立即显示.
我尝试以大约800px*600px的分辨率天真地加载30张图像,认为它只将图片的"压缩"大小加载到内存中(大约200 KB) - 所以总共6 MB?当然,后来有几次记忆警告,我意识到我是多么愚蠢.所以我现在将它们的大小调整到大约400px*300px,而我的iPhone 4S只是为了应对内存需求.
我最初使用的是UiView,在drawRect中我绘制了一个自定义绘制的图像,但转换到使用UIImageView显着改善了这种情况.该应用程序更快,响应更快.我还发现在我的图层中关闭光栅化会对性能产生巨大影响.
这些"发现"需要花费数小时才能完成,而我想知道的是,是否有特定的设计模式或资源可用于尽可能高效地将图像加载到屏幕上; 主要是关于使用尽可能少的内存 - 是否有良好的经验法则?为什么使用UIImageView vs UiView w/image会产生这样的差异?
如果有人可以提供帮助,我将非常感激.
谢谢.
Lil*_*ard 10
实现-drawRect:会导致系统分配与视图大小相同的位图图像(毕竟,您需要一个缓冲区来绘制).如果你所做的只是绘制一个你已经加载的图像,那么你一下子就将该图像的内存使用量增加了一倍(因为你有你加载的副本,你刚刚绘制的第二个副本).
类似地,栅格化图层需要分配与图层大小相同的位图图像,因此它具有栅格化的缓冲区.所以转过来也会吸收内存(与图层的大小成比例).
基本的经验法则是,不要做额外的工作.使用-drawRect:绘制的图像是额外的工作.栅格化图层是额外的工作(但是,取决于图层是什么,这可能是一次性成本(和恒定的内存成本),以便以后节省性能,例如,如果它是a CAShapeLayer或者它是否绘制阴影) .将大图像保存在内存中,在渲染到屏幕之前始终按比例缩小是额外的工作(只需在加载图像时将其缩小一次,并保持缩放的副本).
要记住的另一件事是,如果你的目标是绘制图像,你应该尝试使用,UIImageView如果你可能的话.它通常是将图像输入屏幕的最快和最便宜的方式,而且它相当灵活.
设计模式基本上是使用UIImageView.Apple已经花了很多时间快速完成它,并允许Apple使用您不是的私有API.
也就是说,如果你想自己做,你应该尝试CALayer每个图像使用一个.您只需加载图像并将其设置为a的content属性CALayer.该CALayer可以缓存在GPU内存的内容,并可以做其他的优化,你不能公开的API做.
通过观看Apple的开发视频,您可以了解很多关于快速创建UI的知识.它们包含许多提示和"内部信息",这些提示和内部信息不在书面文档中,或者在文档中很难找到/容易忽略.开发视频在这里:http://developer.apple.com/videos/.与您的问题相关的一些好的:
| 归档时间: |
|
| 查看次数: |
3832 次 |
| 最近记录: |