// 功能:添加一个对象 // 说明:这里并不检测容器是不是已经缓存该对象,那样效率不高,但这个接口也可能造成误用 // 比如在脚本中每调用一次get_obj接口,就会生成一个FCRefObj对象, 如果连续调用多次,会造成瞬时内存增长 // 解决方法是可以像ulua一样,添加一个反向列表,通过obj查找已经存在的IntPtr, 但这个会增加额外的开销 public static long PushObj <_Ty>(_Ty obj) // where _Ty : class { if (obj == null) { return(0); } FCRefObj ref_obj; if (m_Obj2ID.TryGetValue(obj, out ref_obj)) { ref_obj.m_nRef++; // 增加一下引用计数 return(ref_obj.m_nPtr); } ref_obj = new FCRefObj(); ref_obj.m_nType = obj != null?obj.GetType() : typeof(_Ty); ref_obj.m_nRef = 1; ref_obj.m_obj = obj; ref_obj.m_bNew = 0; long nPtr = ++m_nObjID; ref_obj.m_nPtr = nPtr; m_AllObj[nPtr] = ref_obj; m_Obj2ID[obj] = ref_obj; return(nPtr); }
// 功能:脚本层调用强制转换的接口 public static void CastObj(long L) { long nThisPtr = FCLibHelper.fc_get_inport_obj_ptr(L); int nCastNameID = FCLibHelper.fc_get_int(L, 0); FCRefObj ref_obj = null; if (m_AllObj.TryGetValue(nThisPtr, out ref_obj)) { } }
public static _Ty GetObj <_Ty>(long nIntPtr)// where _Ty : class { FCRefObj ref_obj = null; if (m_AllObj.TryGetValue(nIntPtr, out ref_obj)) { _Ty ret = (_Ty)ref_obj.m_obj; return(ret); } return(default(_Ty)); }
static void TryDestoryObject(FCRefObj ref_obj) { if (ref_obj.m_nType == typeof(GameObject)) { GameObject obj = (GameObject)ref_obj.m_obj; if (obj != null) { GameObject.DestroyImmediate(obj); } } }
public static long PushObj(Type nType) { FCRefObj ref_obj = new FCRefObj(); ref_obj.m_nType = nType; ref_obj.m_nRef = 1; ref_obj.m_obj = nType; long nPtr = ++m_nObjID; m_AllObj[nPtr] = ref_obj; return(nPtr); }
// 功能:添加一个new出来的对象 public static long PushNewObj <_Ty>(_Ty obj) { FCRefObj ref_obj = new FCRefObj(); ref_obj.m_nType = typeof(_Ty); ref_obj.m_nRef = 1; ref_obj.m_obj = obj; long nPtr = ++m_nObjID; m_AllObj[nPtr] = ref_obj; return(nPtr); }
//public static _Ty GetStructObj<_Ty>(long nIntPtr)// where _Ty : struct //{ // FCRefObj ref_obj = null; // if (m_AllObj.TryGetValue(nIntPtr, out ref_obj)) // { // Type nType = typeof(_Ty); // if (nType.Equals(ref_obj.m_nType)) // { // _Ty ret = (_Ty)ref_obj.m_obj; // return ret; // } // } // return default(_Ty); //} public static long NewObj <_Ty>() where _Ty : new() //where _Ty : class, new() { FCRefObj ref_obj = new FCRefObj(); ref_obj.m_nType = typeof(_Ty); ref_obj.m_nRef = 1; ref_obj.m_obj = new _Ty(); long nPtr = ++m_nObjID; m_AllObj[nPtr] = ref_obj; return(nPtr); }
// 功能:添加一个对象 // 说明:这里并不检测容器是不是已经缓存该对象,那样效率不高,但这个接口也可能造成误用 // 比如在脚本中每调用一次get_obj接口,就会生成一个FCRefObj对象, 如果连续调用多次,会造成瞬时内存增长 // 解决方法是可以像ulua一样,添加一个反向列表,通过obj查找已经存在的IntPtr, 但这个会增加额外的开销 public static long PushObj <_Ty>(_Ty obj) // where _Ty : class { FCRefObj ref_obj = new FCRefObj(); ref_obj.m_nType = obj != null?obj.GetType() : typeof(_Ty); ref_obj.m_nRef = 1; ref_obj.m_obj = obj; long nPtr = ++m_nObjID; m_AllObj[nPtr] = ref_obj; return(nPtr); }
public static void ReleaseRef(long nIntPtr) { FCRefObj ref_obj = null; if (m_AllObj.TryGetValue(nIntPtr, out ref_obj)) { ref_obj.m_nRef--; if (0 == ref_obj.m_nRef) { m_AllObj.Remove(nIntPtr); ref_obj.m_obj = null; } } }
public static _Ty GetObj <_Ty>(long nIntPtr)// where _Ty : class { FCRefObj ref_obj = null; if (m_AllObj.TryGetValue(nIntPtr, out ref_obj)) { Type nType = typeof(_Ty); //if(nType.Equals(ref_obj.m_nType)) //{ _Ty ret = (_Ty)ref_obj.m_obj; return(ret); //} } return(default(_Ty)); }
public static void ReleaseRef(long nIntPtr) { FCRefObj ref_obj = null; if (m_AllObj.TryGetValue(nIntPtr, out ref_obj)) { ref_obj.m_nRef--; if (0 == ref_obj.m_nRef) { m_AllObj.Remove(nIntPtr); if (ref_obj.m_obj != null) { m_Obj2ID.Remove(ref_obj.m_obj); } // 尝试释放 if (ref_obj.m_bNew != 0) { TryDestoryObject(ref_obj); } ref_obj.m_obj = null; } } }
public static System.Object GetSystemObj(long nIntPtr) { // 先检测这个对象是不是 FC_TEMPLATE_TYPE nTemplateType = (FC_TEMPLATE_TYPE)FCLibHelper.fc_get_value_template_type(nIntPtr); FC_VALUE_TYPE nValueType = (FC_VALUE_TYPE)FCLibHelper.fc_get_value_type(nIntPtr); if (FC_TEMPLATE_TYPE.FC_TEMPLATE_NONE == nTemplateType) { if (nValueType == FC_VALUE_TYPE.FC_VALUE_TYPE_INPORT_CLASS) { FCRefObj ref_obj = null; if (m_AllObj.TryGetValue(nIntPtr, out ref_obj)) { return(ref_obj.m_obj); } } switch (nValueType) { case FC_VALUE_TYPE.FC_VALUE_TYPE_bool: return(FCLibHelper.fc_get_value_bool(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_BYTE: return(FCLibHelper.fc_get_value_byte(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_CHAR: return(FCLibHelper.fc_get_value_char(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_SHORT: return(FCLibHelper.fc_get_value_short(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_USHORT: return(FCLibHelper.fc_get_value_ushort(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_INT: return(FCLibHelper.fc_get_value_int(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_UINT: return(FCLibHelper.fc_get_value_uint(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_FLOAT: return(FCLibHelper.fc_get_value_float(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_DOUBLE: return(FCLibHelper.fc_get_value_double(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_INT64: return(FCLibHelper.fc_get_value_int64(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_UINT64: return(FCLibHelper.fc_get_value_uint64(nIntPtr)); case FC_VALUE_TYPE.FC_VALUE_TYPE_STRING_A: return(FCLibHelper.fc_get_value_string_a(nIntPtr)); // wrap接口中,其实只用到了这个 case FC_VALUE_TYPE.FC_VALUE_TYPE_STRING_W: return(FCLibHelper.fc_get_value_string_a(nIntPtr)); default: break; // 其他的先暂不写了,代码太多了 } } return(null); }