gpt4 book ai didi

cocoa - 删除/添加 CALayers 以进行 GPU 优化

转载 作者:行者123 更新时间:2023-12-03 17:18:19 25 4
gpt4 key购买 nike

我有一个图层支持的 View ,我正在尝试向其添加大小大约为 300 X 270(以像素为单位)的子图层。

子层的数量可能会达到 1000 到 2000,更不用说每个子层对于初学者来说又可以扩展到大约 4280 X 1500 或更多。

所以问题显然是 GPU 限制。

添加大约 100 个大小为 300 X 270 的子图层后,出现警告图像对于 GPU 来说太大,忽略,这会扰乱图层显示。

这个问题的解决方案(来自一些邮件列表)是使用CATiledLayer,但由于复杂的要求,我无法使用tiledLayer子图层的显示。

是否可以删除不属于 View VisibleRect 的子图层?

我尝试removeFromSuperlayer,然后在需要时添加它,当我尝试重新添加子层时总是会发生崩溃。

我该怎么做?

我添加了两次子层(我需要更改它),但现在只是为了代码的要点:

-(IBAction)addLayer:(id)sender
{
Layer *l = [[Layer alloc] init];
CALayer *layer = [l page];
[contentArray addObject:page];
[drawLayer addSublayer:layer];
[self layout];
}

-(void)layout
{
NSEnumerator *pageEnumr = [contentArray objectEnumerator];

float widthMargin = [self frame].size.width;
CGRect rect;
float zoom = [self zoomFactor];
while(obj = [contentEnmr nextObject] )
{
[obj setZoomFactor:zoom];
CALayer *pg =(CALayer *)[obj page] ;
rect = pg.bounds;

if ( x + pg.bounds.size.width > widthMargin )
{
x = xOffset;
y += rect.size.height + spacing ;

}
rect.origin = CGPointMake(x,y);
[obj changeBounds];

NSRect VisibleRect = [self visibleRect];
NSRect result = NSIntersectionRect(VisibleRect,NSRectFromCGRect( rect));
if( NSEqualRects (result ,NSZeroRect) )
{
[pg removeFromSuperlayer];
}else
{
[drawLayer addSublayer:pg];
[pg setFrame:rect];
[pg setNeedsDisplay];
}


x += ( rect.size.width + spacing);
}

NSRect viewRect = [self frame];
if(viewRect.size.height < ( y + rect.size.height + spacing ) )
viewRect.size.height = ( y + rect.size.height + spacing) ;

[self setFrameSize: viewRect.size];

}

@interface Layer : NSObject {
CALayer *page;
}
@property (retain) CALayer *page;

最佳答案

看看 WWDC session 中包含的 PhotoScroller 应用程序。它演示了如何通过仅加载图像当前可见的部分来缩放和滚动非常大的图像。

另请查看this discussion .

关于cocoa - 删除/添加 CALayers 以进行 GPU 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/626316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com