Example #1
0
    // 功能:添加一个对象

    // 说明:这里并不检测容器是不是已经缓存该对象,那样效率不高,但这个接口也可能造成误用
    // 比如在脚本中每调用一次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);
    }
Example #2
0
    // 功能:脚本层调用强制转换的接口
    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))
        {
        }
    }
Example #3
0
    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));
    }
Example #4
0
 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);
         }
     }
 }
Example #5
0
    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);
    }
Example #6
0
    // 功能:添加一个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);
    }
Example #7
0
    //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);
    }
Example #8
0
    // 功能:添加一个对象
    // 说明:这里并不检测容器是不是已经缓存该对象,那样效率不高,但这个接口也可能造成误用
    // 比如在脚本中每调用一次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);
    }
Example #9
0
    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;
            }
        }
    }
Example #10
0
    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));
    }
Example #11
0
    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;
            }
        }
    }
Example #12
0
    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);
    }