惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
腾讯CDC
D
Docker
The Cloudflare Blog
量子位
爱范儿
爱范儿
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
Vercel News
Vercel News
MyScale Blog
MyScale Blog

博客园 - cm186man

目前个人最喜欢的谷歌浏览器收藏侧边栏插件 3个免费用Claude Code的方法 Win7快捷方式图标不显示解决办法 Unity3D Shader入门指南(二) Unity3D Shader入门指南(一) linux系统date命令详解 使用Installutil安装系统服务方法 各大视频网站广告屏蔽代码 一位程序员的十个忠告 谷歌浏览器双击关闭标签页的扩展插件Pig Toolbox 6款思维导图软件介绍 优秀程序设计的18大原则 常用EXE文件反编译工具 Win7中使用Virtual WiFi说明 Win7删除无线网络连接2的方法 提高VS2010运行速度的方法 软件破解高手常用的破解工具介绍 64位win7系统安装vs2010不成功的解决办法 RPG游戏引擎的设计原理 用户中心 - 博客园
NGUI 减少drawcall规则
cm186man · 2014-11-10 · via 博客园 - cm186man

前置说明一:

Unity中的drawcall定义:

每次引擎准备数据并通知GPU的过程称为一次Draw Call。

Unity(或者说基本所有图形引擎)生成一帧画面的处理过程大致可以这样简化描述:引擎首先经过简单的可见性测试,确定摄像机可以看到的物体,然后把这些物体的顶点(包括本地位置、法线、UV等),(顶点如何组成三角形),变换(就是物体的位置、旋转、缩放、以及摄像机位置等),相关光源,纹理,渲染方式(由材质/Shader决定)等数据准备好,然后通知图形API——或者就简单地看作是通知GPU——开始绘制,GPU基于这些数据,经过一系列运算,在屏幕上画出成千上万的三角形,最终构成一幅图像。

前置说明二:

NGUI中的UIWidget的显示顺序:

每一个UIWidget的显示顺序由depth值决定,跟z轴没关系,而这个depth值是由两部分组成的,一个是UIWidget所在的UIPanel的depth和UIwidget自身的depth值进行加权计算。

并且,UIPanel的权重非常大,可以认为,UIPanel的depth大的所有UIWidget比UIPanel的depth小的所有UIWidget比最后计算的depth一定大。举个例子:

UIPanel1    depth  x                      UIPanel2    depth  y

UIWidget1  depth  m                      UIWidget2  depth  n

只要 x > y,那么不管m和n的大小,UIWidget1最后的depth一定大于UIWidget2。

减少drawcall的规则:

1、同一个UIPanel下的texture和font尽量放在同一个altals下。也表达了另外一个意思,使用同一个altals的元素尽量放在同一个UIPanel下面。

2、如果一个UIPanel下面使用了多个altals,那么尽量让使用相同altals的元素连续,尽量避免altals交叉。

规则1的前半部分好理解。后半部分,参照前面显示顺序问题可以知道。如果使用同一个altals的元素在两个不同的UIPanel下面,这就必然导致它们的drawcall分离。所以即使调整它们的depth一致,也无法合并成一个drawcall.

规则2的意思,举个例子就明白了:

同一个UIPanel下有4个UIWidget,w1,w2,w3,w4。

其中 W1和W2引用altals1。

其中 W3和W4引用altals2。

如果它们的depth顺序为  w1 : 1,w2 :2,w3 : 3,w4 : 4。

那么整个渲染需要2个drawcall,因为渲染顺序为 w1,w2,w3,w4。

而w1和w2公用一个altals,所以可以合并成一个drawcall,同理w3和w4可以合并成一个drawcall。

而如果它们的depth顺序为: w1 : 1,w2 :3,w3 : 2,w4 : 4。

那么整个渲染需要4个drawcall,因为渲染顺序为 w1,w3,w2,w4。

因为w1和w3不是公用一个altals,所以只能分开渲染。同理w3和w2,w2和w4也只能分开渲染。

UI制作强调说明:

使用NGUI制作UI有两大需求,
1 要打开界面要快 所以必须一直存在内存中
2 设置好公共资源 这是减少内存的占用

还有就是公共资源与界面之间的深度问题

NGUI无法导入问题:

导入时闪一下就消失没有反应

这是由于放在中文目录的原因,必须放在英文路径下才可导入

由于unity对中文并没有很好的支持

所以unity开发过程中应尽量避免使用中文路径或文件名