Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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
Objective c 有许多小CatExtLayer会使窗口的大小调整变慢_Objective C_Performance_Cocoa_Optimization_Core Animation - Fatal编程技术网

Objective c 有许多小CatExtLayer会使窗口的大小调整变慢

Objective c 有许多小CatExtLayer会使窗口的大小调整变慢,objective-c,performance,cocoa,optimization,core-animation,Objective C,Performance,Cocoa,Optimization,Core Animation,当我调整包含大约10000个CATextLayers的窗口的大小时,最初的调整会将窗口冻结几秒钟。在最初的冻结之后,调整大小会明显地出现口吃 分析和常识表明,这是缓慢的,因为所有的内部重画(显然Catextlayer在引擎盖下使用核心文本) 可以进行哪些优化(如果有)来快速有效地调整包含10000个文本层的窗口大小? 下面是我用来创建层的代码,在一个简单的NSView子类中: -(id)initWithFrame:(NSRect)frameRect{ if(self=[super initWit

当我调整包含大约10000个CATextLayers的窗口的大小时,最初的调整会将窗口冻结几秒钟。在最初的冻结之后,调整大小会明显地出现口吃

分析和常识表明,这是缓慢的,因为所有的内部重画(显然Catextlayer在引擎盖下使用核心文本)

可以进行哪些优化(如果有)来快速有效地调整包含10000个文本层的窗口大小?

下面是我用来创建层的代码,在一个简单的NSView子类中:

-(id)initWithFrame:(NSRect)frameRect{
if(self=[super initWithFrame:frameRect]){
[self-setLayer:[CALayer layer]];
[self-SetWantLayer:是];
}
回归自我;
}
-(无效)从NIB中唤醒{
[超级awakeFromNib];
int w=8;
int h=14;
self.layer.backgroundColor=[NSColor whiteColor].CGColor;
对于(int y=0;y<100;y++){
对于(int x=0;x<100;x++){
CATextLayer*t=[CATextLayer层];
t、 不透明=是;
t、 帧=NSMakeRect(x*w,y*h,w,h);
t、 foregroundColor=[NSColor blackColor].CGColor;
t、 backgroundColor=[NSColor yellowColor].CGColor;
t、 字符串=@“a”;
t、 font=(_u桥CGFontRef)[NSFont fontWithName:@“Menlo”大小:12];
t、 fontSize=12;
[self.layer addSublayer:t];
}
}
}
更多内容:我正在创建一个文本网格,其中每个单元格的字符、文本颜色和背景颜色都可以更改(类似于Terminal.app)


出于这个原因,我想到的一种优化方法,即每行使用一个CATextLayer,而不是每“单元”使用一个CATextLayer,是行不通的,因为一个CATextLayer只能有一个前景色和一个背景色。

您可以尝试按如下方式处理此问题:


  • 开始调整大小时,将10K层展平为一层
  • 使用位图层调整大小
  • 调整大小后,请再次替换为10K CATextLayers
缺点是正在进行的大小调整看起来有些像素化。此外,在位图上渲染10K层可能很耗时


这样做的好处是,渲染完成后,可以快速平滑地调整大小。

开始调整大小时,将10K层展平为一层。使用位图层调整大小。调整大小后,再次用10K
CATextLayer
s替换。缺点是正在进行的大小调整看起来有些像素化。优点是它非常快速和流畅。我没有把它作为一个答案发布,因为它最初是一个评论,后来演变成一种看起来可能是一个解决方案的东西,因为我正在键入它。无论如何,我发布了一个答案——试试看,我很好奇这是否有帮助,或者它是否只是将CPU负载转移到另一个位置。听起来你需要一种减少层数的方法。我可以想出一种方法,将整个图片分为四层:(1)一个真实的层,在符号的位置有前景颜色的方块,(2)一个遮罩层,整个文本在alpha=1文本和alpha=0背景中呈现,(3)一个真实的层,在符号的位置有背景颜色的方块,以及(4)#3的遮罩层,整个文本在背景中以alpha=0和alpha=1呈现。下面是一个例子。作为实现这一点的一个步骤,我尝试删除并重新添加一个实时调整大小的图层,并隐藏/显示它们。当实时调整大约100000层的大小时,这两种方法的速度都很慢。@sdegutis 100K层太多了,甚至10K听起来像是一个边界,但100K是很多。“医生,我这样做的时候很痛(在视图中放置10K或100K层)”