maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...
前言:
原本目的是想尋求一種方式來(lái)對(duì)cpu計(jì)算密集型代碼部分進(jìn)行加速替代,但是maya中mll插件的插件套路在傳遞參數(shù)上會(huì)占用大量的io,對(duì)于數(shù)據(jù)比較大的部分也會(huì)有相當(dāng)消耗。如果全部寫在c++部分又感覺(jué)缺乏靈活性,所以琢磨的一種可以在python中實(shí)現(xiàn)邏輯,pyd中實(shí)現(xiàn)算法的方式。
問(wèn)題:
純python api來(lái)編譯pyd的計(jì)算模塊會(huì)有大量的數(shù)據(jù)轉(zhuǎn)換,比如獲取模型所有的頂點(diǎn)會(huì)得到MFloatPointArray,獲取所有SkinMesh的蒙皮權(quán)重會(huì)得到MDoubleArray,這些數(shù)據(jù)直接獲取都很快,但是要把他們轉(zhuǎn)換成python api所支持的數(shù)據(jù)格式就很麻煩,計(jì)算完成后還要轉(zhuǎn)換回來(lái),一旦模型面熟很高很耗費(fèi)時(shí)間。作為一個(gè)懶人不能忍~
思路:
maya api 1.0使用swig做封裝,借助swig解封PyObject指針的功能自動(dòng)將python指針對(duì)象轉(zhuǎn)換成maya內(nèi)置的M數(shù)據(jù)類型。
流程:
3. 添加一個(gè)文件compute.h,我們所有的代碼都放這個(gè)頭文件里面
4. 針對(duì)所有平臺(tái),設(shè)置一下vs工程,方便代碼提示
輸出格式
包含目錄,庫(kù)目錄
依賴庫(kù),只用基本的數(shù)據(jù)類型
輸出文件(帶下劃線,下面有解釋)
隨便寫一個(gè)累加的測(cè)試函數(shù)
// compute.h#pragma once #include <maya/MIntArray.h>int testMIntArray(MIntArray input) {int sum = 0;for (int i = 0; i < input.length(); i++){sum += input[i];}return sum; }編寫swig的compute.i
%module TestMayaApi%{ #include "compute.h" %}%include "compute.h"添加到工程,設(shè)置一下生成事件,每次編譯之前先生成包裹函數(shù)
接下來(lái)編譯就可以了
maya中測(cè)試:
import sys sys.path.append('F:/swig_maya_test/swig_maya_test') import TestMayaApiimport maya.OpenMaya as om iList=om.MIntArray() for i in range(100):iList.append(i)print TestMayaApi.testMIntArray(iList)優(yōu)化:
swig會(huì)生成兩個(gè)文件py和pyd的,py是模塊名,pyd是_模塊名,要不然導(dǎo)入python模塊會(huì)失敗,要把pyd模塊名的修改成TestMayaApi,只修改工程設(shè)置里面的輸出文件是不行的,導(dǎo)入會(huì)報(bào)錯(cuò),需要修改源碼,這樣我們只需要pyd就可以了。
2. 禁用生成事件,改為手動(dòng)運(yùn)行cmd
3. 將swig生成的compute_wrap.cxx添加進(jìn)來(lái),搜索替換模塊名
每次運(yùn)行swig都要重新生成替換。
重新生成后我們就不需要.py文件了,直接刪掉,只保留TestMayaApi.pyd
返回值的坑:
c++函數(shù)不能直接返回maya內(nèi)置類型,如果函數(shù)定義成這樣,python中接受到的返回值是swig object指針,傳遞給其它python api時(shí)會(huì)出錯(cuò)
MIntArray testMIntArray(MIntArray input)解決辦法:
將參數(shù)傳遞改成引用類型,這樣就可以直接修改數(shù)據(jù),不用返回,和api 1.0大多數(shù)做法一致
void testMIntArrayMul(MIntArray input,int mul, MIntArray& output) {output.setLength(input.length());for (int i = 0; i < input.length(); i++){output[i] = input[i] * mul;} }maya測(cè)試代碼
import sys sys.path.append('F:/swig_maya_test/swig_maya_test') import TestMayaApiimport maya.OpenMaya as om iList=om.MIntArray() for i in range(100):iList.append(i)outList=om.MIntArray() TestMayaApi.testMIntArrayMul(iList,2,outList) print outList總結(jié):
算是maya plugin和python api的之外的一種計(jì)算模塊的方式,編譯之后maya 2016以下版本可以共用一個(gè)pyd,其它版本可能要單獨(dú)編譯,沒(méi)測(cè)試很全。好處就是用起來(lái)更舒服,不用轉(zhuǎn)換數(shù)據(jù),和python api無(wú)縫銜接,可以直接用MxxxArray,并且支持OpenMP多線程計(jì)算。
總結(jié)
以上是生活随笔為你收集整理的maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 北京环球影城vip票多少钱
- 下一篇: django异常日志_【python小随