murow 0.0.60 → 0.0.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -37
- package/dist/cjs/core/binary-codec/binary-codec.js +1 -0
- package/dist/cjs/core/binary-codec/index.js +1 -0
- package/dist/cjs/core/driver/driver.js +1 -0
- package/dist/cjs/core/driver/drivers/immediate.js +1 -0
- package/dist/cjs/core/driver/drivers/index.js +1 -0
- package/dist/cjs/core/driver/drivers/raf.js +1 -0
- package/dist/cjs/core/driver/drivers/timeout.js +1 -0
- package/dist/cjs/core/driver/index.js +1 -0
- package/dist/cjs/core/events/event-system.js +1 -0
- package/dist/cjs/core/events/index.js +1 -0
- package/dist/cjs/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/cjs/core/fixed-ticker/index.js +1 -0
- package/dist/cjs/core/free-list/free-list.js +1 -0
- package/dist/cjs/core/free-list/index.js +1 -0
- package/dist/cjs/core/generate-id/generate-id.js +1 -0
- package/dist/cjs/core/generate-id/index.js +1 -0
- package/dist/cjs/core/index.js +1 -0
- package/dist/cjs/core/input/index.js +1 -0
- package/dist/cjs/core/input/manager.js +1 -0
- package/dist/cjs/core/input/sources/browser.js +1 -0
- package/dist/cjs/core/input/sources/index.js +1 -0
- package/dist/cjs/core/input/types.js +1 -0
- package/dist/cjs/core/lerp/index.js +1 -0
- package/dist/cjs/core/lerp/lerp.js +1 -0
- package/dist/cjs/core/navmesh/index.js +1 -0
- package/dist/cjs/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.js +1 -0
- package/dist/cjs/core/navmesh/navmesh.worker.js +1 -0
- package/dist/cjs/core/pooled-codec/index.js +1 -0
- package/dist/cjs/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/cjs/core/prediction/index.js +1 -0
- package/dist/cjs/core/prediction/prediction.js +1 -0
- package/dist/cjs/core/ray/index.js +1 -0
- package/dist/cjs/core/ray/ray-2d.js +1 -0
- package/dist/cjs/core/ray/ray-3d.js +1 -0
- package/dist/cjs/core/simple-rng/index.js +1 -0
- package/dist/cjs/core/simple-rng/simple-rng.js +1 -0
- package/dist/cjs/core/sparse-batcher/index.js +1 -0
- package/dist/cjs/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/cjs/ecs/component-store.js +1 -0
- package/dist/cjs/ecs/component.js +1 -0
- package/dist/cjs/ecs/entity-handle.js +1 -0
- package/dist/cjs/ecs/index.js +1 -0
- package/dist/cjs/ecs/system-builder.js +1 -0
- package/dist/cjs/ecs/world-systems.js +1 -0
- package/dist/cjs/ecs/world.js +1 -0
- package/dist/cjs/game/index.js +1 -0
- package/dist/cjs/game/loop/index.js +1 -0
- package/dist/cjs/game/loop/loop.js +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/net/adapters/browser-websocket.js +1 -0
- package/dist/cjs/net/adapters/bun-websocket.js +1 -0
- package/dist/cjs/net/buffer-pool.js +1 -0
- package/dist/cjs/net/client.js +1 -0
- package/dist/cjs/net/index.js +1 -0
- package/dist/cjs/net/server.js +1 -0
- package/dist/cjs/net/types.js +1 -0
- package/dist/cjs/net/validators.js +1 -0
- package/dist/cjs/protocol/index.js +1 -0
- package/dist/cjs/protocol/intent/define-intent.js +1 -0
- package/dist/cjs/protocol/intent/index.js +1 -0
- package/dist/cjs/protocol/intent/intent-registry.js +1 -0
- package/dist/cjs/protocol/intent/intent.js +1 -0
- package/dist/cjs/protocol/rpc/define-rpc.js +1 -0
- package/dist/cjs/protocol/rpc/index.js +1 -0
- package/dist/cjs/protocol/rpc/rpc-registry.js +1 -0
- package/dist/cjs/protocol/rpc/rpc.js +1 -0
- package/dist/cjs/protocol/snapshot/index.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/cjs/protocol/snapshot/snapshot.js +1 -0
- package/dist/cjs/renderer/base-2d-renderer.js +1 -0
- package/dist/cjs/renderer/base-3d-renderer.js +1 -0
- package/dist/cjs/renderer/base-renderer.js +1 -0
- package/dist/cjs/renderer/index.js +1 -0
- package/dist/cjs/renderer/types.js +1 -0
- package/dist/esm/core/binary-codec/binary-codec.js +1 -0
- package/dist/esm/core/binary-codec/index.js +1 -0
- package/dist/esm/core/driver/driver.js +1 -0
- package/dist/esm/core/driver/drivers/immediate.js +1 -0
- package/dist/esm/core/driver/drivers/index.js +1 -0
- package/dist/esm/core/driver/drivers/raf.js +1 -0
- package/dist/esm/core/driver/drivers/timeout.js +1 -0
- package/dist/esm/core/driver/index.js +1 -0
- package/dist/esm/core/events/event-system.js +1 -0
- package/dist/esm/core/events/index.js +1 -0
- package/dist/esm/core/fixed-ticker/fixed-ticker.js +1 -0
- package/dist/esm/core/fixed-ticker/index.js +1 -0
- package/dist/esm/core/free-list/free-list.js +1 -0
- package/dist/esm/core/free-list/index.js +1 -0
- package/dist/esm/core/generate-id/generate-id.js +1 -0
- package/dist/esm/core/generate-id/index.js +1 -0
- package/dist/esm/core/index.js +1 -0
- package/dist/esm/core/input/index.js +1 -0
- package/dist/esm/core/input/manager.js +1 -0
- package/dist/esm/core/input/sources/browser.js +1 -0
- package/dist/esm/core/input/sources/index.js +1 -0
- package/dist/esm/core/input/types.js +0 -0
- package/dist/esm/core/lerp/index.js +1 -0
- package/dist/esm/core/lerp/lerp.js +1 -0
- package/dist/esm/core/navmesh/index.js +1 -0
- package/dist/esm/core/navmesh/navmesh-worker-pool.js +1 -0
- package/dist/esm/core/navmesh/navmesh.js +1 -0
- package/dist/esm/core/navmesh/navmesh.worker.js +1 -0
- package/dist/esm/core/pooled-codec/index.js +1 -0
- package/dist/esm/core/pooled-codec/pooled-codec.js +1 -0
- package/dist/esm/core/prediction/index.js +1 -0
- package/dist/esm/core/prediction/prediction.js +1 -0
- package/dist/esm/core/ray/index.js +1 -0
- package/dist/esm/core/ray/ray-2d.js +1 -0
- package/dist/esm/core/ray/ray-3d.js +1 -0
- package/dist/esm/core/simple-rng/index.js +1 -0
- package/dist/esm/core/simple-rng/simple-rng.js +1 -0
- package/dist/esm/core/sparse-batcher/index.js +1 -0
- package/dist/esm/core/sparse-batcher/sparse-batcher.js +1 -0
- package/dist/esm/ecs/component-store.js +1 -0
- package/dist/esm/ecs/component.js +1 -0
- package/dist/esm/ecs/entity-handle.js +1 -0
- package/dist/esm/ecs/index.js +1 -0
- package/dist/esm/ecs/system-builder.js +1 -0
- package/dist/esm/ecs/world-systems.js +1 -0
- package/dist/esm/ecs/world.js +1 -0
- package/dist/esm/game/index.js +1 -0
- package/dist/esm/game/loop/index.js +1 -0
- package/dist/esm/game/loop/loop.js +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/net/adapters/browser-websocket.js +1 -0
- package/dist/esm/net/adapters/bun-websocket.js +1 -0
- package/dist/esm/net/buffer-pool.js +1 -0
- package/dist/esm/net/client.js +1 -0
- package/dist/esm/net/index.js +1 -0
- package/dist/esm/net/server.js +1 -0
- package/dist/esm/net/types.js +1 -0
- package/dist/esm/net/validators.js +1 -0
- package/dist/esm/protocol/index.js +1 -0
- package/dist/esm/protocol/intent/define-intent.js +1 -0
- package/dist/esm/protocol/intent/index.js +1 -0
- package/dist/esm/protocol/intent/intent-registry.js +1 -0
- package/dist/esm/protocol/intent/intent.js +0 -0
- package/dist/esm/protocol/rpc/define-rpc.js +1 -0
- package/dist/esm/protocol/rpc/index.js +1 -0
- package/dist/esm/protocol/rpc/rpc-registry.js +1 -0
- package/dist/esm/protocol/rpc/rpc.js +0 -0
- package/dist/esm/protocol/snapshot/index.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-codec.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot-registry.js +1 -0
- package/dist/esm/protocol/snapshot/snapshot.js +1 -0
- package/dist/esm/renderer/base-2d-renderer.js +1 -0
- package/dist/esm/renderer/base-3d-renderer.js +1 -0
- package/dist/esm/renderer/base-renderer.js +1 -0
- package/dist/esm/renderer/index.js +1 -0
- package/dist/esm/renderer/types.js +0 -0
- package/dist/{core → types/core}/binary-codec/binary-codec.d.ts +4 -0
- package/dist/{core/loop → types/core/driver}/drivers/immediate.d.ts +1 -1
- package/dist/{core/loop → types/core/driver}/drivers/raf.d.ts +1 -1
- package/dist/{core/loop → types/core/driver}/drivers/timeout.d.ts +1 -1
- package/dist/{core/loop → types/core/driver}/index.d.ts +1 -1
- package/dist/{core → types/core}/events/event-system.d.ts +14 -33
- package/dist/{core → types/core}/fixed-ticker/fixed-ticker.d.ts +1 -1
- package/dist/types/core/free-list/free-list.d.ts +31 -0
- package/dist/types/core/free-list/index.d.ts +1 -0
- package/dist/{core → types/core}/index.d.ts +7 -1
- package/dist/types/core/input/index.d.ts +3 -0
- package/dist/types/core/input/manager.d.ts +56 -0
- package/dist/types/core/input/sources/browser.d.ts +9 -0
- package/dist/types/core/input/sources/index.d.ts +1 -0
- package/dist/types/core/input/types.d.ts +36 -0
- package/dist/{core → types/core}/navmesh/navmesh.d.ts +1 -21
- package/dist/types/core/ray/index.d.ts +2 -0
- package/dist/types/core/ray/ray-2d.d.ts +37 -0
- package/dist/types/core/ray/ray-3d.d.ts +42 -0
- package/dist/types/core/simple-rng/index.d.ts +1 -0
- package/dist/types/core/simple-rng/simple-rng.d.ts +36 -0
- package/dist/types/core/sparse-batcher/index.d.ts +1 -0
- package/dist/types/core/sparse-batcher/sparse-batcher.d.ts +55 -0
- package/dist/{ecs → types/ecs}/system-builder.d.ts +20 -9
- package/dist/{ecs → types/ecs}/world.d.ts +11 -0
- package/dist/types/game/index.d.ts +1 -0
- package/dist/types/game/loop/index.d.ts +1 -0
- package/dist/types/game/loop/loop.d.ts +175 -0
- package/dist/{index.d.ts → types/index.d.ts} +2 -0
- package/dist/{net → types/net}/index.d.ts +2 -2
- package/dist/{net → types/net}/server.d.ts +39 -19
- package/dist/{protocol → types/protocol}/intent/define-intent.d.ts +15 -0
- package/dist/{protocol → types/protocol}/intent/index.d.ts +1 -1
- package/dist/types/renderer/base-2d-renderer.d.ts +13 -0
- package/dist/types/renderer/base-3d-renderer.d.ts +10 -0
- package/dist/types/renderer/base-renderer.d.ts +21 -0
- package/dist/types/renderer/index.d.ts +4 -0
- package/dist/types/renderer/types.d.ts +79 -0
- package/dist/webgpu/cjs/index.js +6004 -0
- package/dist/webgpu/esm/index.js +5972 -0
- package/dist/webgpu/types/2d/animation.d.ts +97 -0
- package/dist/webgpu/types/2d/renderer.d.ts +55 -0
- package/dist/webgpu/types/2d/shader.d.ts +61 -0
- package/dist/webgpu/types/2d/sprite-accessor.d.ts +47 -0
- package/dist/webgpu/types/2d/sprite-accessor.test.d.ts +1 -0
- package/dist/webgpu/types/3d/gltf-skin-parser.d.ts +101 -0
- package/dist/webgpu/types/3d/morph-animation.d.ts +69 -0
- package/dist/webgpu/types/3d/morph-animation.test.d.ts +1 -0
- package/dist/webgpu/types/3d/renderer.d.ts +216 -0
- package/dist/webgpu/types/3d/shader.d.ts +136 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/index.d.ts +2 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/kernel.d.ts +8 -0
- package/dist/webgpu/types/3d/skeletal-animation-compute/packer.d.ts +32 -0
- package/dist/webgpu/types/3d/skeletal-animation.d.ts +90 -0
- package/dist/webgpu/types/camera/camera-2d.d.ts +53 -0
- package/dist/webgpu/types/camera/camera-2d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/camera-3d.d.ts +81 -0
- package/dist/webgpu/types/camera/camera-3d.test.d.ts +1 -0
- package/dist/webgpu/types/camera/index.d.ts +2 -0
- package/dist/webgpu/types/compute/compute-builder.d.ts +123 -0
- package/dist/webgpu/types/compute/compute-builder.test.d.ts +1 -0
- package/dist/webgpu/types/core/constants.d.ts +59 -0
- package/dist/webgpu/types/core/constants.test.d.ts +1 -0
- package/dist/webgpu/types/core/index.d.ts +2 -0
- package/dist/webgpu/types/core/math.d.ts +37 -0
- package/dist/webgpu/types/core/types.d.ts +125 -0
- package/dist/webgpu/types/core/types.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/built-in.d.ts +58 -0
- package/dist/webgpu/types/geometry/built-in.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/geometry-builder.d.ts +281 -0
- package/dist/webgpu/types/geometry/geometry-builder.test.d.ts +1 -0
- package/dist/webgpu/types/geometry/index.d.ts +2 -0
- package/dist/webgpu/types/index.d.ts +32 -0
- package/dist/webgpu/types/particle/emitter.d.ts +36 -0
- package/dist/webgpu/types/shaders/index.d.ts +2 -0
- package/dist/webgpu/types/shaders/runtime-transpile.d.ts +18 -0
- package/dist/webgpu/types/shaders/sprite-2d.wgsl.d.ts +10 -0
- package/dist/webgpu/types/shaders/typegpu.d.ts +9 -0
- package/dist/webgpu/types/shaders/utils.d.ts +28 -0
- package/dist/webgpu/types/shaders/utils.test.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/index.d.ts +1 -0
- package/dist/webgpu/types/spritesheet/spritesheet.d.ts +57 -0
- package/dist/webgpu/types/spritesheet/spritesheet.test.d.ts +1 -0
- package/package.json +96 -26
- package/dist/core/binary-codec/binary-codec.js +0 -354
- package/dist/core/binary-codec/index.js +0 -1
- package/dist/core/events/event-system.js +0 -88
- package/dist/core/events/index.js +0 -1
- package/dist/core/fixed-ticker/fixed-ticker.js +0 -101
- package/dist/core/fixed-ticker/index.js +0 -1
- package/dist/core/generate-id/generate-id.js +0 -25
- package/dist/core/generate-id/index.js +0 -1
- package/dist/core/index.js +0 -9
- package/dist/core/lerp/index.js +0 -1
- package/dist/core/lerp/lerp.js +0 -42
- package/dist/core/loop/drivers/immediate.js +0 -61
- package/dist/core/loop/drivers/index.js +0 -3
- package/dist/core/loop/drivers/raf.js +0 -62
- package/dist/core/loop/drivers/timeout.js +0 -71
- package/dist/core/loop/index.js +0 -2
- package/dist/core/loop/loop.js +0 -47
- package/dist/core/navmesh/index.js +0 -1
- package/dist/core/navmesh/navmesh-worker-pool.js +0 -180
- package/dist/core/navmesh/navmesh.js +0 -799
- package/dist/core/navmesh/navmesh.worker.js +0 -79
- package/dist/core/pooled-codec/index.js +0 -1
- package/dist/core/pooled-codec/pooled-codec.js +0 -410
- package/dist/core/prediction/index.js +0 -1
- package/dist/core/prediction/prediction.js +0 -99
- package/dist/core.esm.js +0 -1
- package/dist/core.js +0 -1
- package/dist/ecs/component-store.js +0 -175
- package/dist/ecs/component.js +0 -43
- package/dist/ecs/entity-handle.js +0 -515
- package/dist/ecs/example.js +0 -125
- package/dist/ecs/index.js +0 -4
- package/dist/ecs/system-builder.js +0 -180
- package/dist/ecs/system.d.ts +0 -63
- package/dist/ecs/system.js +0 -92
- package/dist/ecs/world-systems.js +0 -79
- package/dist/ecs/world.js +0 -684
- package/dist/index.js +0 -24
- package/dist/net/adapters/browser-websocket.js +0 -74
- package/dist/net/adapters/bun-websocket.js +0 -245
- package/dist/net/buffer-pool.js +0 -89
- package/dist/net/client.js +0 -586
- package/dist/net/index.js +0 -58
- package/dist/net/server.js +0 -938
- package/dist/net/types.js +0 -31
- package/dist/net/validators.js +0 -88
- package/dist/protocol/index.js +0 -92
- package/dist/protocol/intent/define-intent.js +0 -125
- package/dist/protocol/intent/index.js +0 -91
- package/dist/protocol/intent/intent-registry.js +0 -91
- package/dist/protocol/rpc/define-rpc.js +0 -84
- package/dist/protocol/rpc/index.js +0 -3
- package/dist/protocol/rpc/rpc-registry.js +0 -159
- package/dist/protocol/rpc/rpc.js +0 -12
- package/dist/protocol/snapshot/index.js +0 -43
- package/dist/protocol/snapshot/snapshot-codec.js +0 -67
- package/dist/protocol/snapshot/snapshot-registry.js +0 -168
- package/dist/protocol/snapshot/snapshot.js +0 -30
- package/src/core/binary-codec/README.md +0 -60
- package/src/core/binary-codec/binary-codec.test.ts +0 -300
- package/src/core/binary-codec/binary-codec.ts +0 -448
- package/src/core/binary-codec/index.ts +0 -1
- package/src/core/events/README.md +0 -47
- package/src/core/events/event-system.test.ts +0 -243
- package/src/core/events/event-system.ts +0 -140
- package/src/core/events/index.ts +0 -1
- package/src/core/fixed-ticker/README.md +0 -77
- package/src/core/fixed-ticker/fixed-ticker.test.ts +0 -151
- package/src/core/fixed-ticker/fixed-ticker.ts +0 -169
- package/src/core/fixed-ticker/index.ts +0 -1
- package/src/core/generate-id/README.md +0 -18
- package/src/core/generate-id/generate-id.test.ts +0 -79
- package/src/core/generate-id/generate-id.ts +0 -37
- package/src/core/generate-id/index.ts +0 -1
- package/src/core/index.ts +0 -9
- package/src/core/lerp/README.md +0 -79
- package/src/core/lerp/index.ts +0 -1
- package/src/core/lerp/lerp.test.ts +0 -90
- package/src/core/lerp/lerp.ts +0 -42
- package/src/core/loop/README.md +0 -97
- package/src/core/loop/drivers/immediate.ts +0 -66
- package/src/core/loop/drivers/index.ts +0 -3
- package/src/core/loop/drivers/raf.ts +0 -67
- package/src/core/loop/drivers/timeout.ts +0 -77
- package/src/core/loop/index.ts +0 -2
- package/src/core/loop/loop.test.ts +0 -414
- package/src/core/loop/loop.ts +0 -71
- package/src/core/navmesh/README.md +0 -164
- package/src/core/navmesh/index.ts +0 -1
- package/src/core/navmesh/navmesh-worker-pool.ts +0 -236
- package/src/core/navmesh/navmesh-workers.test.ts +0 -356
- package/src/core/navmesh/navmesh.test.ts +0 -344
- package/src/core/navmesh/navmesh.ts +0 -1047
- package/src/core/navmesh/navmesh.worker.ts +0 -147
- package/src/core/pooled-codec/README.md +0 -70
- package/src/core/pooled-codec/index.ts +0 -1
- package/src/core/pooled-codec/pooled-codec.test.ts +0 -862
- package/src/core/pooled-codec/pooled-codec.ts +0 -504
- package/src/core/prediction/README.md +0 -64
- package/src/core/prediction/index.ts +0 -1
- package/src/core/prediction/prediction.test.ts +0 -423
- package/src/core/prediction/prediction.ts +0 -112
- package/src/ecs/README.md +0 -427
- package/src/ecs/benchmark.test.ts +0 -1645
- package/src/ecs/component-store.ts +0 -198
- package/src/ecs/component.ts +0 -90
- package/src/ecs/entity-handle.test.ts +0 -393
- package/src/ecs/entity-handle.ts +0 -563
- package/src/ecs/example.ts +0 -152
- package/src/ecs/index.ts +0 -4
- package/src/ecs/system-builder.ts +0 -309
- package/src/ecs/system.ts +0 -111
- package/src/ecs/world-systems.ts +0 -83
- package/src/ecs/world.test.ts +0 -310
- package/src/ecs/world.ts +0 -828
- package/src/index.ts +0 -28
- package/src/net/README.md +0 -474
- package/src/net/adapters/browser-websocket.ts +0 -86
- package/src/net/adapters/bun-websocket.ts +0 -292
- package/src/net/buffer-pool.ts +0 -106
- package/src/net/client.test.ts +0 -807
- package/src/net/client.ts +0 -695
- package/src/net/index.ts +0 -60
- package/src/net/server.test.ts +0 -799
- package/src/net/server.ts +0 -1116
- package/src/net/types.ts +0 -228
- package/src/net/validators.ts +0 -104
- package/src/protocol/README.md +0 -469
- package/src/protocol/index.ts +0 -93
- package/src/protocol/intent/define-intent.test.ts +0 -397
- package/src/protocol/intent/define-intent.ts +0 -182
- package/src/protocol/intent/index.ts +0 -94
- package/src/protocol/intent/intent-registry.test.ts +0 -198
- package/src/protocol/intent/intent-registry.ts +0 -112
- package/src/protocol/intent/intent.ts +0 -12
- package/src/protocol/rpc/define-rpc.test.ts +0 -141
- package/src/protocol/rpc/define-rpc.ts +0 -113
- package/src/protocol/rpc/index.ts +0 -3
- package/src/protocol/rpc/rpc-registry.test.ts +0 -168
- package/src/protocol/rpc/rpc-registry.ts +0 -176
- package/src/protocol/rpc/rpc.ts +0 -37
- package/src/protocol/snapshot/index.ts +0 -45
- package/src/protocol/snapshot/snapshot-codec.test.ts +0 -138
- package/src/protocol/snapshot/snapshot-codec.ts +0 -87
- package/src/protocol/snapshot/snapshot-registry.test.ts +0 -310
- package/src/protocol/snapshot/snapshot-registry.ts +0 -201
- package/src/protocol/snapshot/snapshot.test.ts +0 -76
- package/src/protocol/snapshot/snapshot.ts +0 -41
- /package/dist/{core → types/core}/binary-codec/index.d.ts +0 -0
- /package/dist/{core/loop/loop.d.ts → types/core/driver/driver.d.ts} +0 -0
- /package/dist/{core/loop → types/core/driver}/drivers/index.d.ts +0 -0
- /package/dist/{core → types/core}/events/index.d.ts +0 -0
- /package/dist/{core → types/core}/fixed-ticker/index.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/generate-id.d.ts +0 -0
- /package/dist/{core → types/core}/generate-id/index.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/index.d.ts +0 -0
- /package/dist/{core → types/core}/lerp/lerp.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/index.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh-worker-pool.d.ts +0 -0
- /package/dist/{core → types/core}/navmesh/navmesh.worker.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/index.d.ts +0 -0
- /package/dist/{core → types/core}/pooled-codec/pooled-codec.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/index.d.ts +0 -0
- /package/dist/{core → types/core}/prediction/prediction.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component-store.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/component.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/entity-handle.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/example.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/index.d.ts +0 -0
- /package/dist/{ecs → types/ecs}/world-systems.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/browser-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/adapters/bun-websocket.d.ts +0 -0
- /package/dist/{net → types/net}/buffer-pool.d.ts +0 -0
- /package/dist/{net → types/net}/client.d.ts +0 -0
- /package/dist/{net → types/net}/types.d.ts +0 -0
- /package/dist/{net → types/net}/validators.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/intent/intent.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/define-rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/rpc/rpc.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/index.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-codec.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot-registry.d.ts +0 -0
- /package/dist/{protocol → types/protocol}/snapshot/snapshot.d.ts +0 -0
- /package/dist/{protocol/intent/intent.js → webgpu/types/2d/animation.test.d.ts} +0 -0
package/src/ecs/README.md
DELETED
|
@@ -1,427 +0,0 @@
|
|
|
1
|
-
# Entity Component System (ECS)
|
|
2
|
-
|
|
3
|
-
A high-performance Entity Component System for multiplayer games, built on typed arrays with automatic pooling.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
- **Typed Array Storage**: Components stored in packed ArrayBuffer with DataView for cache-friendly iteration
|
|
8
|
-
- **Zero Allocations**: Reusable DataView and ObjectPool eliminate GC pressure
|
|
9
|
-
- **BinaryCodec Integration**: Components use your existing schema definitions
|
|
10
|
-
- **PooledCodec Serialization**: Efficient network encoding built-in
|
|
11
|
-
- **Bitmask Queries**: Fast O(1) component checks and O(n) entity queries with query result caching
|
|
12
|
-
- **Unlimited Components**: Dynamically scales to support any number of components (32 per bitmask word)
|
|
13
|
-
- **Optimized Hot Paths**: Cached references and unrolled loops for <128 component common case
|
|
14
|
-
- **Simple API**: Define components, spawn entities, query and update
|
|
15
|
-
|
|
16
|
-
## Quick Start
|
|
17
|
-
|
|
18
|
-
```typescript
|
|
19
|
-
import { defineComponent, World, BinaryCodec } from 'murow';
|
|
20
|
-
|
|
21
|
-
// 1. Define components using BinaryCodec schemas
|
|
22
|
-
const Transform = defineComponent('Transform', {
|
|
23
|
-
x: BinaryCodec.f32,
|
|
24
|
-
y: BinaryCodec.f32,
|
|
25
|
-
rotation: BinaryCodec.f32,
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
const Velocity = defineComponent('Velocity', {
|
|
29
|
-
vx: BinaryCodec.f32,
|
|
30
|
-
vy: BinaryCodec.f32,
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
const Health = defineComponent('Health', {
|
|
34
|
-
current: BinaryCodec.u16,
|
|
35
|
-
max: BinaryCodec.u16,
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
// 2. Create a world with your components
|
|
39
|
-
const world = new World({
|
|
40
|
-
maxEntities: 10000,
|
|
41
|
-
components: [Transform, Velocity, Health],
|
|
42
|
-
});
|
|
43
|
-
|
|
44
|
-
// 3. Spawn entities and add components
|
|
45
|
-
const player = world.spawn();
|
|
46
|
-
world.add(player, Transform, { x: 100, y: 200, rotation: 0 });
|
|
47
|
-
world.add(player, Velocity, { vx: 10, vy: 20 });
|
|
48
|
-
world.add(player, Health, { current: 100, max: 100 });
|
|
49
|
-
|
|
50
|
-
// 4. Query and update entities
|
|
51
|
-
for (const entity of world.query(Transform, Velocity)) {
|
|
52
|
-
const transform = world.get(entity, Transform);
|
|
53
|
-
const velocity = world.get(entity, Velocity);
|
|
54
|
-
|
|
55
|
-
// Update position using update() for efficiency
|
|
56
|
-
world.update(entity, Transform, {
|
|
57
|
-
x: transform.x + velocity.vx * deltaTime,
|
|
58
|
-
y: transform.y + velocity.vy * deltaTime,
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
## API Reference
|
|
64
|
-
|
|
65
|
-
### `defineComponent(name, schema)`
|
|
66
|
-
|
|
67
|
-
Define a component type with a binary schema.
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
const Transform = defineComponent('Transform', {
|
|
71
|
-
x: BinaryCodec.f32,
|
|
72
|
-
y: BinaryCodec.f32,
|
|
73
|
-
rotation: BinaryCodec.f32,
|
|
74
|
-
});
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
**Parameters:**
|
|
78
|
-
- `name`: Unique name for the component
|
|
79
|
-
- `schema`: BinaryCodec schema defining the component's fields
|
|
80
|
-
|
|
81
|
-
**Returns:** Component definition that can be used with World
|
|
82
|
-
|
|
83
|
-
### `World`
|
|
84
|
-
|
|
85
|
-
Manages entities and their components.
|
|
86
|
-
|
|
87
|
-
#### Constructor
|
|
88
|
-
|
|
89
|
-
```typescript
|
|
90
|
-
const world = new World({
|
|
91
|
-
maxEntities: 10000, // Optional, defaults to 10000
|
|
92
|
-
components: [Transform, Velocity, Health],
|
|
93
|
-
});
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
**Options:**
|
|
97
|
-
- `maxEntities`: Maximum number of entities (affects memory allocation)
|
|
98
|
-
- `components`: Array of component definitions (dynamically scales, 32 components per bitmask word)
|
|
99
|
-
|
|
100
|
-
#### Entity Management
|
|
101
|
-
|
|
102
|
-
```typescript
|
|
103
|
-
// Spawn a new entity
|
|
104
|
-
const entity = world.spawn();
|
|
105
|
-
|
|
106
|
-
// Despawn (destroy) an entity
|
|
107
|
-
world.despawn(entity);
|
|
108
|
-
|
|
109
|
-
// Check if entity is alive
|
|
110
|
-
world.isAlive(entity);
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
#### Component Operations
|
|
114
|
-
|
|
115
|
-
```typescript
|
|
116
|
-
// Add a component with initial data
|
|
117
|
-
world.add(entity, Transform, { x: 0, y: 0, rotation: 0 });
|
|
118
|
-
|
|
119
|
-
// Get component data (returns pooled object)
|
|
120
|
-
const transform = world.get(entity, Transform);
|
|
121
|
-
|
|
122
|
-
// Set component data (overwrites all fields)
|
|
123
|
-
world.set(entity, Transform, { x: 100, y: 200, rotation: 0 });
|
|
124
|
-
|
|
125
|
-
// Update partial fields (more efficient)
|
|
126
|
-
world.update(entity, Transform, { x: 150 });
|
|
127
|
-
|
|
128
|
-
// Check if entity has component
|
|
129
|
-
world.has(entity, Transform);
|
|
130
|
-
|
|
131
|
-
// Remove component from entity
|
|
132
|
-
world.remove(entity, Transform);
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
#### Querying
|
|
136
|
-
|
|
137
|
-
```typescript
|
|
138
|
-
// Query entities with specific components
|
|
139
|
-
for (const entity of world.query(Transform, Velocity)) {
|
|
140
|
-
// Only entities with BOTH Transform AND Velocity
|
|
141
|
-
const t = world.get(entity, Transform);
|
|
142
|
-
const v = world.get(entity, Velocity);
|
|
143
|
-
// ... process entity
|
|
144
|
-
}
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
#### Serialization
|
|
148
|
-
|
|
149
|
-
See [Networking](../net/README.md) for snapshot-based serialization using the same component schemas.
|
|
150
|
-
|
|
151
|
-
## Performance
|
|
152
|
-
|
|
153
|
-
**Highly optimized for multiplayer games** - zero allocations in hot paths, sub-millisecond queries with intelligent caching, scales to 50k+ entities.
|
|
154
|
-
|
|
155
|
-
### Quick Numbers
|
|
156
|
-
|
|
157
|
-
| Metric | Performance |
|
|
158
|
-
|--------|-------------|
|
|
159
|
-
| **Spawn rate** | 30M+ entities/sec |
|
|
160
|
-
| **Query speed (first)** | 10k entities in 0.13ms |
|
|
161
|
-
| **Query speed (cached)** | 10k entities in **0.01ms** (100x) |
|
|
162
|
-
| **Component access** | 9.3M ops/sec (get) |
|
|
163
|
-
| **Frame time** (5k entities) | 4.98ms avg (~200 FPS) |
|
|
164
|
-
| **Memory overhead** | Zero allocations in gameplay, <100KB for query cache |
|
|
165
|
-
|
|
166
|
-
### Realistic Game Simulation
|
|
167
|
-
11 systems with realistic workload (movement, rotation, boundaries, health regen, cooldowns, combat, death, status effects, lifetime, velocity damping, AI behavior).
|
|
168
|
-
Results averaged across 5 runs using **raw World API**:
|
|
169
|
-
|
|
170
|
-
| Entities | Avg Frame | Std Dev | Min | Max | FPS | 60fps (16.67ms) | 30fps (33.33ms) |
|
|
171
|
-
|----------|-----------|---------|-----|-----|-----|-----------------|-----------------|
|
|
172
|
-
| 500 | 0.57ms | ±0.05ms | 0.38ms | 2.27ms | 1,754 | ✅ 3.4% | ✅ 1.7% |
|
|
173
|
-
| 1,000 | 1.03ms | ±0.04ms | 0.78ms | 1.75ms | 972 | ✅ 6.2% | ✅ 3.1% |
|
|
174
|
-
| 5,000 | 4.98ms | ±0.36ms | 3.57ms | 11.12ms | 200 | ✅ 29.9% | ✅ 14.9% |
|
|
175
|
-
| 10,000 | 9.63ms | ±0.48ms | 8.19ms | 13.55ms | 103 | ✅ 57.8% | ✅ 28.9% |
|
|
176
|
-
| 25,000 | 22.91ms | ±1.02ms | 20.59ms | 28.65ms | 43 | ❌ 137.4% | ✅ 68.7% |
|
|
177
|
-
| 50,000 | 45.41ms | ±1.62ms | 38.14ms | 55.69ms | 22 | ❌ 272.4% | ❌ 136.2% |
|
|
178
|
-
|
|
179
|
-
**10k entities fits comfortably in 60 FPS budget. 25k entities achieves 30 FPS.**
|
|
180
|
-
|
|
181
|
-
Low standard deviations indicate stable, predictable performance across runs.
|
|
182
|
-
|
|
183
|
-
### Optimizations Applied
|
|
184
|
-
- **Query result caching** with archetype version tracking (16-473x speedup for repeated queries)
|
|
185
|
-
- **Object-based query buffers** and field lookups (2.2x faster than Map)
|
|
186
|
-
- Loop unrolling for 2/3/4-field components (covers 95% of use cases)
|
|
187
|
-
- Query loop unrolling (8x batch processing with write cursor)
|
|
188
|
-
- Single/dual-field update fast paths (zero allocation for common cases)
|
|
189
|
-
- Component-specialized read/write paths
|
|
190
|
-
- Inlined math operations in hot paths
|
|
191
|
-
- O(1) entity lookups with index mapping
|
|
192
|
-
- Power-of-2 ring buffer with bitwise operations
|
|
193
|
-
|
|
194
|
-
Run benchmarks: `bun test src/ecs/benchmark.test.ts`
|
|
195
|
-
|
|
196
|
-
**Methodology**: All performance numbers are averaged across 5 runs using `bun test --rerun-each=5` to account for JIT warmup and variance. The "Complex Game Simulation" benchmark uses the raw World API for maximum transparency.
|
|
197
|
-
|
|
198
|
-
## Advanced Usage
|
|
199
|
-
|
|
200
|
-
### Fluent API with EntityHandle
|
|
201
|
-
|
|
202
|
-
EntityHandle provides a chainable interface for entity operations with **zero runtime overhead**. Modern JIT compilers inline these simple method calls, making them identical in performance to the raw World API.
|
|
203
|
-
|
|
204
|
-
```typescript
|
|
205
|
-
// Fluent API - clean and expressive
|
|
206
|
-
const player = world.entity(world.spawn())
|
|
207
|
-
.add(Transform, { x: 0, y: 0, rotation: 0 })
|
|
208
|
-
.add(Health, { current: 100, max: 100 })
|
|
209
|
-
.add(Velocity, { vx: 0, vy: 0 });
|
|
210
|
-
|
|
211
|
-
// Use the handle
|
|
212
|
-
player.update(Transform, { x: 10 });
|
|
213
|
-
const health = player.get(Health);
|
|
214
|
-
|
|
215
|
-
// Chain multiple operations
|
|
216
|
-
player
|
|
217
|
-
.update(Health, { current: 50 })
|
|
218
|
-
.update(Velocity, { vx: 5, vy: 5 });
|
|
219
|
-
|
|
220
|
-
// Access raw entity ID when needed
|
|
221
|
-
world.add(player.id, Armor, { value: 50 });
|
|
222
|
-
|
|
223
|
-
// Mix with raw API freely
|
|
224
|
-
for (const id of world.query(Transform, Velocity)) {
|
|
225
|
-
const entity = world.entity(id);
|
|
226
|
-
const t = entity.get(Transform);
|
|
227
|
-
const v = entity.get(Velocity);
|
|
228
|
-
entity.update(Transform, {
|
|
229
|
-
x: t.x + v.vx * deltaTime,
|
|
230
|
-
y: t.y + v.vy * deltaTime,
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
**Performance**: EntityHandle has minimal overhead. Benchmark results show <5-15% overhead in complex simulations, well within acceptable range for the ergonomic benefits.
|
|
236
|
-
|
|
237
|
-
### Systems Pattern
|
|
238
|
-
|
|
239
|
-
```typescript
|
|
240
|
-
class MovementSystem {
|
|
241
|
-
update(world: World, deltaTime: number) {
|
|
242
|
-
for (const entity of world.query(Transform, Velocity)) {
|
|
243
|
-
const t = world.get(entity, Transform);
|
|
244
|
-
const v = world.get(entity, Velocity);
|
|
245
|
-
|
|
246
|
-
// Use update() for efficient partial updates
|
|
247
|
-
world.update(entity, Transform, {
|
|
248
|
-
x: t.x + v.vx * deltaTime,
|
|
249
|
-
y: t.y + v.vy * deltaTime,
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
class HealthSystem {
|
|
256
|
-
update(world: World) {
|
|
257
|
-
for (const entity of world.query(Health)) {
|
|
258
|
-
const health = world.get(entity, Health);
|
|
259
|
-
|
|
260
|
-
if (health.current <= 0) {
|
|
261
|
-
world.despawn(entity);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
// Game loop
|
|
268
|
-
const movementSystem = new MovementSystem();
|
|
269
|
-
const healthSystem = new HealthSystem();
|
|
270
|
-
|
|
271
|
-
function gameLoop(deltaTime: number) {
|
|
272
|
-
movementSystem.update(world, deltaTime);
|
|
273
|
-
healthSystem.update(world);
|
|
274
|
-
}
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
### Partial Updates
|
|
278
|
-
|
|
279
|
-
```typescript
|
|
280
|
-
// ❌ WRONG: Can't mutate readonly
|
|
281
|
-
const transform = world.get(entity, Transform);
|
|
282
|
-
transform.x = 150; // TypeScript error!
|
|
283
|
-
world.set(entity, Transform, transform);
|
|
284
|
-
|
|
285
|
-
// ✅ CORRECT: Use update() for partial changes (fastest!)
|
|
286
|
-
world.update(entity, Transform, { x: 150 });
|
|
287
|
-
|
|
288
|
-
// ✅ ALSO CORRECT: Use set() to replace all fields
|
|
289
|
-
world.set(entity, Transform, { x: 150, y: 200, rotation: 0 });
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
### Component Reuse with Tags
|
|
293
|
-
|
|
294
|
-
```typescript
|
|
295
|
-
// Create tag components (empty schemas)
|
|
296
|
-
const Enemy = defineComponent('Enemy', {
|
|
297
|
-
_tag: BinaryCodec.u8, // Dummy field
|
|
298
|
-
});
|
|
299
|
-
|
|
300
|
-
const Player = defineComponent('Player', {
|
|
301
|
-
_tag: BinaryCodec.u8,
|
|
302
|
-
});
|
|
303
|
-
|
|
304
|
-
// Add tags
|
|
305
|
-
world.add(entity, Enemy, { _tag: 1 });
|
|
306
|
-
|
|
307
|
-
// Query with tags
|
|
308
|
-
for (const entity of world.query(Transform, Enemy)) {
|
|
309
|
-
// Only enemy entities with Transform
|
|
310
|
-
}
|
|
311
|
-
```
|
|
312
|
-
|
|
313
|
-
## Integration with Existing Code
|
|
314
|
-
|
|
315
|
-
The ECS integrates seamlessly with your existing networking code:
|
|
316
|
-
|
|
317
|
-
```typescript
|
|
318
|
-
// Define components (same schema for storage AND network!)
|
|
319
|
-
const Transform = defineComponent('Transform', {
|
|
320
|
-
x: BinaryCodec.f32,
|
|
321
|
-
y: BinaryCodec.f32,
|
|
322
|
-
rotation: BinaryCodec.f32,
|
|
323
|
-
});
|
|
324
|
-
|
|
325
|
-
// Use in ECS
|
|
326
|
-
world.add(entity, Transform, { x: 100, y: 200, rotation: 0 });
|
|
327
|
-
|
|
328
|
-
// Use in snapshots (same schema!)
|
|
329
|
-
snapshotRegistry.register('transform', Transform.arrayCodec);
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
## Best Practices
|
|
333
|
-
|
|
334
|
-
### 1. Keep Components Small
|
|
335
|
-
```typescript
|
|
336
|
-
// Good: Small, focused components
|
|
337
|
-
const Transform = defineComponent('Transform', { x: f32, y: f32, rotation: f32 });
|
|
338
|
-
const Velocity = defineComponent('Velocity', { vx: f32, vy: f32 });
|
|
339
|
-
|
|
340
|
-
// Bad: Large, monolithic component
|
|
341
|
-
const Entity = defineComponent('Entity', {
|
|
342
|
-
x, y, rotation, vx, vy, health, maxHealth, damage, ...
|
|
343
|
-
});
|
|
344
|
-
```
|
|
345
|
-
|
|
346
|
-
### 2. Use Partial Updates
|
|
347
|
-
```typescript
|
|
348
|
-
// Good: Update only what changed
|
|
349
|
-
world.update(entity, Transform, { x: newX });
|
|
350
|
-
|
|
351
|
-
// Bad: Get + spread + set for single field
|
|
352
|
-
const t = world.get(entity, Transform);
|
|
353
|
-
world.set(entity, Transform, { ...t, x: newX });
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
### 3. Batch Operations
|
|
357
|
-
```typescript
|
|
358
|
-
// Good: Query once, process many
|
|
359
|
-
for (const entity of world.query(Transform, Velocity)) {
|
|
360
|
-
// Process all entities in one loop
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
// Bad: Individual queries
|
|
364
|
-
for (const entity of world.getEntities()) {
|
|
365
|
-
if (world.has(entity, Transform) && world.has(entity, Velocity)) {
|
|
366
|
-
// Slower
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### 4. Avoid Nested Queries
|
|
372
|
-
```typescript
|
|
373
|
-
// Bad: O(n²) complexity
|
|
374
|
-
for (const e1 of world.query(Transform)) {
|
|
375
|
-
for (const e2 of world.query(Transform)) {
|
|
376
|
-
// Very slow!
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
// Good: Use spatial partitioning for collision detection
|
|
381
|
-
const grid = new SpatialGrid();
|
|
382
|
-
// ... (see NavMesh or implement your own)
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
## Performance
|
|
386
|
-
|
|
387
|
-
Benchmark results (5-run average, 10,000 entities on Intel i5-2400 (4 cores) @ 3.4GHz, 2011):
|
|
388
|
-
|
|
389
|
-
**Complex Simulation (10+ systems):**
|
|
390
|
-
- 10.34ms average (98 FPS) ✅ Well under 60 FPS budget
|
|
391
|
-
- Handles realistic game workloads with ease
|
|
392
|
-
|
|
393
|
-
**25-Component Stress Test:**
|
|
394
|
-
- 18.90ms average (52 FPS) ✅ Passes 30 FPS target
|
|
395
|
-
- Extreme test with many components still performant
|
|
396
|
-
|
|
397
|
-
**Query Performance:**
|
|
398
|
-
- Single query: 0.209ms for 10,000 entities
|
|
399
|
-
- 100x repeated queries: 0.11ms (query result caching)
|
|
400
|
-
- Persistent cache invalidated only on archetype changes
|
|
401
|
-
|
|
402
|
-
**Key Optimizations:**
|
|
403
|
-
- Cached reference to first word (fast path for <32 components)
|
|
404
|
-
- Unrolled loops for 1-4 word cases (up to 128 components)
|
|
405
|
-
- Query mask caching (zero recomputation for repeated queries)
|
|
406
|
-
- Query result caching (invalidated only on spawn/despawn/add/remove)
|
|
407
|
-
|
|
408
|
-
**Scaling:**
|
|
409
|
-
- 500 entities: 0.6-0.7ms (1,500+ FPS)
|
|
410
|
-
- 1,000 entities: 1.1-1.3ms (800+ FPS)
|
|
411
|
-
- 5,000 entities: 5.0-5.5ms (180+ FPS)
|
|
412
|
-
- 10,000 entities: 10.3ms (98 FPS)
|
|
413
|
-
- 25,000 entities: 24ms (42 FPS)
|
|
414
|
-
|
|
415
|
-
All tests maintain excellent frame rates for realistic game scenarios. Modern CPUs will perform significantly better.
|
|
416
|
-
|
|
417
|
-
## Limitations
|
|
418
|
-
|
|
419
|
-
- **Fixed max entities** (set at world creation, affects memory allocation)
|
|
420
|
-
- **No component inheritance** (composition over inheritance pattern)
|
|
421
|
-
- **No component dependencies** (manage manually in systems)
|
|
422
|
-
|
|
423
|
-
## See Also
|
|
424
|
-
|
|
425
|
-
- [BinaryCodec](../core/binary-codec/README.md) - Schema definitions
|
|
426
|
-
- [PooledCodec](../core/pooled-codec/README.md) - Zero-copy serialization
|
|
427
|
-
- [Networking](../net/README.md) - Client/Server integration
|