起
Maya自从Alias被autodesk收购之后就诟病不断,具体表现为特别容易崩溃:操作大场景容易崩溃,胡乱玩几下碰到RP不好的时候也还是挂你没商量。可是为什么会发生这样的情况呢?
承
上过计算机专业相关课程的人(不是我这种野路子土专家出身)都晓得,程序的内存区域有静态区(Static),堆(Heap),还有栈(Stack)。其中Static和Stack都和我们没多少关系,而Heap就是个巨大的问题来源。一般来说,数据密集型软件,上至Oracle,下至ZBrush,都需要做自己的内存管理,那种东一个new西一个delete对于健壮稳定的商业软件来说是绝对不行的。可惜,3dsmax没有内存管理,所以大家还是尽量向64bit转吧。任何程序都会有一个能够分配的Heap容量。这个容量主要取决于操作系统,也就是你用的是32bit的还是64bit的OS。不可能有人在不支持64bit的CPU上安装64bit的OS,所以那种“我可以在我的32bit的CPU上装个64bit Maya吗”的念头就可以打住了。对于现在的64bit Vista来说,每个进程Process能够拥有的Heap容量上限为6G。不要跟我争辩说是64bit等于2的64次方还是啥能够分配多少PB的内存,那些都是没经过调查的的胡扯。6G是编译器能够给你的最大容量,而且,你的那个指针最大能够接受的容量为1G,不管你用的是否64bit指针,也就是说char* p = new char[0x40000000]连续执行六次后Process就完蛋。所以,对于目前广泛使用的32bit的Maya来说,它能够使用最多1.6G的内存,无论你自己加了多少内存条。这个是最理想情况了。因为有这么大不代表你能够分配这么大,假设你载入一个1.5G的模型,基本上Maya就挂定了。模型的大小可不是.ma或者.mb的大小,而是数据量的大小,就是你的Vertex、Normal、UV这些几何体数据加上Index拓扑的数值数据,一个FP32占4 Byte,一个unsigned short占2 Byte如此等等。
而且一定要打掉一个幻想,就是妄图通过OS提供的功能去检测一个Process的内存使用情况。使用GlobalMemoryStatusEx这个函数是无法获得真正意义上的,当前可分配的最大内存数目,具体的可以用模拟内存碎片来实现。它显示的只是外部情况,只是个程序占据内存的总数,和程序的当前内存结构无关。
转
好在Maya也有自知之明,提供了一个MEL命令memory去输出内存统计情况。于是乎我写了一个简单的MEL命令去输出当Node删除或者新建时候的内存状态并输出。代码在下载,拆开来看吧,很简单的。
结
我个人认为,基于DAG节点的软件,包括Autodesk Maya、SideFX Houdini、Apple Shake等都比较容易崩溃,因为它们为了实现内部的节点联系不得不牺牲集中式的内存管理,长时间运行下来导致内存碎片特别多。再加上Windows平台目前基本上是Visual C++的天下,微软再怎么如何升级它的msvcr与msvcp这两个C\C++运行库也无济于事,OS有限制,Heap上能够分配的最大内存容量取决于最大空余Segment的大小。据说Linux下要好很多,具体的我也没条件测试,等过几天买了新电脑再装个Ubuntu跑跑看,笔记本实在是难受。这里是异常抛出的地方,test检测指针是不是那个啥0x100,是的话就错咯~于是挂了就。这个地方希望autodesk的人能够看到呵呵。