草庐IT

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

coder 2024-06-18 原文

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

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

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

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

在 iOS 和大多数其他通用操作系统上,Graphics Context 实际上是这样工作的吗?

最佳答案

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

  1. 图形上下文基本上是一种比其他任何东西都重要的“状态”。它包含一组特定绘图例程的描边/填充颜色、线条宽度等信息。

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

  3. 提供给 UIView 的“drawRect”方法的图形上下文旨在提供尽可能高效的上下文。这就是为什么你不能在上下文之外的 View 中绘制任何东西,也不能为要绘制的 View 创建自己的上下文。实际的绘制是在运行循环中处理的,这就是为什么我们使用这个方法来标记一个需要绘制的UIView:[view setNeedsDisplay].

  4. UIView 的图形上下文在主线程上绘制,是的,同样在 CPU 上处理。这确实意味着过于复杂的绘图会占用您的主要应用程序,但现在有了多核处理器,这并不是什么大问题。

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

    如果您想要进行 GPU 绘图,我相信唯一的方法是在您使用 iOS 时使用 OpenGL。如果您使用的是 MacOS,我认为您实际上可以使用 QuartzGL 在 GPU 上启用 Quartz(核心图形......相同的东西)绘图。但这可能不值得付出努力,请参阅这篇文章:Mac QuartzGL (2D drawing on the graphics card) performance

更新

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

关于ios - 图形上下文的概念与文件句柄非常相似吗? (在 iOS 和其他系统上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10775738/

有关ios - 图形上下文的概念与文件句柄非常相似吗? (在 iOS 和其他系统上)的更多相关文章

  1. ruby - 其他文件中的 Rake 任务 - 2

    我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. ruby - 调用其他方法的 TDD 方法的正确方法 - 2

    我需要一些关于TDD概念的帮助。假设我有以下代码defexecute(command)casecommandwhen"c"create_new_characterwhen"i"display_inventoryendenddefcreate_new_character#dostufftocreatenewcharacterenddefdisplay_inventory#dostufftodisplayinventoryend现在我不确定要为什么编写单元测试。如果我为execute方法编写单元测试,那不是几乎涵盖了我对create_new_character和display_invent

  6. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  7. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. ruby - 在 Ruby 中,在类方法的上下文中,什么是实例变量和类变量? - 2

    如果我有以下一段Ruby代码:classBlahdefself.bleh@blih="Hello"@@bloh="World"endend@blih和@@bloh到底是什么?@blih是Blah类中的一个实例变量,@@bloh是Blah类中的一个类变量,对吗?这是否意味着@@bloh是Blah的类Class中的一个变量? 最佳答案 人们似乎忽略了该方法是类方法。@blih将是常量Bleh的类Class实例的实例变量。因此:irb(main):001:0>classBlehirb(main):002:1>defself.blehirb

  10. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

随机推荐