问题标签 [cglayer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
ios - iPad 2 与新 iPad 上 CGLayerCreateWithContext 的奇怪行为?
在 Single View App 中,FooView 是主视图。在 FooView 中drawRect
,如果我这样做了
我正在使用 aCADisplayLink
来调用[self.view setNeedsDisplay]
在视图控制器中调用的方法,以便使用该属性drawRect
每 1 帧、5 帧或 20 帧调用一次。frameInterval
在 iPad2 上,当 CGLayer 被数百个 6x6 点矩形填充时,绘制时间约为 0.011 到 0.012 秒,如 NSLog 语句所打印的那样。这能够达到60fps。(60fps 是每帧 0.01666 秒)
如果我将行更改为:
(使用NULL
代替context
)。然后时间大约是 0.014 秒,对于 60 fps 来说还是不错的。
但在新 iPad 上,情况正好相反:如果context
在这条线上使用,那么时间是惊人的 0.17 秒……这对于 6 fps 来说都不好。如果NULL
使用,那么时间是0.038,对于60 fps来说是不好的,但至少对于20 fps来说是好的,还是可以接受的。有谁知道它为什么会这样,以及如何让它在 iPad、iPad 2 和新 iPad 的所有平台上运行良好或更好地运行?
如果调用CGLayerCreateWithContext
withNULL
给出了 GPU 缓存的图形上下文,调用 withcontext
给出了位图上下文,那么为什么在 iPad 2 上调用CGLayerCreateWithContext
with实际上更快context
?
(我在新 iPad 上使用 iOS 5.1.1,在 iPad 2 上使用 iOS 5.1 ......这应该没有太大区别......而且我不想升级 iPad 2 以便我可以拥有另一个具有不同 iOS 版本的设备来测试我的应用程序)。
save - 为什么 CGlayerRef 或 CGcontextRef 不能保存在 NSdata 中?
我将 CGlayerRef 和 CGcontextRef 保存在 NSdata 中,当我让它们覆盖当前的时,我发现只有指针被保存,而数据没有被保存。出于这个原因,我不能将这些 CGlayerRef 或 CGcontextRef 作为副本。(我在 drawRect 中完成了这一切)
为什么?有人说 NSdata 可以存储这些东西,但是 NSvalue 不能,但是,它根本不起作用,即使我使用“复制”,我也没有得到这些数据的副本。
这是我的代码:
-(void)drawRect:(CGRect)rect{
如果(drawCount==3){
长度:sizeof(CGLayerRef)];
ios - 在 iOS 上,我们如何获取 GPU 上缓存的图形上下文?
也许第一个问题是:在 GPU 上缓存图形上下文是否有用或可能:在 iPad 1、2 和新 iPad 上,PowerVR用作 GPU,它是否将 RAM 用作图形内存?如果是这样,如果我们将图形上下文缓存在 GPU 上,它会有所帮助吗?
如果事实上可以,那么我们如何获得这样的图形上下文?有提到CGLayer
and CALayer
:CGLayer
可以缓存在 GPU 上,并且CALayer
经常缓存在 GPU 上,但是CGLayer
是从另一个上下文中获取的,使用CGLayerCreateWithContext
,并且该上下文应该是一个窗口图形上下文,它只提到了如何获取一个窗口Mac OS X 上的图形上下文,而不是 iOS。提到如何获取“View Graphics Context”的部分实际上与在CALayer中获取的上下文相同:CALayer开始display
使用drawInContext
Bitmap Graphics Context,看起来,最后drawRect
调用UIView
使用这个位图上下文,我不确定 CALayer 缓存在 GPU 上的想法实际上是指这个位图图形上下文还是它layer.contents
是一个 CGImage,所以缓存实际上是在这个图像上,而不是图形上下文。
ios - 为 CGLayer 创建 CGContext
我想预渲染一些图形CGLayer
以便将来快速绘图。
我发现CGLayerCreateWithContext
需要一个CGContext
参数。在drawRect:
方法中很容易找到。但我需要创建一个CGLayer
外部的drawRect:
. 我应该去哪里CGContext
?
我应该简单地创建临时CGBitmapContext
并使用它吗?
更新:我需要在 drawRect 之外创建 CGLayer:因为我想在渲染之前初始化 CGLayer。可以在第一次 drawRect 调用时初始化一次,但这对我来说不是一个漂亮的解决方案。
iphone - iOS:如何旋转 CGLayer?
我一直在寻找答案。我还在加快 iOS 开发的速度,所以我可以肯定地接受我在这里可能是无所事事的。然而,完全和完全缺乏答案让我想知道是否真的有答案。
这是交易:我正在使用 CGLayer 生成一个相当基本的矢量多边形:
s_viewRects 是一个静态数组,它保存容器矩形,就像放置在整个图像中一样,s_shapePoints 包含一个映射出扭曲六边形的 CGPoint 结构数组。
现在,我想重新使用这个形状。它需要翻转和旋转以适应所有用途(为了记录,这些是“LED”显示器中的“段”)。
我的形状很好。没问题。
问题在于旋转它以供重复使用。似乎没有任何方法可以实际旋转 CGLayer。旋转 CALayers 的方法很多,但不是 CGLayers。我很乐意使用 CALayer,除了 CALayers 似乎都专注于光栅图形,我需要矢量图形。
我确信必须有一个明显的方法来解决这个问题。到目前为止,我看到的唯一方法是旋转整个目标图形上下文,绘制形状,然后取消旋转上下文。相当于转动房子拧下灯泡。
我可以让它工作的唯一方法是在单独绘制每个段之前实际转换点,这意味着不重复使用。在创建形状期间执行 CGContextRotateCTM 实际上不会导致显示时旋转元素。
有什么线索吗?
ios - 如何使用 CgLayer 进行最佳绘图
我创建了一个简单的绘图项目,代码工作正常,但我想将绘图缓存到 CGlayer 中,因为我读到它更有效的绘图方式。我已阅读文件,但无法正确理解。所以朋友们,我请求你们在这方面帮助我。
下面是我的代码,我想知道如何在这个中使用 CgLayer
问候兰吉特
ios - undo redo issues with CGLayer
I am working with unod redo operations on CgLayer, I have tried some code, but not able to get it working, dont know , where I am getting wrong, below is my code, which i have written
this is my drawRect function
On touches ended , I am converting the layer into NSValue and storing as keyValue pair into NSDictionary and then adding the dictionary object to array.
below is my Undo functionality
I think its here where I am goin wrong. So friends please help me out.
From the comments below, I have added the function, where its draws into Cglayer(this function I am calling into touchesMovedEvent.
Regards Ranjit
ios - 如何在绘图中存储 CGLayers
我正在使用 CgLayers 在 iOS 中绘图,现在我想存储这些图层并稍后检索它,所以我想知道有哪些可用选项。我尝试使用 NSMutableDictionary,下面是代码,
问候兰吉特
xcode - CGLayerRelease 崩溃
我有一个启用了 ARC 的 Cocoa 应用程序。我正在使用 OS 10.8 和 Xcode 4.4。该应用程序在调用 CGLayerRelease 时偶尔会崩溃,将以下消息转储到控制台:
如果我注释掉对 CGLayerRelease 的调用,崩溃就会停止。我需要在启用 ARC 的项目中调用 CGLayerRelease 吗?文档对此不是很清楚。
很难为此发布代码,因为它分布在一个从 NSView 继承的类的大文件中。该类有一个数据成员CGLayerRef layer;
。然后在drawRect函数内部:
该类也是其窗口的委托,具有以下功能
也在属性设置器中
现在,如果我取消对调用的注释,CGLayerRelease
那么我偶尔会遇到上述崩溃。我强调“偶尔”,因为它并不总是发生。
xcode - 何时保留和释放 CGLayerRef?
我有一个与此类似的问题:
NSValue 中的 CGLayerRef - 何时调用 retain() 或 release()?
我在视图中绘制 24 个圆圈作为径向渐变。为了加快速度,我将渐变绘制到一个图层中,然后将该图层绘制 24 次。这非常有效地加快了渲染速度。在随后的 drawRect 调用中,一些圆圈可能需要用不同的色调重新绘制,而另一些则保持不变。
每次通过 drawRect 我都会用新的色调重新计算一个新的渐变并将其绘制到一个新图层中。然后我循环遍历圆圈,根据需要使用原始图层/渐变或新图层/渐变绘制它们。我有一个 24 个元素的 NSMutableArray,它为每个圆圈存储一个 CGLayerRef。
我认为这是我在上面链接的问题中提供的答案,但它对我不起作用。第二次通过 drawRect 时,使用存储在数组中的 CGLayerRef 绘制的任何圆都会导致程序在调用 CGContextDrawLayerAtPoint 时崩溃。在调试器中,我验证了原始 CGLayerRef 的实际十六进制值已正确存储到数组中,并且第二次通过 drawRect 将相同的十六进制值传递给 CGContextDrawLayerAtPoint。
此外,我发现如果我不 CGLayerRelease 层,那么程序不会崩溃,它工作正常。这告诉我层的内存管理出了问题。我的理解是将对象存储到 NSArray 中会增加它的引用计数,并且在数组释放它之前不会释放它。
无论如何,这里是drawRect的相关代码。在底部你可以看到我注释掉了 CGLayerRelease。在此配置中,应用程序不会崩溃,尽管我认为这是资源泄漏。如果我取消注释该版本,则应用程序会第二次崩溃,但 drawRect (在第一次和第二次调用之间,其中一个圆圈的 led_info.selected 属性已清除,表明它应该使用保存的图层而不是新图层:
这是led_info的声明:
led_info_array 是 ledInfo 对象的 NSMutableArray,数组本身是视图的一个属性:
数组初始化如下: self.led_info_array = [[NSMutableArray alloc] init];
编辑:自从我发布以来,我发现如果我将分配周围的保留/释放放入 NSMutableArray 中,那么我也可以保留原始 CGLayerRelease 并且应用程序可以工作。所以我想这就是它应该如何工作,虽然我想知道为什么保留/释放是必要的。在我正在阅读的目标 C 书籍(以及上面链接的问题的答案)中,我认为隐式分配给 NSArray 确实保留/释放。新的工作代码如下所示:
您可能会说我是 Objective C 和 iOS 编程的新手,并且我意识到我并没有真正遵守关于大小写和其他事情的约定。我会清理它,但现在我想解决这个内存管理问题。
罗布,谢谢你的帮助。我可以进一步澄清一下。我认为从你所说的有两个问题:
1) 引用计数不适用于 CGLayerRef。好的,但是在编写代码而不是在调试之后知道这一点会很好。我在 Objective C/cocoa 中使用“事物”时资源计数不起作用的迹象是什么?
2)你说我存储到一个属性,而不是一个 NSArray。是的,但是存储的目的地是 NSArray 通过属性,它是一个指针。该值确实使其进入数组并退出。资源计数不是这样工作的吗?即,如果我使用上面的代码将一些 NSObject 存储到 NSArray 中,而不是 CGLayerRef,资源计数会起作用吗?如果不是,那么摆脱中间的 led_info 属性并直接从循环内访问数组会起作用吗?