English 中文(简体)
图形上下文的概念与文件句柄非常相似吗?(在iOS和其他系统上)
原标题:Is the concept of a Graphics Context very similar to a file handle? (on iOS and other systems)

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

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

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

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

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

问题回答

我认为最好不要将图形上下文视为特定的系统资源。据我所知,除了内存之外,图形上下文并不比任何类对象对应任何特定的资源。实际上,Graphics上下文旨在为核心图形功能提供一个操作画布。事实上,苹果并没有给我们图形上下文内部工作的具体细节。但有几件事我们确实知道:

  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绘图,我认为如果你使用的是iOS,那么唯一的方法就是使用OpenGL。如果你使用的是MacOS,我认为你实际上可以使用QuartzGL在GPU上启用Quartz(核心图形……同样的东西)绘图。但这可能不值得付出努力,请参阅这篇文章:Mac QuartzGL(图形卡上的二维绘图)性能

更新

正如你在下面的评论中看到的,苹果目前对Quartz绘图的安排可能是最好的,特别是因为视图是直接绘制到GPU缓冲区的。人们很容易认为处理任何视觉内容都应该在GPU上完成,但事实是,GPU不是为矢量绘图而设计的。它们经过重新设计,可以处理大量的变换、照明、纹理映射等。通过使用CPU处理矢量绘图,并将其他一切留给GPU,苹果已经适当地分割了图形处理。此外,由于Quartz直接绘制到GPU的缓冲区(避免了繁重的内存),因此CPU和GPU之间的数据传输不会损失任何效率。

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

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

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

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

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

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

这是正确的。

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

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

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

你把这两个案子翻了。一般来说,Quartz是在软件中工作的,使用位图。在某些情况下,如果一切都排得完全正确,它可能会使用GPU更快地在屏幕上显示这些位图。





相关问题
Why running a service as Local System is bad on windows?

I am trying to find out the difference between difference service account types. I tumbled upon this question. The answer was because it has powerful access to local resources, and Network Service ...

Programmatically detect Windows cluster configuration?

Does anyone know how to programatically detect that a Windows server is part of a cluster? Further, is it possible to detect that the server is the active or passive node? [Edit] And detect it from ...

get file icon for Outlook appointment (.msg)

I ve read Get File Icon used by Shell and the other similar posts - and already use SHFileInfo to get the associated icon for any given extension, and that works great. However, Outlook uses ".msg" ...

Identifying idle state on a windows machine

I know about the GetLastInputInfo method but that would only give me the duration since last user input - keyboard or mouse. If a user input was last received 10 minutes ago, that wouldn t mean the ...

Terminating a thread gracefully not using TerminateThread()

My application creates a thread and that runs in the background all the time. I can only terminate the thread manually, not from within the thread callback function. At the moment I am using ...

热门标签