2篇前置博文:
C#自带GC算法在独立使用时无需额外处理,cpp的话各种内存管理技术也很多如智能指针。
在这里混合编程下,c#层作为脚本使用时,很容易在cpp层书写核心代码,几乎2倍内存的消耗,但是这个不是本文的重点,本文阐述他们之间的内存关系和混合管理方式。这里的方案是cpp层通过handle来指向c#,c#端进行handle和实际的对象的引用。下面通过案例来阐述这种方式。
C#层
public class GameObject : object
{
private long _native_handle;//cpp ptr for
};
//提供全局c# 对象 c++引用
static class CppReferenceInternal
{
public static Dictionary global_cpp_ref = new Dictionary();
public static void Retain(object obj)
{
int hash = obj.GetHashCode();
if (global_cpp_ref.ContainsKey(hash) == false)
{
global_cpp_ref.Add(hash, obj);
}
}
public static void Release(object obj)
{
int hash = obj.GetHashCode();
if (global_cpp_ref.ContainsKey(hash))
{
global_cpp_ref.Remove(hash);
}
global_cpp_ref = new Dictionary();
}
}
C++层
class GameObject
{
public:
static GameObject*Create()
{
GameObject *ret = new GameObject();
return ret;
};
GameObject()
{
AllocMonoObject();
}
~GameObject()
{
FreeMonoObject();
}
private:
bool FreeMonoObject()
{
MonoObjectRelease(mono_object_handle);
mono_object_handle = nullptr;
return true;
}
bool AllocMonoObject()
{
MonoClass *cls = mono_class_from_name(mono_assembly_get_image(mono_stick_engine_dll), "", "GameObject");
mono_object_handle = mono_object_new(vm, cls);
//call default ctor
mono_runtime_object_init(mono_object_handle);
MonoObjectRetatin(mono_object_handle);
return true;
}
private:
MonoObject * mono_object_handle = nullptr;
};
这里只是其中一种管理方式的基本示例。