Unity的Mesh合并(0)

前言

unity引擎中渲染代价的指标是场景中网格(Mesh)的数量,对显卡来说渲染一个100面的物体和渲染一个1500面的物体几乎是等价的,于是当多个物体的材质(Shader)相同时,可以把他们的网格合并起来,然后共用一个材料(Material)来降低渲染的成本,达成优化游戏体验的效果。

这里我们把对材料的共用模糊化了,其实这也是一个复杂的过程,后文中会详细描述其原理和算法。



什么样的物体可以合并?

场景中有那么多物体,在进行合并之前,我们需要先确定哪些物体是可以合并在一起的?

1.shader相同的物体才可以合并

物体属性面板

观察物体的属性面板,我们发现物体可能有不同的材料,这些材料会有不同的shader。shader是也是使用编程语言编写的由gpu处理的,不同的shader渲染出的效果是不一样的。因为我们合并起来的物体的网格是一个合并的网格,使用的是合并的材料,每个材料只能有一个shader属性,这也就限制了我们要合并的物体的材料的shader必须要相同。


合并的物体


合并物体的网格
合并物体的材料

2.要合并的物体需要处于一定范围内

多个物体合并了之后,成为一个物体,若这个物体的mesh分布在场景中的各个地方,无疑是对资源的一个浪费。极端地来说,若我们将一万个物体合并成了一个,摄像机所看到了这一万个之中的一个,其他九千九百九十九个虽然对玩家不可见,但因为是同一个物体,所以也渲染了出来,这样的资源浪费是无必要的。

于是我们在合并之前会将场景划分为多个正方体,每个正方体内的物体才能互相合并在一起,以此避免合并出来物体的mesh分散的情况。

3.物体的光照贴图需要相同(lightmapindex属性相同)




一个很General的算法


变量的数据结构及意义

在此处先将mesh合并整个过程的大体算法描述出来,细节部分在后篇展开解释。

当然在描述算法前,先说明算法中用到的变量的数据结构及其意义:

List<MeshFilter> AllMeshFiltersInScene : 场景中所有meshfilter的链表

List<MeshRender> AllMeshRenderersInScene : 场景中所有meshrenderer的链表

List<GameObject> AllGameobjectsInScene : 场景中所有Gameobject的链表

Dictionary<Shader, Dictionary<Texture2d, List<int>> ShaderToTextures  : 场景中所有的Shader到其贴图的映射(在合并之前,所有贴图都是贴在材料之上的,这些材料有自己的Shader,就视为这个贴图的Shader。只有Shader相同的贴图才能打包到一个图集中,他们的mesh才能合并在一起)

List<List<Gameobjcet>> CubesOfGameobjects : 场景中的正方体数组,里面存着这个正方体里的物体

Dictionary<Gameobject, int> GameObjectToIndex : 建立物体到其索引的映射


算法

1.FindAllMeshesInScene : 找到场景中所有MeshFilter组件,存在AllMeshFiltersInScene,据其还可以获得带这个组件的物体存在AllGameobjectsInScene 以及这个物体的其他有用组件如MeshRenderer存在AllMeshRenderersInScene

2.PackAllTexturesInScene && DividingTextures: 将场景内所有的贴图打包成若干个图集(图集,即是贴图的集合;如前所述,Mesh合并之后多个物体成为一个物体,这个物体使用的是一个合并的Mesh,合并的材料,这个合并的材料当然就有一个合并的贴图集合,即为图集)

3.DoCombine : 遍历场景内的每个正方体,对其内的物体进行合并条件判断后,分组进行合并

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 原文地址 http://www.fx114.net/qa-75-172454.aspx 使用Profiler工具...
    IongX阅读 5,837评论 1 11
  • 111. [动画系统]如何将其他类型的动画转换成关键帧动画? 动画->点缓存->关键帧 112. [动画]Unit...
    胤醚貔貅阅读 12,984评论 3 90
  • 有一次,我问老艾,你怎么描述咱们的夫妻相处模式?他沉思半晌来了一句掷地有声的总结:咱俩像是 a team。 我恍惚...
    弘晓随喜阅读 313评论 0 2
  • 今天读村上的跑步,里面有句话,持之以恒,不乱节奏。学英语的一大障碍就是很难长期的保持相同的节奏。但那些不认识的词,...
    鱼翅后花园阅读 233评论 0 0
  • 雨霁出晴日, 清风云漾天。 闲看古人赋, 黄叶落书前。
    飞飞_b4dc阅读 278评论 2 7