使用CLI开发高性能3D Engine(2)上
[IT168 技术文档]CLI与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;
};
