Browse Source

Reduce Observable.notifyObservers allocation

Ben Adams 9 years ago
parent
commit
72d580e4fe
1 changed files with 11 additions and 1 deletions
  1. 11 1
      src/Tools/babylon.observable.ts

+ 11 - 1
src/Tools/babylon.observable.ts

@@ -9,8 +9,13 @@
         * If the callback of a given Observer set skipNextObservers to true the following observers will be ignored
         */
         constructor(mask: number, skipNextObservers = false) {
+            this.initalize(mask, skipNextObservers);
+        }
+
+        public initalize(mask: number, skipNextObservers = false): EventState {
             this.mask = mask;
             this.skipNextObservers = skipNextObservers;
+            return this;
         }
 
         /**
@@ -40,6 +45,8 @@
      * A given observer can register itself with only Move and Stop (mask = 0x03), then it will only be notified when one of these two occurs and will never be for Turn Left/Right.
      */
     export class Observable<T> {
+        private static _pooledEventState: EventState = null;
+
         _observers = new Array<Observer<T>>();
 
         /**
@@ -103,7 +110,8 @@
          * @param mask
          */
         public notifyObservers(eventData: T, mask: number = -1): void {
-            var state = new EventState(mask);
+            var state = Observable._pooledEventState ? Observable._pooledEventState.initalize(mask) : new EventState(mask);
+            Observable._pooledEventState = null;
 
             for (var obs of this._observers) {
                 if (obs.mask & mask) {
@@ -113,6 +121,8 @@
                     break;
                 }
             }
+
+            Observable._pooledEventState = state;
         }
 
         /**