2011-08-23 70 views
20

我试图找出究竟发生在后台,当我们做到这一点(请参阅图)混合石英和OpenGL?

enter image description here

正如你可以在图片看到我添加几个按钮,从接口检查内容的浏览窗口的建造者。

现在我们知道它会利用核心动画或者说会创建图层。 (请纠正我,如果我错了仍在研究...)

我想知道这些按钮是如何绘制的?

我的假设是当我们为内容视图打勾时,这些按钮是从CGBitmapContextRef绘制的,并且从它创建的位图被移交给核心动画(OpenGL)。但目前我无法证明这一点。我如何证明它? 任何示例或一些方法的想法会很好?

事情我确定是从CGBitmapContextRef创建的按钮。但是,这些按钮图像发生了什么是未知的。

任何人都可以解释如何整合可能吗?这些图像如何在屏幕上显示?

编辑:

要增加对同一主题的更多信息,请点击下面的图片对OpenGL的层。我想我的目标是常见的OpenGL Framework层。 enter image description here

+6

我们不知道,我们不想*知道。核心动画和视图层次之间的整合是一个实现细节,如果苹果认为有更好的方法可以随时更改它。 :) –

+0

这真的不清楚你在这里问什么。 “这些按钮是如何绘制的?”真的很含糊。如果你只是想知道它是如何在内部工作的,你不会在这里找到,因为这是苹果酱的秘密。 – benzado

+0

是的,我正在寻找一些内部细节。可能并非所有......但围绕该地区的一些很好的讨论,一些想法,一些线索可以揭示这个谜团。 – MacGeek

回答

0

按钮在CGBitmapContextRef上绘制。

比方说,我们有CGBitmapContextRef反对使用

CGContextRef CGBitmapContextCreate (
    void *data, 
    size_t width, 
    size_t height, 
    size_t bitsPerComponent, 
    size_t bytesPerRow, 
    CGColorSpaceRef colorspace, 
    CGBitmapInfo bitmapInfo 
); 

这里void *data创建,是一个指向内存中的目标位置的图纸被渲染。

然后可以使用CGContext API在data上执行各种操作。因此可以绘制按钮和背景。

一旦完成,我们可以释放CGContextRef,但数据仍在内存中,可以传递给OpenGLContext(CGLContextObj)。

我还不知道它是如何上传dataCGLContextObj。必须使用一些私人API。

1

我会从一个紧密的循环开始,重新绘制你的按钮。然后,在它运行时,使用活动监视器对您的流程进行示例跟踪。您将看到绘制按钮所需的所有代码路径。您应该能够从绘图堆栈中的例程名称中看到发生了什么。如果你无法理解它,请发布相关位并在这里,我们可以看看。