Exemplo n.º 1
0
        private bool _DetachAllSubNodesAsync()
        {
            bool ret = false;

            for (int i = 0; i < mSubNodes.Count; i++)
            {
                GLogicNodeWrapper wrapper = mSubNodes[i];
                wrapper.mLogicNode.NodeStatus = AttachableStatus.Detaching;
            }

            //置脏,导致这棵子树需要进入更新流程//
            IsLogicTreeNeedsUpdate = true;
            IGLogicNode parent = ParentNode;

            while (parent != null && !parent.IsLogicTreeNeedsUpdate)
            {
                parent.IsLogicTreeNeedsUpdate = true;
                parent = parent.ParentNode;
            }

            LogicNodeUpdateOperation updateOp = new LogicNodeUpdateOperation();

            updateOp.mIsRemoveAll   = true;
            updateOp.mIsAddOrRemove = false;
            mAsyncNodeOps.Add(updateOp);

            return(ret);
        }
Exemplo n.º 2
0
        private bool _AttachNodeAsync(IGLogicNode inLogicNode)
        {
            bool ret = false;

            if (inLogicNode == null)
            {
                Log.LMN.LogUtil.Error("MBLogicNode._AttachNodeAsync: inLogicNode is null");
                return(ret);
            }

            //置脏,导致这棵子树需要进入更新流程//
            IsLogicTreeNeedsUpdate = true;
            IGLogicNode parent = ParentNode;

            while (parent != null && !parent.IsLogicTreeNeedsUpdate)
            {
                parent.IsLogicTreeNeedsUpdate = true;
                parent = parent.ParentNode;
            }

            LogicNodeUpdateOperation updateOp = new LogicNodeUpdateOperation();

            updateOp.mIsAddOrRemove = true;
            updateOp.mLogicNode     = inLogicNode;
            mAsyncNodeOps.Add(updateOp);

            ret = true;
            return(ret);
        }
Exemplo n.º 3
0
        /// <summary>
        /// 更新Logic节点树
        /// 导致 IsNodeTreeLocked 为真
        /// </summary>
        public void UpdateLogicTree()
        {
            if (!IsNodeActive)
            {
                return;
            }

            //对树结构上锁, 注意这里不是递归进,因为这个方法本身在递归进//
            mIsNodeTreeLocked = true;

            if (IsLogicTreeNeedsUpdate)
            {
                IsLogicTreeNeedsUpdate = false;

                //注意,这个Update是深度优先的,防止子节点的异步操作被跳过//
                for (int i = 0; i < mSubNodes.Count; i++)
                {
                    mSubNodes[i].mLogicNode.UpdateLogicTree();
                }

                for (int i = 0; i < mAsyncNodeOps.Count; i++)
                {
                    LogicNodeUpdateOperation op = mAsyncNodeOps[i];
                    if (op.mIsAddOrRemove)
                    {
                        _AttachNodeSync(op.mLogicNode);
                    }
                    else
                    {
                        if (op.mIsRemoveAll)
                        {
                            _DetachAllSubNodesSync();
                        }
                        else
                        {
                            _DetachNodeSync(op.mLogicNode);
                        }
                    }
                }
                mAsyncNodeOps.Clear();
            }

            //对树结构解锁, 注意这里不是递归进,因为这个方法本身在递归进//
            mIsNodeTreeLocked = false;
        }
Exemplo n.º 4
0
        private bool _DetachNodeAsync(IGLogicNode inLogicNode)
        {
            bool ret = false;

            if (inLogicNode == null)
            {
                //请替换成你的log函数//
                Log.LMN.LogUtil.Error("ObjLogicNode._DetachNodeAsync: inLogicNode is null");
                return(ret);
            }

            //快速找出节点位置//
            int index = PrioritySortUtil.GetDecSeqRefArrayFirstIndex <GLogicNodeWrapper>(inLogicNode.LogicNodePriority, mSubNodes);

            for (int i = index; i < mSubNodes.Count && mSubNodes[i].PriorityVal == inLogicNode.LogicNodePriority; i++)
            {
                GLogicNodeWrapper wrapper = mSubNodes[i];
                if (wrapper.mLogicNode == inLogicNode)
                {
                    wrapper.mLogicNode.NodeStatus = AttachableStatus.Detaching;
                    break;
                }
            }

            //置脏,导致这棵子树需要进入更新流程//
            IsLogicTreeNeedsUpdate = true;
            IGLogicNode parent = ParentNode;

            while (parent != null && !parent.IsLogicTreeNeedsUpdate)
            {
                parent.IsLogicTreeNeedsUpdate = true;
                parent = parent.ParentNode;
            }

            LogicNodeUpdateOperation updateOp = new LogicNodeUpdateOperation();

            updateOp.mIsAddOrRemove = false;
            updateOp.mLogicNode     = inLogicNode;
            mAsyncNodeOps.Add(updateOp);

            ret = true;
            return(ret);
        }