图形上下文的概念是否与文件句柄非常相似?(在 iOS 和其他系统上)



有时术语图形上下文有点抽象。 它们实际上是系统资源,但它们是来自显卡的资源,就像文件句柄是来自硬盘驱动器或任何永久存储设备的系统资源一样?

正如文件句柄具有

有关文件句柄是用于只读还是用于读/写的状态,以及下一次读取操作的当前位置一样,图形上下文具有有关当前笔触颜色、笔触宽度或任何相关数据的状态。 (更新:在写入模式下,我们可以转到 200MB 文件中的任何点并更改数据,就像我们拥有图形上下文的画布并在它上面绘制内容一样)

因此,图形上下文实际上是全局的、系统范围的资源。 它们不是应用程序单一实例或任何内容的一部分,就像文件或文件句柄不是(必然)应用程序单一实例的一部分一样。

如果没有功能强大的图形卡(或者图形卡已经耗尽资源),则操作系统可以使用位图使用低级图形例程模拟图形上下文,而不是让图形卡处理它。

这是图形上下文在iOS和大多数其他常见操作系统上的实际工作方式吗?

我认为最好不要从特定的系统资源的角度考虑图形上下文。 据我所知,图形上下文不再对应于任何特定资源,而不是任何类"对象",当然除了内存。 实际上,图形上下文旨在为核心图形功能提供"画布"以进行操作。 事实是,Apple没有向我们提供图形上下文如何在内部工作的具体细节。 但是我们确实知道几件事:

  1. 图形上下文基本上是一种"状态",而不是其他任何东西。 它包含一组特定绘图例程的填充/填充颜色、线宽等信息。

  2. 它不会在 GPU 上处理。 相反,它在CPU上处理(完成所有绘制),并将生成的图像(某种形式的位图)"传递"到GPU进行显示/动画(实际上它将图像直接渲染到GPU的缓冲区)。 这就是为什么"renderInContext"方法在新iPad 3中效果不佳的原因。 renderInContext首先为您提供图像,这涉及渲染和复制图像。 如果您希望显示它,则必须将其传递回Core Graphics,然后Core Graphics将图像写回。 在 iPad 3 上,这涉及大量内存(取决于视图的大小),并且很容易溢出缓冲区。

  3. UIView 的"drawRect"方法提供的图形上下文旨在提供尽可能高效的上下文。 这就是为什么您不能在上下文之外的视图中绘制任何内容,也不能为要绘制的视图创建自己的上下文。 实际的绘图是在运行循环中处理的,这就是为什么我们使用此方法将UIView标记为需要绘制:[view setNeedsDisplay]

  4. UIViews 的图形上下文在主线程上绘制,是的,再次在 CPU 上处理。 这确实意味着过于复杂的图纸可能会占用您的主要应用程序,但现在使用多核处理器已经不是什么大问题了。

  5. 您可以创建图形上下文,但只能绘制以绘制到图像。 这与 UIView 上下文的作用完全相同,只是它旨在由您使用,而不是绘制到屏幕上或动画。 从 iOS 4 开始,您可以在其他线程(主线程除外)中处理这些图像上下文。

    如果你想做GPU绘图,我相信唯一的方法是使用OpenGL,如果你使用的是iOS。 如果您使用的是MacOS,我认为您实际上可以启用Quartz(核心图形...同样的事情)使用 QuartzGL 在 GPU 上绘制。 但可能不值得付出努力,请看这篇文章: Mac QuartzGL(显卡上的2D绘图)性能

更新

正如您在下面的评论中看到的那样,Apple 目前对石英绘图的安排可能是最好的,特别是因为视图直接绘制到 GPU 缓冲区。 有一种诱惑认为处理任何视觉内容都应该在GPU上完成,但事实是,GPU不是为矢量绘图而设计的。 它们旨在处理大规模变换、光照、纹理映射等。 通过使用 CPU 处理矢量绘图并将其他所有内容留给 GPU Apple 已经适当地拆分了图形处理。 此外,您不会在 CPU 和 GPU 之间的数据传输中失去任何效率,因为 Quartz 直接绘制到 GPU 的缓冲区(这避免了繁重的内存)。

有时,术语图形上下文有点抽象。

是的,故意如此。石英意味着一个抽象,一个通用的绘图系统。它可能会也可能不会在内部对图形硬件执行一些优化,但您对此没有太多可见性。 它所做的优化类型可能会随着时间的推移和不同类型的图形硬件而变化。

它们实际上是系统资源,但它们是来自图形卡的资源

不,绝对不是。Quartz是一个软件渲染器——即使没有图形硬件,它也能工作,并且可以绘制到像PDF这样图形硬件没有任何用处的东西。

在内部,Quartz(及其与操作系统其余部分的接口)可能有一些"快速路径",在某些情况下可以利用 GPU。但这绝不是常见的情况。

正如文件句柄具有

有关文件句柄是用于只读还是用于读/写的状态,以及下一次读取操作的当前位置一样,图形上下文具有有关当前笔触颜色、笔触宽度或任何相关数据的状态。

这是正确的。

因此,图形上下文实际上是全局的、系统范围的资源。

不。Quartz 只是一个在应用中运行代码的库。如果你创建了一个新的CGContext,只有你的应用程序会受到影响 - 就像你的代码创建你自己的一个类的新实例一样。

如果没有功能强大的图形卡(或者图形卡已经耗尽资源),则操作系统可以使用位图使用低级图形例程模拟图形上下文,而不是让图形卡处理它。

你翻转了两个案例。一般来说,Quartz在软件中工作,带有位图。在少数情况下,如果一切都排列正确,它可能会使用 GPU 更快地将这些位图显示在屏幕上。

相关内容

  • 没有找到相关文章

最新更新