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

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

博客园 - 千里马肝

vertex compression所遇到的问题 depth and distance Linear or non-linear shadow maps? 实施vertex compression所遇到的各种问题和解决办法 【转】編譯Ogre1.9 IOS Dependencies及Ogre Source步驟及相關注意事項… 画之国 Le tableau (2011) 关于H.264 x264 h264 AVC1 解决Visual Studio 2010/2012的RC4011 warnings 解决Visual Studio 2010/2012在调试时lock文件的方法 神片和神回复 3DS Max 2014 features revealed 【西川善司】PLAYSTATION4图形讲座(后篇) [ 【西川善司】PLAYSTATION4图形讲座(前篇) 趣文:程序员/开发人员的真实生活 【转】25 things you probably didn't know about the 3ds Max SDK [讣告]“D之食卓”等代表作制作人饭野贤治逝世 楚汉传奇 【翻译】揭晓「Agni's Philosophy」幕后的"技术编" 【PS3/XB360】DEAD OR ALIVE 5 制作采访
模型数据作渲染优化时遇到的问题
千里马肝 · 2014-03-22 · via 博客园 - 千里马肝

前提:美术很随意得使用贴图、材质,大量的材质虽然名称不同,但是实际上材质属性是相同的。

于是,在导出时,在依次处理材质时,应该将新的材质属性与已经收集到的材质进行对比,如果是相同的,则使用已存在的材质。

同时,虽然mesh中的submesh其实是根据MatID来作划分,但是一般情况下,mesh中的submesh的vertex decl通常是完全相同的。

那么其实可以将所有相同的vertex decl的submesh合并在同一个geometry(VB)中,submesh使用不同的index buffer来绘制,减少绘制时的VB切换。

于是,就有了shared geometry的共用,如果submesh的vertex decl与之不同(例如ABC是diffuseMap,DE是diffuseMap + specularMap,FGH是diffuseMap + specularMap + normalMap),则自己使用独立的geometry来绘制。

另外,还要对于mesh中所有的submesh所使用的material进行排序,以减少不必要的state切换。

而且还有一个好处是,material的数量、mesh的大小都会减少,意味着减少了磁盘IO和文件解析所需要的时间。

接下来,就是本文的重点出现了。

问题总有2个:

1. 想象中优化后的场景目录的文件数量和大小,都应该会相应减少。但实际中发现,的确大多数模型数据都减少了十几K到几十K不等,但是少数模型的mesh尺寸变大了。

这个现象很奇怪,为了分析原因,我使用了工具对两者进行了二进制对比。

有意思的是,变大的文件,例如之前的十六进制数据为: AB CD EF GH,变大的数据变成AB CD 00 00 EF GH 00 00。

经验告诉我,肯定是某些原先使用16bits描述的数值,现在变成32bits了。

相信朋友们已经猜到了原因,即合并submesh之前,每一个geometry大小都是65535以内,于是16bits IB就够了

合并之后,vertex数量超过了65535,于是我的导出插件自动切换为32bits IB来描述了

通过搜索资料,了解到10年前的GPU对于32bits IB的处理,除了带宽上略有影响之外,并不会有额外的性能惩罚

而随之优化带来的batch减少以及VB等state切换所带来的FPS提升,我的结论是这样的优化是值得的

进一步的优化思考是,我目前是使用的triangle list保存的IB,即一个face使用3个index;如果改为triangle trip,那么IB是很有可能控制在65535之内的

2. 美术不一定会将同一个物体的多个子物体合并(Attach),例如手机:显示屏幕、外壳、电池、天线,是分开为多个mesh存在,然后合成一个group。

这样子并不会影响实际使用中的操作,因为毕竟scene中还是有一个叫“手机”的node。

但是理论上,我们还是希望这几个物体合并在一起,甚至想到说,既然上述的material和geometry的优化,那为什么不把整个场景都在导出时自动merge到一起呢?

然后我想当然得写了一个maxscript,在导出之前会自动将场景中所有的mesh合并在一起。

但是实际情况是,虽然感觉上应该会更流畅,单个scene在观察时也会有些许提升,但是当画面是由多个scene分块构成时,camera frustum的cull就废掉了。

哪怕只有scene A的一棵小草被看到,整个scene都会被绘制出来,反而会影响到渲染效率。

优化无止境,同学需努力。