Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 clipsToBounds=YES是否会减少我的内存占用?_Iphone - Fatal编程技术网

Iphone clipsToBounds=YES是否会减少我的内存占用?

Iphone clipsToBounds=YES是否会减少我的内存占用?,iphone,Iphone,我有一个相当大的视野,大概是1000 x 1000。所以我做了clipToBounds=是的。这会为视图生成更小的位图吗?我不这么认为clipstobunds指的是子视图,而不是视图本身。UIView文档建议对特别大的视图使用CATiledLayerCATiledLayer应该会降低内存占用,因为它只加载视图中实际显示给用户的部分(有点像Google Maps加载地图分幅) 编辑:顺便说一下,UIKit足够聪明,不会渲染不可见的内容,因为它不在屏幕上,或者被其他视图遮挡。但是,由于您已经将整个视

我有一个相当大的视野,大概是1000 x 1000。所以我做了clipToBounds=是的。这会为视图生成更小的位图吗?

我不这么认为
clipstobunds
指的是子视图,而不是视图本身。
UIView
文档建议对特别大的视图使用
CATiledLayer
CATiledLayer
应该会降低内存占用,因为它只加载视图中实际显示给用户的部分(有点像Google Maps加载地图分幅)


编辑:顺便说一下,UIKit足够聪明,不会渲染不可见的内容,因为它不在屏幕上,或者被其他视图遮挡。但是,由于您已经将整个视图保存在内存中,这可能对内存使用没有帮助,但对渲染速度没有帮助。

我认为可能没有-您仍然需要为视图分配内存,而不是显示它

您可能会得到非常轻微的性能提升,因为UIKit更了解什么/什么不可以绘制

不过,你可以自己回答这个问题!制作一个可生成1000个1000x1000视图的项目,并将其显示在屏幕上。然后在分析器中查看它的内存使用情况。然后将clipToBounds设置为“是”时执行相同操作,并查看它是否已更改

我预计不会,但我会对结果感兴趣——如果你这么做了,请把它们贴在这里

谢谢,山姆


编辑

在得到了非常合理的评论之后,我通过以下操作对其进行了测试:

1) 创建了一个新的XCode项目-窗口应用程序

2) 使用了以下代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch
    [window setClipsToBounds:YES];
    [window makeKeyAndVisible];

    // Make some views
    for (int n = 0; n < 100000; ++n) {
        UIImageView *view = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.jpg"]];
        [view setFrame:CGRectMake(0, 0, 1000, 1000)];
        [window addSubview:view];
        [view release];
    }

    return YES;
}
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{
//应用程序启动后自定义的覆盖点
[窗口设置ClipsToBounds:是];
[WindowMakeKeyandVisible];
//发表一些看法
对于(int n=0;n<100000;++n){
UIImageView*视图=[[UIImageView alloc]initWithImage:[UIImageName:@“image.jpg”];
[视图设置框:CGRectMake(0,0,1000,1000)];
[窗口添加子视图:视图];
[查看发布];
}
返回YES;
}
3) 建造它

4) 从模拟器的新开始,在Instruments-Object分配中运行它

正如预测的那样,没有变化-在窗口中将
clipstobunds
设置为YES或no时,大约需要16MB

然而,仍然存在一些问题-

a) 我使用UIImageView来确保我有需要为整个视图绘制的内容——UI层可能会针对UIView的不同子类进行不同的优化


b) 我在模拟器中运行了它(我手边没有iPhone,我的手机坏了)-我99%肯定它在设备上会有任何不同,但我也知道模拟器的内存泄漏不是100%准确,所以在设备上测试可能也是一个好主意。

clipsToBounds会大大降低性能。在打开clipsToBounds的情况下,尝试在滚动视图中放置一组视图,然后在视图中实际需要剪裁的区域(例如,视图有一个圆角半径)添加一些内容,然后运行并滚动。滚动将非常不平稳


告诉处理器渲染得更少并不是让处理器的工作“更容易”,而是让处理器做更多的工作,即决定绘制什么和不绘制什么。这需要周期。

为什么不这样做呢?这是一个150人的悬赏;-)(但谢谢你的提示,我很快就会试试)我刚刚好不容易才发现——然后在谷歌上搜索“ClipsTobunds jecky”,找到了这个帖子。我在滚动视图中有一组视图,每个视图都打开了剪贴簿。这些视图有圆角,我的滚动是不稳定的。我正在考虑在每个视图中创建一个子视图(具有规则的方形角),并尝试在该视图上设置clipsToBounds,而不是圆角视图。