【问题标题】:Mixing Quartz and OpenGL?混合石英和 OpenGL?
【发布时间】:2011-11-02 01:52:38
【问题描述】:

我正在尝试找出我们执行此操作时在后台实际发生的情况(请看图片)

正如您在图片中看到的那样,我添加了几个按钮,并从界面构建器中检查了内容视图。

现在我们知道它会使用核心动画或者说会创建图层。 (如果我错了,请纠正我。还在学习中......)

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

我的假设是当我们勾选 Content View 时,这些按钮是从 CGBitmapContextRef 中绘制的,并且从它创建的位图被移交给 Core Animation (OpenGL)。但到目前为止,我无法证明这一点。我该如何证明? 任何示例或一些方法想法都会很棒?

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

谁能解释这种集成是如何实现的?这些图像是如何出现在屏幕上的?

编辑:

要添加有关同一主题的更多信息,请查看下图以了解 OpenGL 层。我想我的目标是 common OpenGL Framework 层。

【问题讨论】:

  • 我们不知道,也不想知道。 Core Animation 和视图层次结构之间的集成是一个实现细节,如果 Apple 想到更好的方法,它可能随时改变。 :)
  • 真的不清楚你在这里问什么。 “这些按钮是怎么画出来的?”真的很模糊。如果你只是想知道这一切在内部是如何运作的,你不会在这里找到,因为那是秘密的苹果酱。
  • 是的,我正在寻找一些内部细节。可能还不是全部……但围绕该地区的一些不错的讨论、一些想法、一些线索可以揭示谜团。
  • 您的问题标题表明您有兴趣将 Quartz/Cocoa 绘图代码与“本机”OpenGL 绘图代码混合使用。那是你真正感兴趣的吗?如果是这样,这个问题可能已经回答了here(不必知道秘密的 Apple 代码。)
  • 这个问题是针对“其他方式”的:http://stackoverflow.com/q/8214884/963550

标签: cocoa macos opengl core-animation core-graphics


【解决方案1】:

我会先做一个紧密循环,永远重新绘制你的按钮。然后,在它运行时,使用 Activity Monitor 对您的进程进行示例跟踪。您将看到绘制按钮所采用的所有代码路径。您应该能够从绘图堆栈中的例程名称中看到发生了什么。如果您无法理解,请在此处发布相关内容,我们可以看看。

【讨论】:

    【解决方案2】:

    按钮是在 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)。

    我仍然不知道它是如何将data 上传到CGLContextObj 的。必须使用一些私有 api。

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-18
      相关资源
      最近更新 更多