日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...

發(fā)布時(shí)間:2023/12/1 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块... 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言:

原本目的是想尋求一種方式來(lái)對(duì)cpu計(jì)算密集型代碼部分進(jìn)行加速替代,但是maya中mll插件的插件套路在傳遞參數(shù)上會(huì)占用大量的io,對(duì)于數(shù)據(jù)比較大的部分也會(huì)有相當(dāng)消耗。如果全部寫(xiě)在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ù)類(lèi)型。

流程:

  • 下載swig,解壓到本地,路徑添加到添加到環(huán)境變量中
  • 創(chuàng)建一個(gè)空的vs工程
  • 3. 添加一個(gè)文件compute.h,我們所有的代碼都放這個(gè)頭文件里面

    4. 針對(duì)所有平臺(tái),設(shè)置一下vs工程,方便代碼提示

    輸出格式

    包含目錄,庫(kù)目錄

    依賴(lài)庫(kù),只用基本的數(shù)據(jù)類(lèi)型

    輸出文件(帶下劃線,下面有解釋)

    隨便寫(xiě)一個(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; }

    編寫(xiě)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)置類(lèi)型,如果函數(shù)定義成這樣,python中接受到的返回值是swig object指針,傳遞給其它python api時(shí)會(huì)出錯(cuò)

    MIntArray testMIntArray(MIntArray input)

    解決辦法:

    將參數(shù)傳遞改成引用類(lèi)型,這樣就可以直接修改數(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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。