diff --git a/README.md b/README.md index 0c35a6e..aa5d9dd 100644 --- a/README.md +++ b/README.md @@ -4,73 +4,105 @@ [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge)](LICENSE) [![Wally](https://img.shields.io/github/v/tag/ukendio/jecs?&style=for-the-badge)](https://wally.run/package/ukendio/jecs) + # Jecs - Just a Stupidly Fast ECS -A high-performance Entity Component System (ECS) for Roblox games. +A high-performance Entity Component System (ECS) for Roblox games, supporting both Luau and TypeScript. ## Features -- 🚀 **Blazing Fast**: Iterate over 800,000 entities at 60 frames per second -- 🔗 **Entity Relationships**: First-class support for [entity relationships](docs/learn/concepts/relationships.md) -- 🔒 **Type Safety**: Fully typed API for both [Luau](https://luau-lang.org/) and TypeScript -- 📦 **Zero Dependencies**: No external dependencies required -- ⚡ **Optimized Storage**: Cache-friendly [archetype/SoA](https://ajmmertens.medium.com/building-an-ecs-2-archetypes-and-vectorization-fe21690805f9) storage -- ✅ **Battle-tested**: Rigorously [unit tested](https://github.com/Ukendio/jecs/actions/workflows/ci.yaml) for stability +* **Blazing Fast:** Iterate over hundreds of thousands of entities at 60 frames per second. Benchmark results are available in the documentation. +* **Entity Relationships:** First-class support for defining and querying relationships between entities. +* **Type Safety:** Fully typed API for both Luau and TypeScript, enhancing code maintainability and reducing errors. +* **Zero Dependencies:** No external dependencies required, simplifying integration into your project. +* **Optimized Storage:** Cache-friendly archetype/SoA (Structure of Arrays) storage for optimal performance. +* **Battle-tested:** Rigorously unit tested for stability and reliability. +* **Comprehensive Documentation:** Detailed documentation guides you through installation, usage, and advanced concepts. + ## Documentation -- [Getting Started](docs/learn/overview/get-started.md) -- [API Reference](docs/api/jecs.md) -- [Concepts](docs/learn/concepts/) -- [Examples](examples/) -- [FAQ](docs/learn/faq/common-issues.md) +* [Getting Started](docs/learn/overview/get-started.md) +* [API Reference](docs/api/jecs.md) (Note: This link may need updating to reflect the actual location of the API docs if they are generated separately) +* [Concepts](docs/learn/concepts/) + * Entities and Components + * Queries + * Relationships + * Component Traits + * Addons +* [Examples](examples/) +* [FAQ](docs/learn/faq/common-issues.md) +* [Contributing](docs/contributing/) -## Quick Example + +## Quick Example (Luau) ```lua local world = jecs.World.new() -local pair = jecs.pair - --- Define components local Position = world:component() :: jecs.Entity local Velocity = world:component() :: jecs.Entity --- Create an entity local entity = world:entity() world:set(entity, Position, Vector3.new(0, 0, 0)) world:set(entity, Velocity, Vector3.new(1, 0, 0)) --- Update system +-- Update system (example) for id, position, velocity in world:query(Position, Velocity) do world:set(id, Position, position + velocity) end ``` +## Quick Example (TypeScript) + +```typescript +import { World } from "@rbxts/jecs"; + +const world = new World(); +const Position = world.component(); +const Velocity = world.component(); + +const entity = world.entity(); +world.set(entity, Position, new Vector3(0, 0, 0)); +world.set(entity, Velocity, new Vector3(1, 0, 0)); + +// Update system (example) +for (const [id, position, velocity] of world.query(Position, Velocity)) { + world.set(id, Position, position.add(velocity)); +} +``` + ## Performance -### Query Performance -21,000 entities, 125 archetypes, 4 random components queried: -![Queries](assets/image-3.png) - -### Insertion Performance -Inserting 8 components to an entity and updating them over 50 times: -![Insertions](assets/image-4.png) +Benchmark results demonstrating Jecs' performance are available in the documentation. These include query and insertion performance tests. ## Installation -### Using Wally +### Using Wally (Luau) + +Add Jecs to your `wally.toml`: + ```toml [dependencies] jecs = "ukendio/jecs@0.2.3" ``` -### Using npm (roblox-ts) +Then run: + ```bash -npm i @rbxts/jecs +wally install ``` -### Standalone -Download `jecs.rbxm` from our [releases page](https://github.com/Ukendio/jecs/releases). +### Using npm (Roblox-ts) + +```bash +npm install @rbxts/jecs +``` + +### Standalone Installation + +1. Download `jecs.rbxm` from the [releases page](https://github.com/ukendio/jecs/releases). +2. Import it into your Roblox project. + ## Contributing @@ -78,10 +110,11 @@ We welcome contributions! Please see our [contribution guidelines](docs/contribu ## Community & Support -- [Discord Community](https://discord.gg/h2NV8PqhAD) -- [GitHub Issues](https://github.com/ukendio/jecs/issues) -- [API Documentation](https://ukendio.github.io/jecs/) +* [Discord Community](https://discord.gg/h2NV8PqhAD) +* [GitHub Issues](https://github.com/ukendio/jecs/issues) +* [API Documentation](https://ukendio.github.io/jecs/) (Note: This link may need updating) ## License Jecs is [MIT licensed](LICENSE). +