日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

前言:

原本目的是想尋求一種方式來對cpu計算密集型代碼部分進行加速替代,但是maya中mll插件的插件套路在傳遞參數上會占用大量的io,對于數據比較大的部分也會有相當消耗。如果全部寫在c++部分又感覺缺乏靈活性,所以琢磨的一種可以在python中實現邏輯,pyd中實現算法的方式。

問題:

純python api來編譯pyd的計算模塊會有大量的數據轉換,比如獲取模型所有的頂點會得到MFloatPointArray,獲取所有SkinMesh的蒙皮權重會得到MDoubleArray,這些數據直接獲取都很快,但是要把他們轉換成python api所支持的數據格式就很麻煩,計算完成后還要轉換回來,一旦模型面熟很高很耗費時間。作為一個懶人不能忍~

思路:

maya api 1.0使用swig做封裝,借助swig解封PyObject指針的功能自動將python指針對象轉換成maya內置的M數據類型。

流程:

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

    4. 針對所有平臺,設置一下vs工程,方便代碼提示

    輸出格式

    包含目錄,庫目錄

    依賴庫,只用基本的數據類型

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

    隨便寫一個累加的測試函數

    // 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"

    添加到工程,設置一下生成事件,每次編譯之前先生成包裹函數

    接下來編譯就可以了

    maya中測試:

    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)

    優化:

    swig會生成兩個文件py和pyd的,py是模塊名,pyd是_模塊名,要不然導入python模塊會失敗,要把pyd模塊名的修改成TestMayaApi,只修改工程設置里面的輸出文件是不行的,導入會報錯,需要修改源碼,這樣我們只需要pyd就可以了。

  • 先將輸出文件修改
  • 2. 禁用生成事件,改為手動運行cmd

    3. 將swig生成的compute_wrap.cxx添加進來,搜索替換模塊名

    每次運行swig都要重新生成替換。

    重新生成后我們就不需要.py文件了,直接刪掉,只保留TestMayaApi.pyd

    返回值的坑:

    c++函數不能直接返回maya內置類型,如果函數定義成這樣,python中接受到的返回值是swig object指針,傳遞給其它python api時會出錯

    MIntArray testMIntArray(MIntArray input)

    解決辦法:

    將參數傳遞改成引用類型,這樣就可以直接修改數據,不用返回,和api 1.0大多數做法一致

    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測試代碼

    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

    總結:

    算是maya plugin和python api的之外的一種計算模塊的方式,編譯之后maya 2016以下版本可以共用一個pyd,其它版本可能要單獨編譯,沒測試很全。好處就是用起來更舒服,不用轉換數據,和python api無縫銜接,可以直接用MxxxArray,并且支持OpenMP多線程計算。

    總結

    以上是生活随笔為你收集整理的maya崩溃自动保存路径_maya 使用swig将插件编译成pyd,无缝使用内置数据实现加速计算模块...的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。