Cocoa touch 如何重置为标识;电流变换矩阵“;使用一些CGContext函数?

Cocoa touch 如何重置为标识;电流变换矩阵“;使用一些CGContext函数?,cocoa-touch,matrix,core-graphics,Cocoa Touch,Matrix,Core Graphics,我在CTM上做了一系列的平移和旋转,在进一步进行变换之前,我需要将其重置为标识 我找不到任何合适的方法来实现它(显然,应该有一个名为CGContextSetCTM之类的函数),因为效率是关键,我不想使用CGContextSaveGState/CGContextRestoreGState…通过获取当前变换矩阵,将其反转,并将当前矩阵乘以反转的矩阵(这很重要!)具有CTM现在是标识。保存/恢复操作可能是与标识矩阵大小相当的内存区域的单个内存副本(大小的两倍或三倍)。这可能只发生在保存操作中。请考虑这

我在CTM上做了一系列的平移和旋转,在进一步进行变换之前,我需要将其重置为标识


我找不到任何合适的方法来实现它(显然,应该有一个名为CGContextSetCTM之类的函数),因为效率是关键,我不想使用CGContextSaveGState/CGContextRestoreGState…

通过获取当前变换矩阵,将其反转,并将当前矩阵乘以反转的矩阵(这很重要!)具有CTM现在是标识。

保存/恢复操作可能是与标识矩阵大小相当的内存区域的单个内存副本(大小的两倍或三倍)。这可能只发生在保存操作中。请考虑这可能比NoP函数调用慢得多。每个图形操作都有几个乘法运算的规模,我猜在每个保存/恢复周期的代码中,这种情况会发生不止一次。一次图形操作的时间可能大于一次保存/还原周期。

请注意,如果当前CTM是单数的,则使用CGAffineTransformInvert反转当前CTM不起作用


最明显的情况是,如果以前使用矩阵CGAffineTransformMake(0,0,0,0,0,0,0)执行CGContextConcatCTM,则这似乎是一种可行的解决方法,但效率极低。我不明白苹果为什么不公开任何函数来直接重置矩阵…@EightyEight:可能是因为苹果希望转换矩阵在链的更上层的转换基础上保持可修改性,并且希望开发者在这些情况下编写代码做正确的事。示例:如果苹果(假设)想要为游戏实现一个UI,显示它们在运行时缩小了大小,比如Safari选项卡视图中的平铺网页,该怎么办?如果开发人员决定在其绘图代码中重置转换矩阵,会发生什么情况?它不会“只是工作”,它看起来像是扭曲的垃圾,这就是。@slipd.Thompson要指出的:苹果会在这种特定情况下使用核心动画@是的,汤普森。这并不意味着苹果不会在这种情况下使用核心动画。如果您想重新缩放内容,任何核心图形绘图都会被定向到将被重新缩放的
CALayer
。因为缩放已经绘制的纹理比重绘位图内容本身要快得多。因此,弄乱石英CTM会弄乱存储在
CALayer
中的纹理内容(由
CGContext
表示),但不在单独的层之外。@slipd.Thompson它创建了一个
CGContext
,并将其传递给自己的
-drawInContext:
及其代理的
-drawLayer:inContext:
。在上下文中绘制内容后,内容将上载到该层的纹理。在核心动画的实现中,我使用
CGBitmapContext
,然后将生成的RGBA数据上传到纹理。苹果也做类似的事情;当然,他们做得更好、更快,而且他们做得更先进——但这是基本的想法。你能澄清一下为什么需要根据身份调整当前上下文吗?这似乎是一个不太可能的操作,而且可能有一种更聪明的方法可以按你所希望的比例绘制和翻译。在iPhone6上:保存+恢复大约是630纳秒。保存+翻转CTM+恢复约670纳秒。