V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  jox0  ›  全部回复第 1 页 / 共 1 页
回复总数  7
2017-06-19 17:12:20 +08:00
回复了 jox0 创建的主题 iDev 请问 UIView 是怎么渲染自己的?
已经过去半年了,这段时间我学习了一下 opengl 绘图,想起来还有这么个帖子

当时苹果的工程师也没有给太多具体的技术细节,只是提到了最终 Core Animation 会 issue OpenGL drawing command 来生成最终的 bitmap。

随着新一代的绘图 API 的出现,现在 Core Animation 的底层很可能不再使用 OpenGL,而转而使用苹果新推出的 Metal。不过这都不重要,重要的是我当初提出的这个问题。

对于一个 UIView,如果不提供 bitmap (设置 layer 的 contents 属性),也不实现 drawRect 或者 CALayer drawing 的那几个 draw 函数,那么一个 UIView 的内容会根据这个 UIView 的状态( backgroundColor,bounds,其实都是 layer 的状态),提交到 render server,并由 render server 调用底层的图形 API 来绘制这个 UIView 的内容,并将最终绘制的 bitmap 结果通过类似 glReadPixels 的 API 从显寸上复制到 CPU 内存里,这部分内存由 CALayer 的内部私有变量来负责持有,这部分数据目前是无法直接获取到的,只能通过 CALayer 的 renderInContext:等 API 间接的取到,这里与 CALayer 的 contents 属性不同,contents 只是用来为一个 CALayer 提供内容的。

所以一个 UIView 有三种方式来生成内容,分别是 drawRect:,设置 layer 的 contents 属性,设置 UIView 本身或者 layer 的属性,这三种方式最终内存占用是一模一样的,但是消耗的 CPU 和 GPU 资源却不同,第一种需要调用 CPU 绘图 API 来绘制图形,CPU bound ;第二种虽然不需要调用 CPU 来绘图,但是可能会使用 CPU 来解压缩图片文件,所以也是 CPU bound ;第三种 CPU 只负责必要的状态修改,由 GPU 来完成主要的绘图工作,因为 GPU 绘图效率比 CPU 高,所以这种方式应该是效率最高的,整体的性能消耗也最低,GPU bound
2017-03-08 15:33:54 +08:00
回复了 xi_lin 创建的主题 iDev 今天好多人都收到苹果警告信了
@game3108 是的,是可以热更新

@loveuqian 我没有用过这些技术,不过一定程度上也可以理解,据说可以提高开发效率,我没试过,虽然我本人是持谨慎态度的
2017-03-08 14:37:00 +08:00
回复了 xi_lin 创建的主题 iDev 今天好多人都收到苹果警告信了
@game3108 JS 和 Lua 脚本文件随应用打包一起发布就没事,苹果这次主要打击的是 JSPatch ,我在的公司的应用使用的某第三方的 SDK 里使用了 JSPatch ,导致我们也收到了警告,其他的应用没有问题
2017-03-08 13:54:26 +08:00
回复了 xi_lin 创建的主题 iDev 今天好多人都收到苹果警告信了
这次是苹果出手整顿热更新技术的使用,使用 RN 、 weex 、 Hybrid 、 Lua 等技术构建应用的只要不热更新就不会受到影响。
2017-02-16 12:55:41 +08:00
回复了 jox0 创建的主题 iDev 请问 UIView 是怎么渲染自己的?
@ningcool 3Q~ 我用了我的一张 RTI ,这两天正在通过邮件询问 Apple 的一个工程师这方面的问题,过两天如果有答案我再来这里更新
2017-02-13 11:13:59 +08:00
回复了 jox0 创建的主题 iDev 请问 UIView 是怎么渲染自己的?
@ningcool 非常感谢,您说的这些我都了解,我就是想知道 “这些绘制离不开 OpenGL 和 GPU ” 这部分的技术细节,请问您是否了解?
2017-02-12 11:44:27 +08:00
回复了 Cbdy 创建的主题 C c99 的可变长数组是单纯语法糖吗?
不是单纯的语法糖展开, VLA 的长度在运行时决定,开发者无法判断 VLA 的内存是分配在 stack 上还是 heap 上, GCC 会在 stack 上分配内存,长度受 SIZE_MAX 限制,无法检查内存是否分配成功,声明后无法改变长度。

总的来说会用到的地方不多,建议尽量不要使用
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1120 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 12ms · UTC 22:53 · PVG 06:53 · LAX 14:53 · JFK 17:53
Developed with CodeLauncher
♥ Do have faith in what you're doing.