技术开发 频道

使用CLI开发高性能3D Engine(2)上

[IT168 技术文档]CLIC++混合开发第二部分:

   

二.托管类中存放C++成员变量  

 

 

 在托管类中,很多时候需要存放C++数据类型。但是因为托管C++内存有可能变换,考虑到拷贝构造及性能问题,CLI不允许在托管类内直接存放C++对象实例,但存放一个C++原生指针是被允许的。虽然使用起来可能有些麻烦,却也能基本解决我们的问题。下面是一个CLI类包装C++接口的简单例子(请看代码注释):  

public ref struct vwEye : public Item ...{ v3dEye* m_pEye; //C++摄像机对象指针 GC_DECLARE_CLASS(vwEye); //此处是victory引擎申明脚本脚本对象用的宏,负责接口查询和克隆 vwEye(); //缺省构造器,我们可以在内部实现 m_pEye = new v3dEye vwEye( v3dEye* pEye ); //根据C++摄像机指针构造CLI摄像机对象,m_pEye=pEye,AddRef处理生存 ~vwEye(); //析构函数,gc对象释放的时候调用 !vwEye(); // C++句柄内存析构时调用,通常用来清理C++对象,我们此处可以 m_pEye->Release() vwVector3^ ToScreen( vwVector3^ Pos ); void SetPosDirUp( vwVector3^ Pos , vwVector3^ Dir , vwVector3^ Up ); void Move( int iAxis , float dist ); vwVector3^ GetDir(); virtual BOOL Update() override; //CLI的虚函数,此处重载了Item的Update,注意override关键字 //下面是victory引擎gcScript的脚本封装 virtual gcScript:: GC_Object ^ callfunc(gcScript::GCInter_Process % vms, System::String ^ fun, gcScript:: GC_Argument % args) override; virtual gcScript:: GC_Object ^ getvalue(gcScript::GCInter_Process % vms, System::String ^ fun) override; virtual bool setvalue(gcScript::GCInter_Process % vms, System::String ^ fun,gcScript::GC_Object ^ argv) override; };

 

 

0
相关文章