Skip to content

Functional, minimal, data-oriented, ultra-high performance ECS library written in JavaScript

License

Notifications You must be signed in to change notification settings

vegeta897/bitECS

This branch is 66 commits behind NateTheGreatt/bitECS:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

6ea5633 · Feb 26, 2022
Oct 23, 2021
Feb 26, 2022
Dec 14, 2021
Feb 26, 2022
Feb 26, 2022
Feb 26, 2022
May 7, 2021
Mar 13, 2021
Feb 26, 2022
Jan 2, 2022
Feb 26, 2022
Feb 26, 2022
Aug 22, 2021

Repository files navigation

❤ ❤ ❤
bitECS

Version Minzipped Downloads License

Functional, minimal, data-oriented, ultra-high performance ECS library written using JavaScript TypedArrays.

✨ Features

🔮 Simple, declarative API 🔥 Blazing fast iteration
🔍 Powerful & performant queries 💾 Serialization included
🍃 Zero dependencies 🌐 Node or browser
🤏 ~5kb minzipped 🏷 TypeScript support
❤ Made with love 🔺 glMatrix support

📈 Benchmarks

noctjs/ecs-benchmark ddmills/js-ecs-benchmarks

💿 Install

npm i bitecs

📘 Documentation

🏁 Getting Started
📑 API
FAQ
🏛 Tutorial

🕹 Example

import {
  createWorld,
  Types,
  defineComponent,
  defineQuery,
  addEntity,
  addComponent,
  pipe,
} from 'bitecs'

const Vector3 = { x: Types.f32, y: Types.f32, z: Types.f32 }
const Position = defineComponent(Vector3)
const Velocity = defineComponent(Vector3)

const movementQuery = defineQuery([Position, Velocity])

const movementSystem = (world) => {
  const { time: { delta } } = world
  const ents = movementQuery(world)
  for (let i = 0; i < ents.length; i++) {
    const eid = ents[i]
    Position.x[eid] += Velocity.x[eid] * delta
    Position.y[eid] += Velocity.y[eid] * delta
    Position.z[eid] += Velocity.z[eid] * delta
  }
  return world
}

const timeSystem = world => {
  const { time } = world
  const now = performance.now()
  const delta = now - time.then
  time.delta = delta
  time.elapsed += delta
  time.then = now
  return world
}

const pipeline = pipe(movementSystem, timeSystem)

const world = createWorld()
world.time = { delta: 0, elapsed: 0, then: performance.now() }

const eid = addEntity(world)
addComponent(world, Position, eid)
addComponent(world, Velocity, eid)
Velocity.x[eid] = 1.23
Velocity.y[eid] = 1.23

setInterval(() => {
  pipeline(world)
}, 16)

🔌 Powering

About

Functional, minimal, data-oriented, ultra-high performance ECS library written in JavaScript

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 99.9%
  • TypeScript 0.1%