看后 Metal 的开发文档后,除了官方所宣称的一些长处外(比方说更easy理解和使用的
API。更直接和精细的硬件控制,降低 GPU 使用过程中的 CPU 额外开销等等),从我有限的 GLES 开发经验看来,下面一些方面更让人兴奋。

更方便和友好的多线程 GPU 渲染支持



GLES 的设计,全部东西都必须跟一个 GL Context 绑定。由 GL Context 内部所控制的状态机驱使,而 GL Context 又跟单个线程本身紧密绑定在一起,导致非常难支持构建一个良好的多线程 GPU 渲染架构,Chrome 的解决的方法是在 GL 之上构建了一套 GL Context 的 Proxy 机制,Proxy GL Context 同意多个线程创建不同的实例。而每一个 Proxy GL Context 内部使用一个 Command Buffer 跟真正的 GL Context 进行通讯和保持同步。

而 Metal 在设计时就考虑了怎样更好地支持多 CPU 线程同一时候“使用“ GPU,它的 Command Queue/Command Buffer 的模型尽管有点类似 Chrome 的 Proxy 机制。不同的 CPU 线程能够 Encode Commands 到不同的 Command Buffer,然后放入同一个 Queue 里面等待 GPU 的真正运行。

可是 Metal 的这样的内建的支持当然比 Chrome 在 GL 上面的封装来的更方便,易用和高效,也没有那么多限制。



GPU 渲染和计算的无缝整合(Rendering and Compute)



尽管 GLES 未来也会支持 Compute Shader,可是是否能做到 Metal 这样无缝的衔接(包含 Command 的运行和资源的共享)就比較难说了。

统一的资源内存管理模型,同意 CPU 直接訪问 Metal Resource (Buffer/Texture) 的存储内存。并设定了明白的 CPU/GPU 同步时机



尽管 GLES 3 能够通过 Pixel Buffer Object 支持一块 GPU 控制的内存可供 CPU 直接訪问,可是毕竟限制太多,用途有限(另外也因为 GLES 本身缺少良好的多线程支持)。而 Android 的 GraphicsBuffer 系统/硬件兼容性问题成堆。性能參差不齐。没有明白的 CPU/GPU 同步时机,也仅仅能用于特定场景。

简而言之。Metal 让 CPU/GPU 之间的协作更紧密和高效,同意 CPU 通过许多其他方式,使用更灵活 GPU。我们投入了大量的其他任务的 GPU 去完成。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

最新文章

  1. Notepad++ 配置 Node.js 开发环境
  2. 我理解的webservice是这样的
  3. java常用类 --- Object
  4. 在线运行HTML代码器
  5. Ping的过程详解
  6. Ubuntu Update-rc.d命令详细介绍
  7. 解决高版本 Google Chrome 扩展程序强制停用问题 -摘自网络
  8. 使用 .NET 平台,如何玩转 Universal Windows 应用?
  9. 13. vs2010 ClientID bug处理
  10. 转——iptables详细配置
  11. Mysql 执行计划分析
  12. Android提高第二篇之SurfaceView的基本使用
  13. Eclipse rap 富客户端开发总结(10) : Rap不同系统间的差异和处理方式
  14. ftp传二进制文件时一定要用二进制模式,否则内容会有变化,造成后处理莫名其妙的错误,还以为传输前后内容一致,其实已变化。
  15. 【Android 系统开发】Android JNI 之 JNIEnv 解析
  16. ajax 原生态和jquery封装区别
  17. vue实现一个简易Popover组件
  18. vue 动态插入组件
  19. docker之小记一
  20. spark pyspark 常用算法实现

热门文章

  1. Java描述语言、国家和地理的类——Locale
  2. zipalign 文件路径问题
  3. 获取合并单元格中值的一个方法POI
  4. Solaris 11的自动化安装(AI server)的搭建
  5. C中程序的内存分配
  6. 网络编程Socket之TCP之close/shutdown具体解释(续)
  7. 在VC++中启用内存泄露检测
  8. 与众不同 windows phone (22) - Device(设备)之摄像头(硬件快门, 自动对焦, 实时修改捕获视频)
  9. HDU 3473 Minimum Sum (划分树)
  10. 得到一个临时的文件名称(使用GetTempFileName API函数)