# TODO - ✔ Remove dependency on decorators - ✔ Synchronized should be a mixin - ✔ Behavior items should derive type/name - ✔ Precompile behavior expressions - ✔ Abstract physics world tick optimizations - ✔ Cache current routine for Behaved tick - ✔ Inline traits into entity, remove Proxy - ✔ Eliminate immutable.toJS() - ✔ Track dirty entity state (entityList.tick()) - ✔ Investigate visibleEntities path - ✔ Investigate lookupEmitListeners path - ✔ Investigate visibleBoundingBoxes path - ✔ EventEmitter::emit is too hot - ✔ Entity packets - ✔ Decouple input normalization from action registry - ✔ entityList.fromJSON() - ✔ Don't run emitter destruction tickers on server - ✔ Investigate unrolling equalsClose - ✔ Bitshifts for on_positionChanged x/y boxing - ✔ Memoize Object.getOwnPropertyNames results per trait constructor - ✔ EE optimizations (lookupEmitListeners) - ✔ Core.fastApply, search for /\(\.\.\./ - ✔ Rename visibleBoundingBox(es)? to visibleAabb(s)? - ✔ Trait params fromJS is super slow - ✔ Entity::is is slow? - ✔ Manual state sync - ✔ Synchronized provides packet updates - ✔ Phase out EntityPacketSynchronizer - ✔ Implement ALL trait state update packets - ✔ Implement Entity remove packets - ✔ Save state/param extensions separately on create instead of only merging - ✔ Target trait updates beyond just visible; e.g. others don't need to know about inventory change - ✔ Remove position pack check from trait and add to Vector - ❌ PIXI particles - ❌ Pointer events polyfill: https://github.com/jquery/PEP - ✔ Fix physics drag during latency - ❌ Socket WebWorker can't connect in Firefox - ✔ PIXI update to v5 - ❌ chunked tile communication - ❌ Property.fastAccess to skip getter, this.entity.currentAnimation - ❌ zLib dictionary for packet compression - ❌ afterDestructionTickers shouldn't exist... destruction should be deferred