Memory Dog for Autodesk Maya
起
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的人能夠看到呵呵。
轉載于:https://www.cnblogs.com/Jedimaster/archive/2009/03/08/1406439.html
總結
以上是生活随笔為你收集整理的Memory Dog for Autodesk Maya的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【转载】一个男人关心的东西 决定了他的层
- 下一篇: LuoGuP4721:【模板】分治 FF