public void RegisterToBatchedUpdate(IBatchedUpdateHandler batchUpdateHandler, int batchInterval)
        {
            batchInterval = Mathf.Clamp(batchInterval, 1, int.MaxValue);

            // if : It doesn't have this Interface
            if (!BatchUpdateHandlerTracker.Contains(batchUpdateHandler))
            {
                int instanceIndex = HasThisInstance(batchInterval);

                if (instanceIndex == -1)
                {
                    BatchUpdateInstances.Add(new BatchUpdateInstance(batchInterval));
                    instanceIndex = BatchUpdateInstances.Count - 1;
                    NumberOfInstances++;
                }

                int bucketIndex = BatchUpdateInstances[instanceIndex].AddToBucket(batchUpdateHandler);
                BatchUpdateHandlerTracker.Add(
                    batchUpdateHandler,
                    new UpdateInfo()
                {
                    instanceIndex = instanceIndex,
                    bucketIndex   = bucketIndex
                }
                    );

                return;
            }

            //Debug.LogError(string.Format("{0} is already in registered in BatchUpdate", batchUpdateHandler));
        }
        private void ShiftInstanceIndexForRemoving(int removingIndex)
        {
            int numberOfItem = BatchUpdateHandlerTracker.Count;

            IBatchedUpdateHandler[] batchedUpdateHandlers = new IBatchedUpdateHandler[numberOfItem];
            ICollection             keys = BatchUpdateHandlerTracker.Keys;

            keys.CopyTo(batchedUpdateHandlers, 0);

            ICollection values = BatchUpdateHandlerTracker.Values;

            UpdateInfo[] updateInfos = new UpdateInfo[numberOfItem];
            values.CopyTo(updateInfos, 0);

            for (int i = 0; i < numberOfItem; i++)
            {
                if (updateInfos[i].instanceIndex > 0 && updateInfos[i].instanceIndex > removingIndex)
                {
                    //Debug.Log(string.Format(
                    //    "InstanceRemoving({0}) : InstanceIndex_PREV ({1}) : InstanceIndex_NEW ({2})",
                    //    updateInfos[i].instanceIndex,
                    //    updateInfos[i].instanceIndex,
                    //    updateInfos[i].instanceIndex - 1));

                    updateInfos[i].instanceIndex--;
                    BatchUpdateHandlerTracker[batchedUpdateHandlers[i]] = updateInfos[i];
                }
            }
        }
                public bool AddToBucket(IBatchedUpdateHandler batchUpdateHandler)
                {
                    if (HashSetForIBatchHandler.Add(batchUpdateHandler))
                    {
                        NumberOfBatchedUpdateHandlerInBucket++;
                        return(true);
                    }

                    return(false);
                }
            public bool RemovedFromBucket(IBatchedUpdateHandler batchUpdateHandler, int bucketIndex)
            {
                if (bucketIndex >= NumberOfActiveBucket)
                {
                    //Debug.LogError(string.Format("bucketIndex({0}) >= NumberOfActiveBucket({1}) : Failed To Remove", bucketIndex, NumberOfActiveBucket));
                    return(false);
                }

                return(BatchUpdateBuckets[bucketIndex].Remove(batchUpdateHandler));
            }
        public void UnregisterFromBatchedUpdate(IBatchedUpdateHandler batchUpdateHandler)
        {
            UpdateInfo updateInfo = GetUpdateInfoInBatchedUpdateTracker(HasTheKeyInBatchUpdateTracker(batchUpdateHandler));

            if (updateInfo != null)
            {
                _queueToRemove.Enqueue(new RemoveInfo()
                {
                    batchedUpdateHandler = batchUpdateHandler, updateInfo = updateInfo
                });
                //Debug.LogError(string.Format("EnquedToRemove : InstanceIndex({0}), BucketIndex ({1})", updateInfo.instanceIndex, updateInfo.bucketIndex));
            }
        }
                public bool Remove(IBatchedUpdateHandler batchUpdateHandler)
                {
                    if (HashSetForIBatchHandler.Contains(batchUpdateHandler))
                    {
                        HashSetForIBatchHandler.Remove(batchUpdateHandler);
                        NumberOfBatchedUpdateHandlerInBucket--;

                        return(true);
                    }

                    //Debug.LogError(string.Format("BatchUpdteHander = {0}, could not be found on the following bucket", batchUpdateHandler));

                    return(false);
                }
        private int HasTheKeyInBatchUpdateTracker(IBatchedUpdateHandler batchedUpdateHandlerReference)
        {
            int         index     = 0;
            ICollection keyValues = BatchUpdateHandlerTracker.Keys;

            foreach (IBatchedUpdateHandler batchedUpdateHandler in keyValues)
            {
                if (batchedUpdateHandlerReference == batchedUpdateHandler)
                {
                    return(index);
                }

                index++;
            }

            return(-1);
        }
Exemple #8
0
        private void TrackerView()
        {
            showTracker.boolValue = EditorGUILayout.Foldout(
                showTracker.boolValue,
                showTracker.name
                );

            if (showTracker.boolValue)
            {
                int numberOfItem = _reference.BatchUpdateHandlerTracker.Count;

                IBatchedUpdateHandler[] batchedUpdateHandlers = new IBatchedUpdateHandler[numberOfItem];
                ICollection             keys = _reference.BatchUpdateHandlerTracker.Keys;
                keys.CopyTo(batchedUpdateHandlers, 0);

                BatchedUpdate.UpdateInfo[] updateInfos = new BatchedUpdate.UpdateInfo[numberOfItem];
                ICollection values = _reference.BatchUpdateHandlerTracker.Values;
                values.CopyTo(updateInfos, 0);

                EditorGUI.indentLevel += 1;

                for (int i = 0; i < numberOfItem; i++)
                {
                    EditorGUILayout.BeginVertical(GUI.skin.box);
                    {
                        EditorGUILayout.LabelField(string.Format("Element({0})", i), EditorStyles.boldLabel);

                        EditorGUI.indentLevel += 1;

                        EditorGUILayout.BeginHorizontal();
                        {
                            EditorGUILayout.LabelField(string.Format("Key : {0}", batchedUpdateHandlers[i]));
                            EditorGUILayout.LabelField(string.Format("Value : {0}", batchedUpdateHandlers[i]));
                        }
                        EditorGUILayout.EndHorizontal();

                        EditorGUI.indentLevel -= 1;
                    }
                    EditorGUILayout.EndVertical();
                }

                EditorGUI.indentLevel -= 1;
            }
        }
            public int AddToBucket(IBatchedUpdateHandler batchUpdateHandler)
            {
                int currentBucketIndex = _currentBucketIndex;

                if (currentBucketIndex >= NumberOfActiveBucket && NumberOfActiveBucket < Interval)
                {
                    BatchUpdateBuckets.Add(new BatchUpdateBucket(currentBucketIndex, Interval));
                    NumberOfActiveBucket++;
                }


                BatchUpdateBuckets[currentBucketIndex].AddToBucket(batchUpdateHandler);

                _currentBucketIndex++;
                if (_currentBucketIndex >= Interval)
                {
                    _currentBucketIndex = 0;
                }

                return(currentBucketIndex);
            }