C#和C/C++混合编程系列2-内存管理

梦想游戏人
目录:
C#

2篇前置博文:

Http服务器-第十步加入基于Mono平台的C#脚本支持      http://dreamyouxi.com:7129/blog/1277

架构9-引入C#混合编程-服务端概述      http://dreamyouxi.com:7129/blog/1298

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<int, object> global_cpp_ref = new Dictionary<int, object>();
    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);
        }
    }
}

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;
	};

这里只是其中一种管理方式的基本示例。

Scroll Up