Merge Main

This commit is contained in:
Ukendio 2024-08-01 19:17:48 +02:00
commit 6082c1d729
23 changed files with 2025 additions and 999 deletions

View file

@ -57,7 +57,7 @@ local function flip()
end
local common = 0
local N = 500
local N = 2^16-2
local archetypes = {}
local hm = 0
@ -170,19 +170,19 @@ return {
end,
Functions = {
Mirror = function()
for i = 1, 1000 do
for entityId, firstComponent in mcs:query(E1, E4) do
end
Matter = function()
for entityId, firstComponent in newWorld:query(A1, A2, A3, A4) do
end
end,
ECR = function()
for entityId, firstComponent in registry2:view(B1, B2, B3, B3) do
end
end,
Jecs = function()
for i = 1, 1000 do
for entityId, firstComponent in ecs:query(D1, D4) do
end
end
for entityId, firstComponent in ecs:query(D1, D2, D3, D4) do
end
end,
},
}

View file

@ -35,9 +35,9 @@ export default defineConfig({
{
text: 'Concepts',
items: [
{ text: 'Entities', link: 'learn/concepts/entities' },
{ text: 'Static Components', link: 'learn/concepts/static-components' },
{ text: 'Entities and Components', link: 'learn/concepts/entities-and-components' },
{ text: 'Queries', link: 'learn/concepts/queries' },
{ text: 'Relationships', link: 'learn/concepts/relationships' },
]
},
{
@ -61,7 +61,7 @@ export default defineConfig({
},
socialLinks: [
{ icon: 'github', link: 'https://github.com/vuejs/vitepress' }
{ icon: 'github', link: 'https://github.com/ukendio/jecs' }
]
}
})

View file

@ -8,10 +8,31 @@ Jecs. Just an Entity Component System.
```luau
jecs.World: World
```
A world is a container of all ECS data. Games can have multiple worlds but component IDs may conflict between worlds. Ensure to register the same component IDs in the same order for each world.
### Wildcard
```luau
jecs.Wildcard: Entity
```
Builtin component type. This ID is used for wildcard queries.
### z<>
### Component
```luau
jecs.Component: Entity
```
Builtin component type. Every ID created with [world:component()](world.md#component()) has this type added to it. This is meant for querying every component ID.
### ChildOf
```luau
jecs.ChildOf: Entity
```
Builtin component type. This ID is for creating parent-child hierarchies.
:::
### Rest
```luau
jecs.Rest: Entity
```
## Functions

View file

@ -4,129 +4,128 @@ A World contains entities which have components. The World is queryable and can
## Functions
### new()
### drain()
```luau
function World.new(): World
function query:drain(): Query
```
Creates a new world.
This function will impede it from being reset when the query is being iterated.
### next()
```luau
function query:next(): Query
```
Get the next result in the query. Drain must have been called beforehand or otherwise it will error.
### with()
```luau
function query:with(
...: Entity -- The IDs to query with
): Query
```
Adds IDs to query with, but will not use their data. This is useful for Tags or generally just data you do not care for.
Example:
::: code-group
```luau [luau]
local world = jecs.World.new()
```
```ts [typescript]
import { World } from "@rbxts/jecs";
const world = new World();
```
:::
## entity()
```luau
function World:entity(): Entity -- The new entit.
```
Creates a new entity.
Example:
::: code-group
```luau [luau]
local entity = world:entity()
```
```ts [typescript]
const entity = world.entity();
```
::
:
### component()
```luau
function World:component<T>(): Entity<T> -- The new componen.
```
Creates a new component.
Example:
::: code-group
```luau [luau]
local Health = world:component() :: jecs.Entity<number>
```
```ts [typescript]
const Health = world.component<number>();
```
:::
::: info
You should use this when creating components.
For example, a Health type should be created using this.
:::
### get()
```luau
function World:get(
entity: Entity, -- The entity
...: Entity<T> -- The types to fetch
): ... -- Returns the component data in the same order they were passed in
```
Returns the data for each provided type for the corresponding entity.
:::
### add()
```luau
function World:add(
entity: Entity, -- The entity
id: Entity<T> -- The component ID to add
): ()
```
Adds a component ID to the entity.
This operation adds a single (component) id to an entity.
::: info
This function is idempotent, meaning if the entity already has the id, this operation will have no side effects.
:::
### set()
```luau
function World:set(
entity: Entity, -- The entity
id: Entity<T>, -- The component ID to set
data: T -- The data of the component's type
): ()
```
Adds or changes the entity's component.
### query()
```luau
function World:query(
...: Entity<T> -- The component IDs to query with. Entities that satifies the conditions will be returned
): Query<...Entity<T>> -- Returns the Query which gets the entity and their corresponding data when iterated
```
Creates a [`query`](query) with the given component IDs.
Example:
::: code-group
```luau [luau]
for id, position, velocity in world:query(Position, Velocity) do
-- Do something
for id, position in world:query(Position):with(Velocity) do
-- Do something
end
```
```ts [typescript]
for (const [id, position, velocity] of world.query(Position, Velocity) {
for (const [id, position] of world.query(Position).with(Velocity)) {
// Do something
}
```
:::
:::info
Put the IDs inside of `world:query()` instead if you need the data.
:::
### without()
```luau
function query:without(
...: Entity -- The IDs to filter against.
): Query -- Returns the Query
```
Removes entities with the provided IDs from the query.
Example:
::: code-group
```luau [luau]
for _ in world:query(Position):without(Velocity) do
-- Do something
end
```
```ts [typescript]
for (const _ of world.query(Position).without(Velocity)) {
// Do something
}
```
:::
### replace()
```luau
function query:replace(
fn: (entity: Entity, ...: T...) -> U... -- ): () -- The callback that will transform the entities' data
```
This function takes a callback which is given the current queried data of each matching entity. The values returned by the callback will be set as the new data for each given ID on the entity.
Example:
::: code-group
```luau [luau]
world:query(Position, Velocity):replace(function(e, position, velocity)
return position + velocity, velocity * 0.9
end
```
```ts [typescript]
world
.query(Position, Velocity)
.replace((e, position, velocity) =>
$tuple(position.add(velocity), velocity.mul(0.9)),
);
```
:::
### archetypes()
```luau
function query.archetypes(): { Archetype }
```
Returns the matching archetypes of the query.
Example:
::: code-group
```luau [luau]
for i, archetype in world:query(Position, Velocity).archetypes() do
local columns = archetype.columns
local field = archetype.records
local P = field[Position]
local V = field[Velocity]
for row, entity in archetype.entities do
local position = columns[P][row]
local velocity = columns[V][row]
-- Do something
end
end
```
:::
:::info
This function is meant for internal usage. Use this if you want to maximize performance by inlining the iterator.
:::

View file

@ -1,4 +1,4 @@
# Query
# World
A World contains entities which have components. The World is queryable and can be used to get entities with a specific set of components.
@ -109,10 +109,10 @@ Adds or changes the entity's component.
### query()
```luau
function World:query(
...: Entity<T> -- The component IDs to query with. Entities that satifies the conditions will be returned
): Query<...Entity<T>> -- Returns the Query which gets the entity and their corresponding data when iterated
...: Entity -- The IDs to query with
): Query -- Returns the Query
```
Creates a [`query`](query) with the given component IDs.
Creates a [`query`](query) with the given IDs. Entities that satisfies the conditions of the query will be returned and their corresponding data.
Example:
::: code-group
@ -130,3 +130,36 @@ for (const [id, position, velocity] of world.query(Position, Velocity) {
```
:::
:::info
Queries are uncached by default, this is generally very cheap unless you have high fragmentation from e.g. relationships.
:::
### target()
```luau
function World:target(
entity: Entity, -- The entity
relation: Entity -- The relationship between the entity and the target
): Entity? -- Returns the parent of the child
```
Get the target of a relationship.
This will return a target (second element of a pair) of the entity for the specified relationship.
If there is no pair with specified relationship, it will return nil.
### parent()
```luau
function World:parent(
child: Entity -- The child ID to find the parent of
): Entity? -- Returns the parent of the child
```
Get parent (target of ChildOf relationship) for entity. If there is no ChildOf relationship pair, it will return nil.
This operation is the same as calling:
```luau
world:target(entity, jecs.ChildOf)
```

View file

@ -0,0 +1,115 @@
# Entities and Components
## Entities
Entities represent things in a game. In a game there may be entities of characters, buildings, projectiles, particle effects etc.
By itself, an entity is just an unique identifier without any data
### Creation
## Components
A component is something that is added to an entity. Components can simply tag an entity ("this entity is an `Npc`"), attach data to an entity ("this entity is at `Position` `Vector3.new(10, 20, 30)`") and create relationships between entities ("bob `Likes` alice") that may also contain data ("bob `Eats` `10` apples").
### Operations
Operation | Description
----------|------------
`get` | Get a specific component or set of components from an entity.
`add` | Adds component to an entity. If entity already has the component, `add` does nothing.
`set` | Sets the value of a component for an entity. `set` behaves as a combination of `add` and `get`
`remove` | Removes component from entity. If entity doesn't have the component, `remove` does nothing.
`clear` | Remove all components from an entity. Clearing is more efficient than removing one by one.
### Components are entities
In an ECS, components need to be uniquely identified. In Jecs this is done by making each component is its own unique entity. If a game has a component Position and Velocity, there will be two entities, one for each component. Component entities can be distinguished from "regular" entities as they have a `Component` component. An example:
::: code-group
```luau [luau]
local Position = world:component() :: jecs.Entity<Vector3>
print(world:has(Position, Jecs.Component))
```
```typescript [typescript]
const Position = world.component<Vector3>();
print(world.has(Position, Jecs.Component))
```
:::
All of the APIs that apply to regular entities also apply to component entities. This means it is possible to contexualize components with logic by adding traits to components
::: code-group
```luau [luau]
local Networked = world:component()
local Type = world:component()
local Name = world:component()
local Position = world:component() :: jecs.Entity<Vector3>
world:add(Position, Networked)
world:set(Posiition, Name, "Position")
world:set(Position, Type, { size = 12, type = "Vector3" } ) -- 12 bytes to represent a Vector3
for id, ty, name in world:query(Type, Name):with(Networked) do
local batch = {}
for entity, data in world:query(id) do
table.insert(batch, { entity = entity, data = data })
end
-- entities are sized f64
local packet = buffer.create(#batch * (8 + ty.size))
local offset = 0
for _, entityData in batch do
offset+=8
buffer.writef64(packet, offset, entityData.entity)
if ty.type == "Vector3" then
local vec3 = entity.data :: Vector3
offset += 4
buffer.writei32(packet, offset, vec3.X)
offset += 4
buffer.writei32(packet, offset, vec3.Y)
offset += 4
buffer.writei32(packet, offset, vec3.Z)
end
end
updatePositions:FireServer(packet)
end
```
```typescript [typescript]
const Networked = world.component()
const Type = world.component()
const Name = world.component()
const Position = world.component<Vector3>();
world.add(Position, Networked)
world.set(Posiition, Name, "Position")
world.set(Position, Type, { size: 12, type: "Vector3" } ) // 12 bytes to represent a Vector3
for (const [id, ty, name] of world.query(Type, Name).with(Networked)) {
const batch = new Array<{ entity: Entity, data: unknown}>()
for (const [entity, data] of world.query(id)) {
batch.push({ entity, data })
}
// entities are sized f64
const packet = buffer.create(batch.size() * (8 + ty.size))
const offset = 0
for (const [_, entityData] of batch) {
offset+=8
buffer.writef64(packet, offset, entityData.entity)
if (ty.type == "Vector3") {
const vec3 = entity.data as Vector3
offset += 4
buffer.writei32(packet, offsetm, vec3.X)
offset += 4
buffer.writei32(packet, offset, vec3.Y)
offset += 4
buffer.writei32(packet, offset, vec3.Z)
}
}
updatePositions.FireServer(packet)
}
```
:::

View file

@ -1 +0,0 @@

View file

@ -1,3 +1,104 @@
## TODO
# Queries
This is a TODO stub.
## Introductiuon
Queries enable games to quickly find entities that satifies provided conditions.
Jecs queries can do anything from returning entities that match a simple list of components, to matching against entity graphs.
This manual contains a full overview of the query features available in Jecs. Some of the features of Jecs queries are:
- Queries have support for relationships pairs which allow for matching against entity graphs without having to build complex data structures for it.
- Queries support filters such as `query:with(...)` if entities are required to have the components but you dont actually care about components value. And `query:without(...)` which selects entities without the components.
- Queries can be drained or reset on when called, which lets you choose iterator behaviour.
- Queries can be called with any ID, including entities created dynamically, this is useful for pairs.
- Queries are already fast but can be futher inlined via `query:archetypes()` for maximum performance to eliminate function call overhead which is roughly 70-80% of the cost for iteration.
## Creating Queries
This section explains how to create queries in the different language bindings.
:::code-group
```luau [luau]
for _ in world:query(Position, Velocity) do end
```
```typescript [typescript]
for (const [_] of world.query(Position, Velocity)) {}
```
:::
### Components
A component is any single ID that can be added to an entity. This includes tags and regular entities, which are IDs that do not have the builtin `Component` component. To match a query, an entity must have all the requested components. An example:
```luau
local e1 = world:entity()
world:add(e1, Position)
local e2 = world:entity()
world:add(e2, Position)
world:add(e2, Velocity)
local e3 = world:entity()
world:add(e3, Position)
world:add(e3, Velocity)
world:add(e3, Mass)
```
Only entities `e2` and `e3` match the query Position, Velocity.
### Wildcards
Jecs currently only supports the `Any` type of wildcards which a single result for the first component that it matches.
When using the `Any` type wildcard it is undefined which component will be matched, as this can be influenced by other parts of the query. It is guaranteed that iterating the same query twice on the same dataset will produce the same result.
Wildcards are particularly useful when used in combination with pairs (next section).
### Pairs
A pair is an ID that encodes two elements. Pairs, like components, can be added to entities and are the foundation for [Relationships](relationships.md).
The elements of a pair are allowed to be wildcards. When a query pair returns an `Any` type wildcard, the query returns at most a single matching pair on an entity.
The following sections describe how to create queries for pairs in the different language bindings.
:::code-group
```luau [luau]
local Likes = world:entity()
local bob = world:entity()
for _ in world:query(pair(Likes, bob)) do end
```
```typescript [typescript]
const Likes = world.entity()
const bob = world.entity()
for (const [_] of world.query(pair(Likes, bob))) {}
```
:::
When a query pair contains a wildcard, the `world:target()` function can be used to determine the target of the pair element that matched the query:
:::code-group
```luau [luau]
for id in world:query(pair(Likes, jecs.Wildcard)) do
print(`entity {getName(id)} likes {getName(world, world:target(id, Likes))}`)
end
```
```typescript [typescript]
const Likes = world.entity()
const bob = world.entity()
for (const [_] of world.query(pair(Likes, jecs.Wildcard))) {
print(`entity ${getName(id)} likes ${getName(world.target(id, Likes))}`)
}
```
:::
### Filters
Filters are extensions to queries which allow you to select entities from a more complex pattern but you don't actually care about the component values.
The following filters are supported by queries:
Identifier | Description
---------- | -----------
With | Must match with all terms.
Without | Must not match with provided terms.
This page takes wording and terminology directly from Flecs [documentation](https://www.flecs.dev/flecs/md_docs_2Queries.html)

View file

@ -0,0 +1,210 @@
# Relationships
Relationships makes it possible to describe entity graphs natively in ECS.
Adding/removing relationships is similar to adding/removing regular components, with as difference that instead of a single component id, a relationship adds a pair of two things to an entity. In this pair, the first element represents the relationship (e.g. "Eats"), and the second element represents the relationship target (e.g. "Apples").
Relationships can be used to describe many things, from hierarchies to inventory systems to trade relationships between players in a game. The following sections go over how to use relationships, and what features they support.
## Definitions
Name | Description
----------|------------
Id | An id that can be added and removed
Component | Id with a single element (same as an entity id)
Relationship | Used to refer to first element of a pair
Target | Used to refer to second element of a pair
Source | Entity to which an id is added
## Relationship queries
There are a number of ways a game can query for relationships. The following kinds of queries are available for all (unidirectional) relationships, and are all constant time:
Test if entity has a relationship pair
:::code-group
```luau [luau]
world:has(bob, pair(Eats, Apples)
```
```typescript [typescript]
world.has(bob, pair(Eats, Apples)
```
:::
Test if entity has a relationship wildcard
:::code-group
```luau [luau]
world:has(bob, pair(Eats, jecs.Wildcard)
```
```typescript [typescript]
world.has(bob, pair(Eats, jecs.Wildcard)
```
:::
Get parent for entity
:::code-group
```luau [luau]
world:parent(bob)
```
```typescript [typescript]
world.parent(bob, pair(Eats, jecs.Wildcard)
```
:::
Find first target of a relationship for entity
:::code-group
```luau [luau]
world:target(bob, Eats)
```
```typescript [typescript]
world.target(bob, Eats)
```
:::
Find first target of a relationship for entity
:::code-group
```luau [luau]
world:target(bob, Eats)
```
```typescript [typescript]
world.target(bob, Eats)
```
:::
Find all entities with a pair
:::code-group
```luau [luau]
for id in world:query(pair(Eats, Apples)) do
-- ...
end
```
```typescript [typescript]
for (const [id] of world.query(pair(Eats, Apples)) {
// ...
}
```
:::
Find all entities with a pair wildcard
:::code-group
```luau [luau]
for id in world:query(pair(Eats, jecs.Wildcard)) do
local food = world:target(id, Eats) -- Apples, ...
end
```
```typescript [typescript]
for (const [id] of world.query(pair(Eats, jecs.Wildcard)) {
const food = world.target(id, Eats) // Apples, ...
}
```
:::
Iterate all children for a parent
:::code-group
```luau [luau]
for child in world:query(pair(jecs.ChildOf, parent)) do
-- ...
end
```
```typescript [typescript]
for (const [child] of world.query(pair(jecs.ChildOf, parent)) {
// ...
}
```
:::
Relationship components
Relationship pairs, just like regular component, can be associated with data.
:::code-group
```luau [luau]
local Position = world:component()
local Eats = world:component()
local Apples = world:entity()
local Begin = world:entity()
local End = world:entity()
local e = world:entity()
world:set(e, pair(Eats, Apples), { amount = 1 })
world:set(e, pair(Begin, Position), Vector3.new(0, 0, 0))
world:set(e, pair(End, Position), Vector3.new(10, 20, 30))
world:add(e, jecs.ChildOf, Position)
```
```typescript [typescript]
const Position = world.component()
const Eats = world.component()
const Apples = world.entity()
const Begin = world.entity()
const End = world.entity()
const e = world.entity()
world.set(e, pair(Eats, Apples), { amount: 1 })
world.set(e, pair(Begin, Position), new Vector3(0, 0, 0))
world.set(e, pair(End, Position), new Vector3(10, 20, 30))
world.add(e, jecs.ChildOf, Position)
```
:::
## Relationship wildcards
When querying for relationship pairs, it is often useful to be able to find all instances for a given relationship or target. To accomplish this, an game can use wildcard expressions.
Wildcards may used for the relationship or target part of a pair
```luau
pair(Likes, jecs.Wildcard) -- Matches all Likes relationships
pair(jecs.Wildcard, Alice) -- Matches all relationships with Alice as target
```
## Relationship performance
This section goes over the performance implications of using relationships.
### Introduction
The ECS storage needs to know two things in order to store components for entities:
- Which IDs are associated with an entity
- Which types are associated with those ids
Ids represent anything that can be added to an entity. An ID that is not associated with a type is called a tag. An ID associated with a type is a component. For regular components, the ID is a regular entity that has the builtin `Component` component.
### Storing relationships
Relationships do not fundamentally change or extend the capabilities of the storage. Relationship pairs are two elements encoded into a single 53-bit ID, which means that on the storage level they are treated the same way as regular component IDs. What changes is the function that determines which type is associated with an id. For regular components this is simply a check on whether an entity has `Component`. To support relationships, new rules are added to determine the type of an id.
Because of this, adding/removing relationships to entities has the same performance as adding/removing regular components. This becomes more obvious when looking more closely at a function that adds a relationship pair.
### Id ranges
Jecs reserves entity ids under a threshold (HI_COMPONENT_ID, default is 256) for components. This low id range is used by the storage to more efficiently encode graph edges between archetypes. Graph edges for components with low ids use direct array indexing, whereas graph edges for high ids use a hashmap. Graph edges are used to find the next archetype when adding/removing component ids, and are a contributing factor to the performance overhead of add/remove operations.
Because of the way pair IDs are encoded, a pair will never be in the low id range. This means that adding/removing a pair ID always uses a hashmap to find the next archetype. This introduces a small overhead.
### Fragmentation
Fragmentation is a property of archetype-based ECS implementations where entities are spread out over more archetypes as the number of different component combinations increases. The overhead of fragmentation is visible in two areas:
- Archetype creation
- ueries (queries have to match & iterate more archetypes)
Games that make extensive use of relationships might observe high levels of fragmentation, as relationships can introduce many different combinations of components. While the Jecs storage is optimized for supporting large amounts (hundreds of thousands) of archetypes, fragmentation is a factor to consider when using relationships.
Union relationships are planned along with other improvements to decrease the overhead of fragmentation introduced by relationships.
### Archetype Creation
When an ID added to an entity is deleted, all references to that ID are deleted from the storage. For example, when the component Position is deleted it is removed from all entities, and all archetypes with the Position component are deleted. While not unique to relationships, it is more common for relationships to trigger cleanup actions, as relationship pairs contain regular entities.
The opposite is also true. Because relationship pairs can contain regular entities which can be created on the fly, archetype creation is more common than in games that do not use relationships. While Jecs is optimized for fast archetypes creation, creating and cleaning up archetypes is inherently more expensive than creating/deleting an entity. Therefore archetypes creation is a factor to consider, especially for games that make extensive use of relationships.
### Indexing
To improve the speed of evaluating queries, Jecs has indices that store all archetypes for a given component ID. Whenever a new archetype is created, it is registered with the indices for the IDs the archetype has, including IDs for relationship pairs.
While registering a archetype for a relationship index is not more expensive than registering a archetype for a regular index, a archetype with relationships has to also register itself with the appropriate wildcard indices for its relationships. For example, an archetype with relationship `pair(Likes, Apples)` registers itself with the `pair(Likes, Apples)`, `pair(Likes, jecs.Wildcard)` and `pair(jecs.Wildcard, Apples)` indices. For this reason, creating new archetypes with relationships has a higher overhead than a archetype without relationships.
This page takes wording and terminology directly from Flecs, the first ECS with full support for [Entity Relationships](https://www.flecs.dev/flecs/md_docs_2Relationships.html).

View file

@ -1,3 +0,0 @@
## TODO
This is a TODO stub.

View file

@ -1,3 +1,71 @@
## TODO
# First Jecs project
This is a TODO stub.
Now that you have installed Jecs, you can create your [World](https://ukendio.github.io/jecs/api/world.html).
:::code-group
```luau [luau]
local jecs = require(path/to/jecs)
local world = jecs.World.new()
```
```typescript [typescript]
import { World } from "@rbxts/jecs"
const world = new World()
```
:::
Let's create a couple components.
:::code-group
```luau [luau]
local jecs = require(path/to/jecs)
local world = jecs.World.new()
local Position = world:component()
local Velocity = world:component()
```
```typescript [typescript]
import { World } from "@rbxts/jecs"
const world = new World()
const Position = world.component()
const Velocity = world.component()
```
:::
Systems can be as simple as a query in a function or a more contextualized construct. Let's make a system that moves an entity and decelerates over time.
:::code-group
```luau [luau]
local jecs = require(path/to/jecs)
local world = jecs.World.new()
local Position = world:component()
local Velocity = world:component()
for id, position, velocity in world:query(Position, Velocity) do
world:set(id, Position, position += velocity)
world:set(id, Velocity, velocity * 0.9)
end
```
```typescript [typescript]
import { World } from "@rbxts/jecs"
const world = new World()
const Position = world.component()
const Velocity = world.component()
for (const [id, position, velocity] of world.query(Position, Velocity)) {
world.set(id, Position, position.add(velocity)
world.set(id, Velocity, velocity.mul(0.9))
}
```
:::
## Where To Get Help
If you are encounting problems, there are resources for you to get help:
- [Roblox OSS Discord server](https://discord.gg/h2NV8PqhAD) has a [#jecs](https://discord.com/channels/385151591524597761/1248734074940559511) thread under the [#projects](https://discord.com/channels/385151591524597761/1019724676265676930) channel
- [Open an issue](https://github.com/ukendio/jecs/issues) if you run into bugs or have feature requests
- Dive into the nitty gritty in the [thesis paper](https://raw.githubusercontent.com/Ukendio/jecs/main/thesis/drafts/1/paper.pdf)

41
docs/public/jecs_logo.svg Normal file
View file

@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="1080" height="1080" viewBox="0 0 1080 1080" xml:space="preserve">
<desc>Created with Fabric.js 5.2.4</desc>
<defs>
</defs>
<rect x="0" y="0" width="100%" height="100%" fill="transparent"></rect>
<g transform="matrix(1 0 0 1 540 540)" id="09ac800d-29f3-4193-b9f5-faf19e8b1726" >
<rect style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(255,255,255); fill-rule: nonzero; opacity: 1; visibility: hidden;" vector-effect="non-scaling-stroke" x="-540" y="-540" rx="0" ry="0" width="1080" height="1080" />
</g>
<g transform="matrix(Infinity NaN NaN Infinity 0 0)" id="619f0364-53a0-4caa-97e3-8f543e0cc17f" >
</g>
<g transform="matrix(NaN NaN NaN NaN 0 0)" >
<g style="" >
</g>
</g>
<g transform="matrix(17.7 0 0 17.7 540 540)" >
<g style="" vector-effect="non-scaling-stroke" >
<g transform="matrix(1 0 0 1 -18.25 0)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(52,81,178); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-5, -9)" d="M 5 14 C 5.8 14 6 13.3333 6 13 L 6 4 L 0 4 L 0 0 L 6 0 L 10 0 L 10 13 C 10 17 6.66667 18 5 18 L 0 18 L 0 14 L 5 14 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 16.75 0)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(52,81,178); fill-rule: nonzero; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-40, -9)" d="M 46.5 4 L 46.5 0 L 39 0 C 37.1667 0 33.5 1.1 33.5 5.5 C 33.5 9.9 36.8333 11 38.5 11 L 41 11 C 41.5 11 42.5 11.3 42.5 12.5 C 42.5 13.7 41.5 14 41 14 L 33.5 14 L 33.5 18 L 41.5 18 C 43.1667 18 46.5 16.9 46.5 12.5 C 46.5 8.1 43.1667 7 41.5 7 L 39 7 C 38.5 7 37.5 6.7 37.5 5.5 C 37.5 4.3 38.5 4 39 4 L 46.5 4 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 3.25 0)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(52,81,178); fill-rule: evenodd; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-26.5, -9)" d="M 32.5 0 L 32.5 4 L 30.5 4 C 28.5 4 24.5 5 24.5 9 C 24.5 11.0835 25.5853 12.3531 26.9078 13.0914 L 22.4606 14.661 C 21.2893 13.3156 20.5 11.4775 20.5 9 C 20.5 1.8 27.1667 0 30.5 0 L 32.5 0 Z M 24.4656 16.3357 C 26.5037 17.5803 28.8905 18 30.5 18 L 32.5 18 L 32.5 14 L 31.0833 14 L 24.4656 16.3357 Z" stroke-linecap="round" />
</g>
<g transform="matrix(1 0 0 1 -5 0)" >
<path style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(52,81,178); fill-rule: evenodd; opacity: 1;" vector-effect="non-scaling-stroke" transform=" translate(-18.25, -9)" d="M 25.3793 0 C 24.766 0.241156 24.1568 0.53354 23.571 0.885014 C 22.1712 1.72492 20.9038 2.91123 20.0606 4.5 L 11 4.5 L 11 0 L 25.3793 0 Z M 25.5 4.39421 C 25.445 4.42876 25.3906 4.46402 25.3368 4.5 L 25.5 4.5 L 25.5 4.39421 Z M 20.0606 13.5 C 20.9038 15.0888 22.1712 16.2751 23.571 17.115 C 24.1568 17.4665 24.766 17.7588 25.3793 18 L 11 18 L 11 13.5 L 20.0606 13.5 Z M 19.1854 7 C 19.0649 7.62348 19 8.28956 19 9 C 19 9.71044 19.0649 10.3765 19.1854 11 L 11 11 L 11 7 L 19.1854 7 Z" stroke-linecap="round" />
</g>
</g>
</g>
<g transform="matrix(NaN NaN NaN NaN 0 0)" >
<g style="" >
</g>
</g>
<g transform="matrix(NaN NaN NaN NaN 0 0)" >
<g style="" >
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

After

Width:  |  Height:  |  Size: 42 KiB

BIN
image.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 187 KiB

View file

@ -24,7 +24,7 @@ type Archetype = {
type: string | number,
entities: { number },
columns: { Column },
records: { [number]: number },
records: { ArchetypeRecord },
}
type Record = {
archetype: Archetype,
@ -35,17 +35,11 @@ type Record = {
type EntityIndex = { dense: { [i24]: i53 }, sparse: { [i53]: Record } }
type ArchetypeRecord = number
--[[
TODO:
{
index: number,
type ArchetypeRecord = {
count: number,
column: number
}
]]
type ArchetypeMap = {
cache: { ArchetypeRecord },
first: ArchetypeMap,
@ -191,17 +185,17 @@ local function archetype_move(entityIndex: EntityIndex, to: Archetype,
local sourceEntities = from.entities
local destinationEntities = to.entities
local destinationColumns = to.columns
local tr = to.records
local records = to.records
local types = from.types
for i, column in columns do
-- Retrieves the new column index from the source archetype's record from each component
-- We have to do this because the columns are tightly packed and indexes may not correspond to each other.
local targetColumn = destinationColumns[tr[types[i]]]
local tr = records[types[i]]
-- Sometimes target column may not exist, e.g. when you remove a component.
if targetColumn then
targetColumn[destinationRow] = column[sourceRow]
if tr then
destinationColumns[tr.column][destinationRow] = column[sourceRow]
end
-- If the entity is the last row in the archetype then swapping it would be meaningless.
local last = #column
@ -283,7 +277,7 @@ local function ECS_ID_IS_WILDCARD(e: i53): boolean
return first == EcsWildcard or second == EcsWildcard
end
local function archetype_of(world: any, types: { i24 }, prev: Archetype?): Archetype
local function archetype_create(world: any, types: { i24 }, prev: Archetype?): Archetype
local ty = hash(types)
local id = world.nextArchetypeId + 1
@ -293,12 +287,13 @@ local function archetype_of(world: any, types: { i24 }, prev: Archetype?): Arche
local columns = (table.create(length) :: any) :: { Column }
local componentIndex = world.componentIndex
local records = {}
local records: { ArchetypeRecord } = {}
for i, componentId in types do
local tr = { column = i, count = 1 }
local idr = id_record_ensure(componentIndex, componentId)
idr.cache[id] = i
idr.cache[id] = tr
idr.size += 1
records[componentId] = i
records[componentId] = tr
if ECS_IS_PAIR(componentId) then
local relation = ecs_pair_relation(world.entityIndex, componentId)
local object = ecs_pair_object(world.entityIndex, componentId)
@ -309,11 +304,11 @@ local function archetype_of(world: any, types: { i24 }, prev: Archetype?): Arche
local o = ECS_PAIR(EcsWildcard, object)
local idr_o = id_record_ensure(componentIndex, o)
records[r] = i
records[o] = i
records[r] = tr
records[o] = tr
idr_r.cache[id] = i
idr_o.cache[id] = i
idr_r.cache[id] = tr
idr_o.cache[id] = tr
idr_r.size += 1
idr_o.size += 1
@ -375,7 +370,7 @@ local function world_target(world: World, entity: i53, relation: i24--[[, nth: n
return nil
end
return ecs_pair_object(entityIndex, archetype.types[archetypeRecord])
return ecs_pair_object(entityIndex, archetype.types[archetypeRecord.column])
end
local function world_parent(world: World, entity: i53)
@ -393,7 +388,7 @@ local function archetype_ensure(world: World, types, prev): Archetype
return archetype
end
return archetype_of(world, types, prev)
return archetype_create(world, types, prev)
end
local function find_insert(types: { i53 }, toAdd: i53): number
@ -478,7 +473,7 @@ local function world_set(world: World, entityId: i53, componentId: i53, data: un
-- If the archetypes are the same it can avoid moving the entity
-- and just set the data directly.
local archetypeRecord = to.records[componentId]
from.columns[archetypeRecord][record.row] = data
from.columns[archetypeRecord.column][record.row] = data
-- Should fire an OnSet event here.
return
end
@ -494,7 +489,7 @@ local function world_set(world: World, entityId: i53, componentId: i53, data: un
end
local archetypeRecord = to.records[componentId]
to.columns[archetypeRecord][record.row] = data
to.columns[archetypeRecord.column][record.row] = data
end
local function world_component(world: World): i53
@ -630,14 +625,14 @@ end
local world_get: (world: World, entityId: i53, a: i53, b: i53?, c: i53?, d: i53?, e: i53?) -> (...any)
do
-- Keeping the function as small as possible to enable inlining
local function fetch(id: i24, records, columns, row): any
local function fetch(id: i24, records: { ArchetypeRecord }, columns, row): any
local tr = records[id]
if not tr then
return nil
end
return columns[tr][row]
return columns[tr.column][row]
end
function world_get(world: World, entityId: i53, a: i53, b: i53?, c: i53?, d: i53?, e: i53?): ...any
@ -720,15 +715,18 @@ do
return nil :: any
end
local Arm = function(self: Query, ...)
return self
end
local EmptyQuery: Query = {
__iter = function(): Item
return noop
end,
drain = Arm,
next = noop :: Item,
replace = noop :: (Query, ...any) -> (),
without = function(self: Query, ...)
return self
end
with = Arm,
without = Arm,
}
setmetatable(EmptyQuery, EmptyQuery)
@ -736,121 +734,297 @@ do
local lastArchetype: number
local archetype: Archetype
local queryOutput: { any }
local queryLength: number
local entities: { number }
local i: number
local compatible_archetypes: { Archetype }
local column_indices: { { number} }
local ids: { number }
local columns
local function world_query_next(): any
local entityId = entities[i]
while entityId == nil do
lastArchetype += 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return nil
end
entities = archetype.entities
i = #entities
entityId = entities[i]
end
local A, B, C, D, E, F, G, H, I
local a, b, c, d, e, f, g, h
local row = i
i-=1
local init
local drain
local columns = archetype.columns
local tr = column_indices[lastArchetype]
local function query_init(query)
if init and drain then
return
end
if queryLength == 1 then
return entityId, columns[tr[1]][row]
elseif queryLength == 2 then
return entityId, columns[tr[1]][row], columns[tr[2]][row]
elseif queryLength == 3 then
return entityId, columns[tr[1]][row], columns[tr[2]][row], columns[tr[3]][row]
elseif queryLength == 4 then
return entityId, columns[tr[1]][row], columns[tr[2]][row], columns[tr[3]][row], columns[tr[4]][row]
elseif queryLength == 5 then
return entityId,
columns[tr[1]][row],
columns[tr[2]][row],
columns[tr[3]][row],
columns[tr[4]][row],
columns[tr[5]][row]
elseif queryLength == 6 then
return entityId,
columns[tr[1]][row],
columns[tr[2]][row],
columns[tr[3]][row],
columns[tr[4]][row],
columns[tr[5]][row],
columns[tr[6]][row]
elseif queryLength == 7 then
return entityId,
columns[tr[1]][row],
columns[tr[2]][row],
columns[tr[3]][row],
columns[tr[4]][row],
columns[tr[5]][row],
columns[tr[6]][row],
columns[tr[7]][row]
elseif queryLength == 8 then
return entityId,
columns[tr[1]][row],
columns[tr[2]][row],
columns[tr[3]][row],
columns[tr[4]][row],
columns[tr[5]][row],
columns[tr[6]][row],
columns[tr[7]][row],
columns[tr[8]][row]
end
init = true
lastArchetype = 1
archetype = compatible_archetypes[lastArchetype]
for j in ids do
queryOutput[j] = columns[tr[j]][row]
end
if not archetype then
return
end
return entityId, unpack(queryOutput, 1, queryLength)
queryOutput = {}
entities = archetype.entities
i = #entities
columns = archetype.columns
local records = archetype.records
if not B then
a = columns[records[A].column]
elseif not C then
a = columns[records[A].column]
b = columns[records[B].column]
elseif not D then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
elseif not E then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
elseif not F then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
e = columns[records[E].column]
elseif not G then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
e = columns[records[E].column]
f = columns[records[F].column]
elseif not H then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
e = columns[records[E].column]
f = columns[records[F].column]
g = columns[records[G].column]
elseif H then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[D].column]
e = columns[records[E].column]
f = columns[records[F].column]
g = columns[records[G].column]
h = columns[records[H].column]
end
end
local function world_query_iter()
return world_query_next
end
local world_query_iter_next
local function world_query_iter_create()
if not B then
function world_query_iter_next(): any
local entityId = entities[i]
while entityId == nil do
lastArchetype += 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return nil
end
entities = archetype.entities
i = #entities
if i == 0 then
continue
end
entityId = entities[i]
columns = archetype.columns
local records = archetype.records
a = columns[records[A].column]
end
local row = i
i-=1
return entityId, a[row]
end
elseif not C then
function world_query_iter_next(): any
local entityId = entities[i]
while entityId == nil do
lastArchetype += 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return nil
end
entities = archetype.entities
i = #entities
if i == 0 then
continue
end
entityId = entities[i]
columns = archetype.columns
local records = archetype.records
a = columns[records[A].column]
b = columns[records[B].column]
end
local row = i
i-=1
return entityId, a[row], b[row]
end
elseif not D then
function world_query_iter_next(): any
local entityId = entities[i]
while entityId == nil do
lastArchetype += 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return nil
end
entities = archetype.entities
i = #entities
if i == 0 then
continue
end
entityId = entities[i]
columns = archetype.columns
local records = archetype.records
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
end
local row = i
i-=1
return entityId, a[row], b[row], c[row]
end
elseif not E then
function world_query_iter_next(): any
local entityId = entities[i]
while entityId == nil do
lastArchetype += 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return nil
end
entities = archetype.entities
i = #entities
if i == 0 then
continue
end
entityId = entities[i]
columns = archetype.columns
local records = archetype.records
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
end
local row = i
i-=1
return entityId, a[row], b[row], c[row], d[row]
end
else
function world_query_iter_next(): any
local entityId = entities[i]
while entityId == nil do
lastArchetype += 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return nil
end
entities = archetype.entities
i = #entities
if i == 0 then
continue
end
entityId = entities[i]
columns = archetype.columns
local records = archetype.records
if not F then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
e = columns[records[E].column]
elseif not G then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
e = columns[records[E].column]
f = columns[records[F].column]
elseif not H then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
e = columns[records[E].column]
f = columns[records[F].column]
g = columns[records[G].column]
elseif not I then
a = columns[records[A].column]
b = columns[records[B].column]
c = columns[records[C].column]
d = columns[records[D].column]
e = columns[records[E].column]
f = columns[records[F].column]
g = columns[records[G].column]
h = columns[records[H].column]
end
end
local row = i
i-=1
if not F then
return entityId, a[row], b[row], c[row], d[row], e[row]
elseif not G then
return entityId, a[row], b[row], c[row], d[row], e[row], f[row]
elseif not H then
return entityId, a[row], b[row], c[row], d[row], e[row], f[row], g[row]
elseif not I then
return entityId, a[row], b[row], c[row], d[row], e[row], f[row], g[row], h[row]
end
local field = archetype.records
for j, id in ids do
queryOutput[j] = columns[field[id].column][row]
end
return entityId, unpack(queryOutput)
end
end
end
local function world_query_without(self, ...)
local withoutComponents = { ... }
for i = #compatible_archetypes, 1, -1 do
local archetype = compatible_archetypes[i]
local records = archetype.records
local shouldRemove = false
local withoutComponents = { ... }
for i = #compatible_archetypes, 1, -1 do
local archetype = compatible_archetypes[i]
local records = archetype.records
local shouldRemove = false
for _, componentId in withoutComponents do
if records[componentId] then
shouldRemove = true
break
for _, componentId in withoutComponents do
if records[componentId] then
shouldRemove = true
break
end
end
if shouldRemove then
local last = #compatible_archetypes
if last ~= i then
compatible_archetypes[i] = compatible_archetypes[last]
end
compatible_archetypes[last] = nil
end
end
end
if shouldRemove then
local last = #compatible_archetypes
if last ~= i then
compatible_archetypes[i] = compatible_archetypes[last]
column_indices[i] = column_indices[last]
end
compatible_archetypes[last] = nil
column_indices[last] = nil
end
end
lastArchetype = 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return EmptyQuery
end
return self
return self
end
local function world_query_replace_values(row, columns, ...)
@ -859,71 +1033,75 @@ do
end
end
local function world_query_replace(_, fn: (...any) -> (...any))
for i, archetype in compatible_archetypes do
local tr = column_indices[i]
local columns = archetype.columns
local function world_query_replace(query, fn: (...any) -> (...any))
query_init(query)
for row in archetype.entities do
if queryLength == 1 then
local a = columns[tr[1]]
local pa = fn(a[row])
for i, archetype in compatible_archetypes do
local columns = archetype.columns
local tr = archetype.records
for row in archetype.entities do
if not B then
local va = columns[tr[A].column]
local pa = fn(va[row])
a[row] = pa
elseif queryLength == 2 then
local a = columns[tr[1]]
local b = columns[tr[2]]
va[row] = pa
elseif not C then
local va = columns[tr[A].column]
local vb = columns[tr[B].column]
a[row], b[row] = fn(a[row], b[row])
elseif queryLength == 3 then
local a = columns[tr[1]]
local b = columns[tr[2]]
local c = columns[tr[3]]
va[row], vb[row] = fn(va[row], vb[row])
elseif not D then
local va = columns[tr[A].column]
local vb = columns[tr[B].column]
local vc = columns[tr[C].column]
a[row], b[row], c[row] = fn(a[row], b[row], c[row])
elseif queryLength == 4 then
local a = columns[tr[1]]
local b = columns[tr[2]]
local c = columns[tr[3]]
local d = columns[tr[4]]
va[row], vb[row], vc[row] = fn(va[row], vb[row], vc[row])
elseif not E then
local va = columns[tr[A].column]
local vb = columns[tr[B].column]
local vc = columns[tr[C].column]
local vd = columns[tr[D].column]
a[row], b[row], c[row], d[row] = fn(
a[row], b[row], c[row], d[row])
else
for i = 1, queryLength do
queryOutput[i] = columns[tr[i]][row]
end
world_query_replace_values(row, columns,
fn(unpack(queryOutput)))
end
va[row], vb[row], vc[row], vd[row] = fn(
va[row], vb[row], vc[row], vd[row])
else
local field = archetype.records
for j, id in ids do
queryOutput[j] = columns[field[id].column][row]
end
world_query_replace_values(row, columns,
fn(unpack(queryOutput)))
end
end
end
end
end
local function world_query_with(query, ...)
local ids = { ... }
for i = #compatible_archetypes, 1, -1 do
local archetype = compatible_archetypes[i]
local records = archetype.records
local shouldRemove = false
local ids = { ... }
for i = #compatible_archetypes, 1, -1 do
local archetype = compatible_archetypes[i]
local records = archetype.records
local shouldRemove = false
for _, id in ids do
if not records[id] then
shouldRemove = true
break
end
end
for _, id in ids do
if not records[id] then
shouldRemove = true
break
end
end
if shouldRemove then
table.remove(compatible_archetypes, i)
end
end
if shouldRemove then
local last = #compatible_archetypes
if last ~= i then
compatible_archetypes[i] = compatible_archetypes[last]
end
compatible_archetypes[last] = nil
end
end
if #compatible_archetypes == 0 then
return EmptyQuery
end
query_init(query)
return query
return query
end
-- Meant for directly iterating over archetypes to minimize
@ -933,8 +1111,27 @@ do
return compatible_archetypes
end
local function world_query_drain(query)
drain = true
query_init(query)
return query
end
local function world_query_iter(query)
query_init(query)
return world_query_iter_next
end
local function world_query_next()
if not drain then
error("Did you forget to call query:drain()?")
end
return world_query_iter_next()
end
local it = {
__iter = world_query_iter,
drain = world_query_drain,
next = world_query_next,
with = world_query_with,
without = world_query_without,
@ -950,11 +1147,12 @@ do
error("Missing components")
end
local indices = {}
compatible_archetypes = {}
local length = 0
local components = { ... } :: any
A, B, C, D, E, F, G, H, I = ...
local archetypes = world.archetypes
local firstArchetypeMap: ArchetypeMap
@ -975,7 +1173,6 @@ do
local compatibleArchetype = archetypes[id]
local archetypeRecords = compatibleArchetype.records
local records = {}
local skip = false
for i, componentId in components do
@ -984,8 +1181,6 @@ do
skip = true
break
end
-- index should be index.offset
records[i] = index
end
if skip then
@ -994,24 +1189,13 @@ do
length += 1
compatible_archetypes[length] = compatibleArchetype
indices[length] = records
end
column_indices = indices
drain = false
init = false
ids = components
lastArchetype = 1
archetype = compatible_archetypes[lastArchetype]
if not archetype then
return EmptyQuery
end
queryOutput = {}
queryLength = #ids
entities = archetype.entities
i = #entities
world_query_iter_create()
return it
end
@ -1187,7 +1371,7 @@ function World.new()
ROOT_ARCHETYPE = (nil :: any) :: Archetype,
}, World)
self.ROOT_ARCHETYPE = archetype_of(self, {})
self.ROOT_ARCHETYPE = archetype_create(self, {})
for i = HI_COMPONENT_ID + 1, EcsRest do
-- Initialize built-in components

File diff suppressed because it is too large Load diff

View file

@ -17,10 +17,10 @@
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{2.1}{Research Approach}}{3}{subsection.2.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{2.2}{Research Process}}{3}{subsection.2.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\tocsection {}{3}{Theory}}{3}{section.3}\protected@file@percent }
\citation{Nystrom}
\citation{Flecs}
\citation{Flecs}
\citation{Flecs}
\citation{Anderson}
\citation{ABC}
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{3.1}{Entity Component System Architecture}}{4}{subsection.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{3.2}{Cache Locality}}{4}{subsection.3.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{3.3}{Data Layouts}}{4}{subsection.3.3}\protected@file@percent }
@ -34,6 +34,7 @@
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{3.7}{Sparse Set}}{6}{subsection.3.7}\protected@file@percent }
\newlabel{Fig 2: Sparse Set}{{3.7}{6}{Sparse Set}{subsection.3.7}{}}
\citation{Caini}
\citation{Luau}
\newlabel{Fig 3: Removing Entity}{{3.7}{7}{Sparse Set}{subsection.3.7}{}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{4}{Implementation}}{7}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{4.1}{Data Structures}}{7}{subsection.4.1}\protected@file@percent }
@ -50,16 +51,18 @@
\@writefile{toc}{\contentsline {subsection}{\tocsubsection {}{5.3}{Queries}}{11}{subsection.5.3}\protected@file@percent }
\bibcite{Martin}{1}
\bibcite{Muratori}{2}
\bibcite{Flecs}{3}
\bibcite{Anderson}{4}
\bibcite{Caini}{5}
\bibcite{ABC}{3}
\newlabel{Fig 6: Queries}{{5.3}{12}{Queries}{subsection.5.3}{}}
\@writefile{toc}{\contentsline {section}{\tocsection {}{6}{Conclusions}}{12}{section.6}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\tocsection {}{7}{Acknowledgments}}{12}{section.7}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\tocsection {}{}{References}}{12}{section*.2}\protected@file@percent }
\bibcite{Nystrom}{6}
\bibcite{gdc}{7}
\bibcite{matter}{8}
\bibcite{Archetypes}{4}
\bibcite{Anderson}{5}
\bibcite{Caini}{6}
\bibcite{Nystrom}{7}
\bibcite{gdc}{8}
\bibcite{matter}{9}
\bibcite{luau}{10}
\newlabel{tocindent-1}{0pt}
\newlabel{tocindent0}{12.7778pt}
\newlabel{tocindent1}{17.77782pt}

View file

@ -1,12 +1,12 @@
# Fdb version 4
["pdflatex"] 1713880547.68476 "c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" "paper.pdf" "paper" 1713880549.83117 0
["pdflatex"] 1722383502.05394 "c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" "paper.pdf" "paper" 1722383503.46586 0
"../../images/archetype_graph.png" 1709688578 50172 8f93f7d24d4920bd8720f4b480771eb4 ""
"../../images/insertion.png" 1712278304 158773 c2f9fb7fae25fea3afb7e426b1d318d6 ""
"../../images/queries.png" 1712280101 205571 d976c9319fb29ae7dffc46ded3de4e55 ""
"../../images/insertion.png" 1720373630 158773 c2f9fb7fae25fea3afb7e426b1d318d6 ""
"../../images/queries.png" 1720373630 205571 d976c9319fb29ae7dffc46ded3de4e55 ""
"../../images/random_access.png" 1712278385 64975 e6fbe06298c59f52a21da1b89efe1d12 ""
"../../images/removed.png" 1709688578 10876 4c5ce75a368dfc9581164c9b1ace0382 ""
"../../images/sparseset.png" 1709688578 9733 da4c27a8a932697883c764373b0b4e9e ""
"C:/Users/Marcus/AppData/Local/MiKTeX/fonts/map/pdftex/pdftex.map" 1712682076 81939 3d80a3cba051aa49603173dafcdf1492 ""
"C:/Users/Marcus/AppData/Local/MiKTeX/fonts/map/pdftex/pdftex.map" 1722382141 81939 3d80a3cba051aa49603173dafcdf1492 ""
"C:/Users/Marcus/AppData/Local/MiKTeX/fonts/tfm/public/rsfs/rsfs10.tfm" 1712242763 688 37338d6ab346c2f1466b29e195316aa4 ""
"C:/Users/Marcus/AppData/Local/MiKTeX/fonts/tfm/public/rsfs/rsfs5.tfm" 1712242764 684 3a51bd4fd9600428d5264cf25f04bb9a ""
"C:/Users/Marcus/AppData/Local/MiKTeX/fonts/tfm/public/rsfs/rsfs7.tfm" 1712242763 692 1b6510779f0f05e9cbf03e0f6c8361e6 ""
@ -73,6 +73,9 @@
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/pdfescape/pdfescape.sty" 1575926700 19007 15924f7228aca6c6d184b115f4baa231 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/pdftexcmds/pdftexcmds.sty" 1623005277 20089 80423eac55aa175305d35b49e04fe23b ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/uniquecounter/uniquecounter.sty" 1576434012 7008 f92eaa0a3872ed622bbf538217cd2ab7 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/xkeyval/keyval.tex" 1656236919 2725 1a42bd9e7e57e25fc7763c445f4b785b ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/xkeyval/xkeyval.tex" 1656236919 19231 27205ee17aaa2902aea3e0c07a3cfc65 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/xkeyval/xkvutils.tex" 1656236919 7677 9cb1a74d945bc9331f2181c0a59ff34a ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/xypic/xy.sty" 1381022313 4692 1e1bcf75c622af1eefd9169948208302 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/xypic/xy.tex" 1381022313 115380 413d5f789929a45aab7d12ce0d0aee7d ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/generic/xypic/xy2cell.tex" 1381022313 28208 66beb10e89ca3b367faccdfebe2d3965 ""
@ -110,6 +113,8 @@
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/auxhook/auxhook.sty" 1576538732 3935 57aa3c3e203a5c2effb4d2bd2efbc323 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/base/atbegshi-ltx.sty" 1705273578 3045 273c666a54e60b9f730964f431a56c1b ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/base/atveryend-ltx.sty" 1705273579 2462 6bc53756156dbd71c1ad550d30a3b93f ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/base/inputenc.sty" 1705273578 5048 425739d70251273bf93e3d51f3c40048 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/breakurl/breakurl.sty" 1366019824 8782 9af34887a0e6e535b004c39238830991 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/comment/comment.sty" 1468691282 10197 204f75d5d8d88aa345a8c402e879e63b ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1623003186 13886 d1306dcf79a944f6988e688c1785f9ce ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/etoolbox/etoolbox.sty" 1601897756 46845 3b58f70c6e861a13d927bff09d35ecbc ""
@ -146,12 +151,13 @@
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/ulem/ulem.sty" 1578651445 15682 94f55b803e160cf7fb6e4d77d07cfe1d ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/url/url.sty" 1388490452 12796 8edb7d69a20b857904dd0ea757c14ec9 ""
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/xcolor/xcolor.sty" 1700127522 55487 80a65caedd3722f4c20a14a69e785d8f ""
"c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" 1713880546 32297 7fd52884d5f878c62fb7b3eb83c485d2 ""
"listings-rust.sty" 1712261101 12276 f346af5561f91e34970cbe0b79654ec2 ""
"paper.aux" 1713880549 5542 ad4da62e73d0c1bfa419d595ce41ac50 "pdflatex"
"paper.out" 1713880549 3695 a11dbc9d88dd30c22755dc5ebf6964ec "pdflatex"
"paper.tex" 1713880546 32297 7fd52884d5f878c62fb7b3eb83c485d2 ""
"paper.toc" 1713880549 3025 f0a34bc8923dbdfdaeb8258045835a7e "pdflatex"
"C:/Users/Marcus/AppData/Local/Programs/MiKTeX/tex/latex/xkeyval/xkeyval.sty" 1656236919 4937 4ce600ce9bd4ec84d0250eb6892fcf4f ""
"c:/Users/Marcus/Documents/packages/jecs/thesis/drafts/1/paper.tex" 1722383500 33628 2358f35913ab57bac270409214a52615 ""
"listings-rust.sty" 1720461559 12349 f346af5561f91e34970cbe0b79654ec2 ""
"paper.aux" 1722383503 5596 e71f1baf7c13471206b3537d383c78e2 "pdflatex"
"paper.out" 1722383503 3695 a11dbc9d88dd30c22755dc5ebf6964ec "pdflatex"
"paper.tex" 1722383500 33628 2358f35913ab57bac270409214a52615 ""
"paper.toc" 1722383503 3025 f0a34bc8923dbdfdaeb8258045835a7e "pdflatex"
(generated)
"paper.aux"
"paper.log"

View file

@ -42,73 +42,24 @@ INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\ulem\ulem.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\latex-fonts\lasy6.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\url\url.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\lstmisc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\lstmisc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\lstmisc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyrecat.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyidioms.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xydash10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xyatip10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xybtip10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xybsql10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xycirc10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\breakurl\breakurl.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\breakurl\breakurl.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\xkeyval\xkeyval.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xkeyval\xkeyval.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xkeyval\xkvutils.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xkeyval\keyval.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifpdf.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\iftex\ifpdf.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\iftex\iftex.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyall.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyall.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycurve.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycurve.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyframe.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyframe.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycmtip.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycmtip.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xytips.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xytips.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xycmat10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xycmbt10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xyluat10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xylubt10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyline.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyline.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyrotate.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyrotate.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycolor.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycolor.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xymatrix.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xymatrix.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarrow.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarrow.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xygraph.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xygraph.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarc.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarc.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy2cell.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy2cell.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-co.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-cu.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-fr.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-li.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-ro.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\tools\enumerate.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\tools\enumerate.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\base\inputenc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\hyperref\hyperref.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\infwarerr\infwarerr.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\graphics\keyval.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\kvsetkeys\kvsetkeys.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\kvsetkeys\kvsetkeys.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\kvdefinekeys\kvdefinekeys.sty
@ -160,6 +111,63 @@ INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rer
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\rerunfilecheck\rerunfilecheck.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\uniquecounter\uniquecounter.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\lstmisc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\lstmisc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\lstmisc.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\listings\listings.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyrecat.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyidioms.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xydash10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xyatip10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xybtip10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xybsql10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xycirc10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyall.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyall.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycurve.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycurve.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyframe.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyframe.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycmtip.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycmtip.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xytips.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xytips.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xycmat10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xycmbt10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xyluat10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\xypic\xylubt10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyline.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyline.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyrotate.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyrotate.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycolor.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xycolor.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xymatrix.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xymatrix.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarrow.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarrow.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xygraph.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xygraph.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarc.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xyarc.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy2cell.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xy2cell.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-co.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-cu.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-fr.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-li.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\generic\xypic\xypdf-ro.tex
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\tools\enumerate.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\tools\enumerate.sty
INPUT .\listings-rust.sty
INPUT listings-rust.sty
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\xcolor\xcolor.sty
@ -216,13 +224,6 @@ INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\epstopdf-pkg\epsto
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\00miktex\epstopdf-sys.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\00miktex\epstopdf-sys.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex\latex\00miktex\epstopdf-sys.cfg
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\cmextra\cmex7.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msam10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msam7.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msbm10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msbm7.tfm
INPUT C:\Users\Marcus\AppData\Local\MiKTeX\fonts\tfm\public\rsfs\rsfs10.tfm
INPUT C:\Users\Marcus\AppData\Local\MiKTeX\fonts\tfm\public\rsfs\rsfs7.tfm
INPUT .\paper.out
INPUT .\paper.out
INPUT paper.out
@ -231,6 +232,13 @@ OUTPUT paper.pdf
INPUT .\paper.out
INPUT .\paper.out
OUTPUT paper.out
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\cmextra\cmex7.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msam10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msam7.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msbm10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\amsfonts\symbols\msbm7.tfm
INPUT C:\Users\Marcus\AppData\Local\MiKTeX\fonts\tfm\public\rsfs\rsfs10.tfm
INPUT C:\Users\Marcus\AppData\Local\MiKTeX\fonts\tfm\public\rsfs\rsfs7.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\cm\cmcsc10.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\cm\cmti8.tfm
INPUT C:\Users\Marcus\AppData\Local\Programs\MiKTeX\fonts\tfm\public\cm\cmbx10.tfm

View file

@ -1,4 +1,4 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (MiKTeX 24.1) (preloaded format=pdflatex 2024.4.4) 23 APR 2024 15:55
This is pdfTeX, Version 3.141592653-2.6-1.40.25 (MiKTeX 24.1) (preloaded format=pdflatex 2024.4.4) 31 JUL 2024 01:51
entering extended mode
restricted \write18 enabled.
file:line:error style messages enabled.
@ -144,111 +144,30 @@ Package: ulem 2019/11/18
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/url\url.sty
\Urlmuskip=\muskip17
Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc.
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\listings.sty (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/graphics\keyval.sty
Package: keyval 2022/05/29 v1.15 key=value parser (DPC)
\KV@toks@=\toks29
)
\lst@mode=\count275
\lst@gtempboxa=\box57
\lst@token=\toks30
\lst@length=\count276
\lst@currlwidth=\dimen155
\lst@column=\count277
\lst@pos=\count278
\lst@lostspace=\dimen156
\lst@width=\dimen157
\lst@newlines=\count279
\lst@lineno=\count280
\lst@maxwidth=\dimen158
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\lstmisc.sty
File: lstmisc.sty 2023/02/27 1.9 (Carsten Heinz)
\c@lstnumber=\count281
\lst@skipnumbers=\count282
\lst@framebox=\box58
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\listings.cfg
File: listings.cfg 2023/02/27 1.9 listings configuration
))
Package: listings 2023/02/27 1.9 (Carsten Heinz)
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xy.sty (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xy.tex Bootstrap'ing: catcodes, docmode, (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyrecat.tex) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyidioms.tex)
Xy-pic version 3.8.9 <2013/10/06>
Copyright (c) 1991-2013 by Kristoffer H. Rose <krisrose@tug.org> and others
Xy-pic is free software: see the User's Guide for details.
Loading kernel: messages; fonts; allocations: state,
\X@c=\dimen159
\Y@c=\dimen160
\U@c=\dimen161
\D@c=\dimen162
\L@c=\dimen163
\R@c=\dimen164
\Edge@c=\toks31
\X@p=\dimen165
\Y@p=\dimen166
\U@p=\dimen167
\D@p=\dimen168
\L@p=\dimen169
\R@p=\dimen170
\Edge@p=\toks32
\X@origin=\dimen171
\Y@origin=\dimen172
\X@xbase=\dimen173
\Y@xbase=\dimen174
\X@ybase=\dimen175
\Y@ybase=\dimen176
\X@min=\dimen177
\Y@min=\dimen178
\X@max=\dimen179
\Y@max=\dimen180
\lastobjectbox@=\box59
\zerodotbox@=\box60
\almostz@=\dimen181
direction,
\d@X=\dimen182
\d@Y=\dimen183
\K@=\count283
\KK@=\count284
\Direction=\count285
\K@dXdY=\dimen184
\K@dYdX=\dimen185
\xyread@=\read2
\xywrite@=\write4
\csp@=\count286
\quotPTK@=\dimen186
utility macros; pictures: \xy, positions,
\swaptoks@@=\toks33
\connectobjectbox@@=\box61
objects,
\styletoks@=\toks34
decorations; kernel objects: directionals, circles, text; options; algorithms: directions, edges, connections; Xy-pic loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/iftex\ifpdf.sty
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/breakurl\breakurl.sty
Package: breakurl 2013/04/10 v1.40 Breakable hyperref URLs
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/xkeyval\xkeyval.sty
Package: xkeyval 2022/06/16 v2.9 package option processing (HA)
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xkeyval\xkeyval.tex (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xkeyval\xkvutils.tex
\XKV@toks=\toks29
\XKV@tempa@toks=\toks30
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xkeyval\keyval.tex))
\XKV@depth=\count275
File: xkeyval.tex 2014/12/03 v2.7a key=value parser (HA)
)) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/iftex\ifpdf.sty
Package: ifpdf 2019/10/25 v3.4 ifpdf legacy package. Use iftex instead.
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/iftex\iftex.sty
Package: iftex 2022/02/03 v1.0f TeX engine tests
))
Package: xy 2013/10/06 Xy-pic version 3.8.9
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyall.tex Xy-pic option: All features v.3.8 (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xycurve.tex Xy-pic option: Curve and Spline extension v.3.12 curve,
\crv@cnt@=\count287
\crvpts@=\toks35
\splinebox@=\box62
\splineval@=\dimen187
\splinedepth@=\dimen188
\splinetol@=\dimen189
\splinelength@=\dimen190
circles,
\L@=\dimen191
loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyframe.tex Xy-pic option: Frame and Bracket extension v.3.14 loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xycmtip.tex Xy-pic option: Computer Modern tip extension v.3.7 (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xytips.tex Xy-pic option: More Tips extension v.3.11 loaded) loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyline.tex Xy-pic option: Line styles extension v.3.10
\xylinethick@=\dimen192
loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyrotate.tex Xy-pic option: Rotate and Scale extension v.3.8 loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xycolor.tex Xy-pic option: Colour extension v.3.11 loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xymatrix.tex Xy-pic option: Matrix feature v.3.14
\Row=\count288
\Col=\count289
\queue@=\toks36
\queue@@=\toks37
\qcount@=\count290
\qcount@@=\count291
\matrixsize@=\count292
loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyarrow.tex Xy-pic option: Arrow and Path feature v.3.9 path, \ar, loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xygraph.tex Xy-pic option: Graph feature v.3.11 loaded) loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyarc.tex Xy-pic option: Circle, Ellipse, Arc feature v.3.8 circles, ellipses, elliptical arcs, loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xy2cell.tex Xy-pic option: Two-cell feature v.3.7 two-cells, loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf.tex Xy-pic option: PDF driver v.1.7 Xy-pic pdf driver: `color' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-co.tex loaded) Xy-pic pdf driver: `curve' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-cu.tex loaded) Xy-pic pdf driver: `frame' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-fr.tex loaded) Xy-pic pdf driver: `line' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-li.tex loaded) Xy-pic pdf driver: `rotate' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-ro.tex loaded) loaded)) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/tools\enumerate.sty
Package: enumerate 2023/07/04 v3.00 enumerate extensions (DPC)
\@enLab=\toks38
Package breakurl Warning: You are using breakurl while processing via pdflatex.
(breakurl) \burl will be just a synonym of \url.
(breakurl) on input line 48.
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/base\inputenc.sty
Package: inputenc 2021/02/14 v1.3d Input encoding file
\inpenc@prehook=\toks31
\inpenc@posthook=\toks32
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\hyperref.sty
Package: hyperref 2023-11-26 v7.01g Hypertext links for LaTeX
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/infwarerr\infwarerr.sty
@ -281,14 +200,14 @@ Package: gettitlestring 2019/12/15 v1.6 Cleanup title references (HO)
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/kvoptions\kvoptions.sty
Package: kvoptions 2022-06-15 v3.15 Key value format for package options (HO)
))
\c@section@level=\count293
\c@section@level=\count276
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/etoolbox\etoolbox.sty
Package: etoolbox 2020/10/05 v2.5k e-TeX tools for LaTeX (JAW)
\etb@tempcnta=\count294
\etb@tempcnta=\count277
)
\@linkdim=\dimen193
\Hy@linkcounter=\count295
\Hy@pagecounter=\count296
\@linkdim=\dimen155
\Hy@linkcounter=\count278
\Hy@pagecounter=\count279
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\pd1enc.def
File: pd1enc.def 2023-11-26 v7.01g Hyperref: PDFDocEncoding definition (HO)
Now handling font encoding PD1 ...
@ -296,7 +215,7 @@ Now handling font encoding PD1 ...
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/intcalc\intcalc.sty
Package: intcalc 2019/12/15 v1.3 Expandable calculations with integers (HO)
)
\Hy@SavedSpaceFactor=\count297
\Hy@SavedSpaceFactor=\count280
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\puenc.def
File: puenc.def 2023-11-26 v7.01g Hyperref: PDF Unicode definition (HO)
Now handling font encoding PU ...
@ -309,17 +228,17 @@ Package hyperref Info: Plain pages OFF on input line 4196.
Package hyperref Info: Backreferencing OFF on input line 4201.
Package hyperref Info: Implicit mode ON; LaTeX internals redefined.
Package hyperref Info: Bookmarks ON on input line 4448.
\c@Hy@tempcnt=\count298
\c@Hy@tempcnt=\count281
LaTeX Info: Redefining \url on input line 4786.
\XeTeXLinkMargin=\dimen194
\XeTeXLinkMargin=\dimen156
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/bitset\bitset.sty
Package: bitset 2019/12/09 v1.3 Handle bit-vector datatype (HO)
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/bigintcalc\bigintcalc.sty
Package: bigintcalc 2019/12/15 v1.5 Expandable calculations on big integers (HO)
))
\Fld@menulength=\count299
\Field@Width=\dimen195
\Fld@charsize=\dimen196
\Fld@menulength=\count282
\Field@Width=\dimen157
\Fld@charsize=\dimen158
Package hyperref Info: Hyper figures OFF on input line 6065.
Package hyperref Info: Link nesting OFF on input line 6070.
Package hyperref Info: Hyper index ON on input line 6073.
@ -331,9 +250,9 @@ Package hyperref Info: PDF/A mode OFF on input line 6095.
Package: atbegshi-ltx 2021/01/10 v1.0c Emulation of the original atbegshi
package with kernel methods
)
\Hy@abspage=\count300
\c@Item=\count301
\c@Hfootnote=\count302
\Hy@abspage=\count283
\c@Item=\count284
\c@Hfootnote=\count285
)
Package hyperref Info: Driver (autodetected): hpdftex.
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/hyperref\hpdftex.def
@ -342,8 +261,8 @@ File: hpdftex.def 2023-11-26 v7.01g Hyperref driver for pdfTeX
Package: atveryend-ltx 2020/08/19 v1.0a Emulation of the original atveryend package
with kernel methods
)
\Fld@listcount=\count303
\c@bookmark@seq@number=\count304
\Fld@listcount=\count286
\c@bookmark@seq@number=\count287
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/rerunfilecheck\rerunfilecheck.sty
Package: rerunfilecheck 2022-07-10 v1.10 Rerun checks for auxiliary files (HO)
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/uniquecounter\uniquecounter.sty
@ -352,18 +271,116 @@ Package: uniquecounter 2019/12/15 v1.4 Provide unlimited unique counter (HO)
Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 285.
)
\Hy@SectionHShift=\skip59
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\listings.sty
\lst@mode=\count288
\lst@gtempboxa=\box57
\lst@token=\toks33
\lst@length=\count289
\lst@currlwidth=\dimen159
\lst@column=\count290
\lst@pos=\count291
\lst@lostspace=\dimen160
\lst@width=\dimen161
\lst@newlines=\count292
\lst@lineno=\count293
\lst@maxwidth=\dimen162
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\lstmisc.sty
File: lstmisc.sty 2023/02/27 1.9 (Carsten Heinz)
\c@lstnumber=\count294
\lst@skipnumbers=\count295
\lst@framebox=\box58
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\listings.cfg
File: listings.cfg 2023/02/27 1.9 listings configuration
))
Package: listings 2023/02/27 1.9 (Carsten Heinz)
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xy.sty (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xy.tex Bootstrap'ing: catcodes, docmode, (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyrecat.tex) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyidioms.tex)
Xy-pic version 3.8.9 <2013/10/06>
Copyright (c) 1991-2013 by Kristoffer H. Rose <krisrose@tug.org> and others
Xy-pic is free software: see the User's Guide for details.
Loading kernel: messages; fonts; allocations: state,
\X@c=\dimen163
\Y@c=\dimen164
\U@c=\dimen165
\D@c=\dimen166
\L@c=\dimen167
\R@c=\dimen168
\Edge@c=\toks34
\X@p=\dimen169
\Y@p=\dimen170
\U@p=\dimen171
\D@p=\dimen172
\L@p=\dimen173
\R@p=\dimen174
\Edge@p=\toks35
\X@origin=\dimen175
\Y@origin=\dimen176
\X@xbase=\dimen177
\Y@xbase=\dimen178
\X@ybase=\dimen179
\Y@ybase=\dimen180
\X@min=\dimen181
\Y@min=\dimen182
\X@max=\dimen183
\Y@max=\dimen184
\lastobjectbox@=\box59
\zerodotbox@=\box60
\almostz@=\dimen185
direction,
\d@X=\dimen186
\d@Y=\dimen187
\K@=\count296
\KK@=\count297
\Direction=\count298
\K@dXdY=\dimen188
\K@dYdX=\dimen189
\xyread@=\read2
\xywrite@=\write4
\csp@=\count299
\quotPTK@=\dimen190
utility macros; pictures: \xy, positions,
\swaptoks@@=\toks36
\connectobjectbox@@=\box61
objects,
\styletoks@=\toks37
decorations; kernel objects: directionals, circles, text; options; algorithms: directions, edges, connections; Xy-pic loaded)
Package: xy 2013/10/06 Xy-pic version 3.8.9
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyall.tex Xy-pic option: All features v.3.8 (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xycurve.tex Xy-pic option: Curve and Spline extension v.3.12 curve,
\crv@cnt@=\count300
\crvpts@=\toks38
\splinebox@=\box62
\splineval@=\dimen191
\splinedepth@=\dimen192
\splinetol@=\dimen193
\splinelength@=\dimen194
circles,
\L@=\dimen195
loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyframe.tex Xy-pic option: Frame and Bracket extension v.3.14 loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xycmtip.tex Xy-pic option: Computer Modern tip extension v.3.7 (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xytips.tex Xy-pic option: More Tips extension v.3.11 loaded) loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyline.tex Xy-pic option: Line styles extension v.3.10
\xylinethick@=\dimen196
loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyrotate.tex Xy-pic option: Rotate and Scale extension v.3.8 loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xycolor.tex Xy-pic option: Colour extension v.3.11 loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xymatrix.tex Xy-pic option: Matrix feature v.3.14
\Row=\count301
\Col=\count302
\queue@=\toks39
\queue@@=\toks40
\qcount@=\count303
\qcount@@=\count304
\matrixsize@=\count305
loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyarrow.tex Xy-pic option: Arrow and Path feature v.3.9 path, \ar, loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xygraph.tex Xy-pic option: Graph feature v.3.11 loaded) loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xyarc.tex Xy-pic option: Circle, Ellipse, Arc feature v.3.8 circles, ellipses, elliptical arcs, loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xy2cell.tex Xy-pic option: Two-cell feature v.3.7 two-cells, loaded) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf.tex Xy-pic option: PDF driver v.1.7 Xy-pic pdf driver: `color' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-co.tex loaded) Xy-pic pdf driver: `curve' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-cu.tex loaded) Xy-pic pdf driver: `frame' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-fr.tex loaded) Xy-pic pdf driver: `line' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-li.tex loaded) Xy-pic pdf driver: `rotate' extension support (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/generic/xypic\xypdf-ro.tex loaded) loaded)) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/tools\enumerate.sty
Package: enumerate 2023/07/04 v3.00 enumerate extensions (DPC)
\@enLab=\toks41
)
Package hyperref Info: Option `bookmarksnumbered' set `true' on input line 23.
Package hyperref Info: Option `bookmarksnumbered' set `true' on input line 26.
Package hyperref Warning: Option `bookmarks' has already been used,
(hyperref) setting the option has no effect on input line 23.
(hyperref) setting the option has no effect on input line 26.
Package hyperref Info: Option `colorlinks' set `true' on input line 23.
Package hyperref Info: Option `colorlinks' set `true' on input line 26.
Package hyperref Warning: Option `pagecolor' is not available anymore.
Package hyperref Info: Option `pdfnewwindow' set `true' on input line 23.
Package hyperref Info: Option `pdfnewwindow' set `true' on input line 26.
(listings-rust.sty
Package: listings-rust 2018/01/23 Custom Package
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/xcolor\xcolor.sty
@ -384,27 +401,27 @@ Package xcolor Info: Model `HSB' substituted by `hsb' on input line 1371.
Package xcolor Info: Model `Gray' substituted by `gray' on input line 1372.
Package xcolor Info: Model `wave' substituted by `hsb' on input line 1373.
)
\c@thm=\count305
\c@cor=\count306
\c@prop=\count307
\c@lem=\count308
\c@prob=\count309
\c@conj=\count310
\c@defn=\count311
\c@ass=\count312
\c@asss=\count313
\c@ax=\count314
\c@con=\count315
\c@exmp=\count316
\c@notn=\count317
\c@notns=\count318
\c@pro=\count319
\c@quest=\count320
\c@rem=\count321
\c@warn=\count322
\c@sch=\count323
\c@obs=\count324
\c@conv=\count325
\c@thm=\count306
\c@cor=\count307
\c@prop=\count308
\c@lem=\count309
\c@prob=\count310
\c@conj=\count311
\c@defn=\count312
\c@ass=\count313
\c@asss=\count314
\c@ax=\count315
\c@con=\count316
\c@exmp=\count317
\c@notn=\count318
\c@notns=\count319
\c@pro=\count320
\c@quest=\count321
\c@rem=\count322
\c@warn=\count323
\c@sch=\count324
\c@obs=\count325
\c@conv=\count326
\bibstyle{plain}
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/graphics\graphicx.sty
@ -422,7 +439,7 @@ Package graphics Info: Driver file: pdftex.def on input line 107.
\Gin@req@width=\dimen198
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/l3backend\l3backend-pdftex.def
File: l3backend-pdftex.def 2024-01-04 L3 backend support: PDF output (pdfTeX)
\l__color_backend_stack_int=\count326
\l__color_backend_stack_int=\count327
\l__pdf_internal_box=\box63
)
@ -432,86 +449,100 @@ LaTeX Warning: Unused global option(s):
(paper.aux)
\openout1 = `paper.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 160.
LaTeX Font Info: ... okay on input line 160.
LaTeX Font Info: Trying to load font information for U+msa on input line 160.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 163.
LaTeX Font Info: ... okay on input line 163.
LaTeX Font Info: Trying to load font information for U+msa on input line 163.
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/amsfonts\umsa.fd
File: umsa.fd 2013/01/14 v3.01 AMS symbols A
)
LaTeX Font Info: Trying to load font information for U+msb on input line 160.
LaTeX Font Info: Trying to load font information for U+msb on input line 163.
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/amsfonts\umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
)
LaTeX Font Info: Trying to load font information for U+rsfs on input line 160.
LaTeX Font Info: Trying to load font information for U+rsfs on input line 163.
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/jknappen\ursfs.fd
File: ursfs.fd 1998/03/24 rsfs font definition file (jk)
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/context/base/mkii\supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count327
\scratchcounter=\count328
\scratchdimen=\dimen256
\scratchbox=\box64
\nofMPsegments=\count328
\nofMParguments=\count329
\everyMPshowfont=\toks39
\MPscratchCnt=\count330
\nofMPsegments=\count329
\nofMParguments=\count330
\everyMPshowfont=\toks42
\MPscratchCnt=\count331
\MPscratchDim=\dimen257
\MPnumerator=\count331
\makeMPintoPDFobject=\count332
\everyMPtoPDFconversion=\toks40
\MPnumerator=\count332
\makeMPintoPDFobject=\count333
\everyMPtoPDFconversion=\toks43
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/epstopdf-pkg\epstopdf-base.sty
Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 485.
(C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/00miktex\epstopdf-sys.cfg
File: epstopdf-sys.cfg 2021/03/18 v2.0 Configuration of epstopdf for MiKTeX
))
\c@lstlisting=\count333
Package xypdf Info: Line width: 0.39998pt on input line 160.
Package hyperref Info: Link coloring ON on input line 160.
Package hyperref Info: Link coloring ON on input line 163.
(paper.out) (paper.out)
\@outlinefile=\write5
\openout5 = `paper.out'.
\c@lstlisting=\count334
Package xypdf Info: Line width: 0.39998pt on input line 163.
(paper.toc [1{C:/Users/Marcus/AppData/Local/MiKTeX/fonts/map/pdftex/pdftex.map}])
\tf@toc=\write6
\openout6 = `paper.toc'.
[2] [3]
LaTeX Warning: Citation `Flecs' on page 2 undefined on input line 225.
[2] [3]
LaTeX Warning: Citation `Flecs' on page 4 undefined on input line 271.
LaTeX Font Info: Font shape `OT1/cmtt/bx/n' in size <10> not available
(Font) Font shape `OT1/cmtt/m/n' tried instead on input line 271.
[4] [5]
<../../images/archetype_graph.png, id=195, 831.105pt x 240.9pt>
(Font) Font shape `OT1/cmtt/m/n' tried instead on input line 274.
LaTeX Warning: Citation `Flecs' on page 4 undefined on input line 283.
[4] [5]
<../../images/archetype_graph.png, id=193, 831.105pt x 240.9pt>
File: ../../images/archetype_graph.png Graphic file (type png)
<use ../../images/archetype_graph.png>
Package pdftex.def Info: ../../images/archetype_graph.png used on input line 370.
Package pdftex.def Info: ../../images/archetype_graph.png used on input line 374.
(pdftex.def) Requested size: 332.43611pt x 96.35828pt.
<../../images/sparseset.png, id=196, 484.81125pt x 161.60374pt>
<../../images/sparseset.png, id=194, 484.81125pt x 161.60374pt>
File: ../../images/sparseset.png Graphic file (type png)
<use ../../images/sparseset.png>
Package pdftex.def Info: ../../images/sparseset.png used on input line 378.
Package pdftex.def Info: ../../images/sparseset.png used on input line 382.
(pdftex.def) Requested size: 290.88899pt x 96.96298pt.
[6 <../../images/archetype_graph.png (PNG copy)> <../../images/sparseset.png>]
<../../images/removed.png, id=207, 484.81125pt x 161.60374pt>
<../../images/removed.png, id=205, 484.81125pt x 161.60374pt>
File: ../../images/removed.png Graphic file (type png)
<use ../../images/removed.png>
Package pdftex.def Info: ../../images/removed.png used on input line 398.
Package pdftex.def Info: ../../images/removed.png used on input line 402.
(pdftex.def) Requested size: 290.88899pt x 96.96298pt.
[7 <../../images/removed.png>] (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\lstlang1.sty
LaTeX Warning: Citation `Luau' on page 7 undefined on input line 408.
[7 <../../images/removed.png>] (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\lstlang1.sty
File: lstlang1.sty 2023/02/27 1.9 listings language file
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\lstlang2.sty
File: lstlang2.sty 2023/02/27 1.9 listings language file
@ -520,57 +551,51 @@ File: lstlang1.sty 2023/02/27 1.9 listings language file
) (C:\Users\Marcus\AppData\Local\Programs\MiKTeX\tex/latex/listings\lstlang2.sty
File: lstlang2.sty 2023/02/27 1.9 listings language file
)
Overfull \hbox (17.91617pt too wide) in paragraph at lines 468--472
Overfull \hbox (17.91617pt too wide) in paragraph at lines 472--476
\OT1/cmr/bx/n/10 Explanation: \OT1/cmr/m/n/10 This func-tion re-trieves the record for the given en-tity from \OT1/cmtt/m/n/10 entityIndex\OT1/cmr/m/n/10 .
[]
[8] [9]
<../../images/random_access.png, id=290, 653.44125pt x 341.02406pt>
<../../images/random_access.png, id=288, 653.44125pt x 341.02406pt>
File: ../../images/random_access.png Graphic file (type png)
<use ../../images/random_access.png>
Package pdftex.def Info: ../../images/random_access.png used on input line 579.
Package pdftex.def Info: ../../images/random_access.png used on input line 583.
(pdftex.def) Requested size: 326.71982pt x 170.51161pt.
[10]
<../../images/insertion.png, id=315, 1797.71625pt x 1188.44pt>
<../../images/insertion.png, id=313, 1797.71625pt x 1188.44pt>
File: ../../images/insertion.png Graphic file (type png)
<use ../../images/insertion.png>
Package pdftex.def Info: ../../images/insertion.png used on input line 593.
Package pdftex.def Info: ../../images/insertion.png used on input line 597.
(pdftex.def) Requested size: 359.53688pt x 237.68379pt.
<../../images/queries.png, id=316, 2229.32875pt x 990.70125pt>
<../../images/queries.png, id=314, 2229.32875pt x 990.70125pt>
File: ../../images/queries.png Graphic file (type png)
<use ../../images/queries.png>
Package pdftex.def Info: ../../images/queries.png used on input line 609.
Package pdftex.def Info: ../../images/queries.png used on input line 613.
(pdftex.def) Requested size: 334.38489pt x 148.59877pt.
[11 <../../images/random_access.png> <../../images/insertion.png>]
Overfull \hbox (110.03029pt too wide) in paragraph at lines 640--643
\OT1/cmr/m/n/8 Part 1. [][]$\OT1/cmtt/m/n/8 https : / / t-[]machine . org / index . php / 2007 / 09 / 03 / entity-[]systems-[]are-[]the-[]future-[]of-[]mmog-[]development-[]part-[]1/$[][]
[]
Underfull \hbox (badness 3503) in paragraph at lines 660--663
[]\OT1/cmr/m/n/8 Michele Caini (2020, Au-gust). ECS back and forth. [][]$\OT1/cmtt/m/n/8 https : / / skypjack . github . io /
[]
[12 <../../images/queries.png>] [13] (paper.aux)
[11 <../../images/random_access.png> <../../images/insertion.png>] [12 <../../images/queries.png>] [13] (paper.aux)
***********
LaTeX2e <2023-11-01> patch level 1
L3 programming layer <2024-01-04>
***********
LaTeX Warning: There were undefined references.
Package rerunfilecheck Info: File `paper.out' has not changed.
(rerunfilecheck) Checksum: A11DBC9D88DD30C22755DC5EBF6964EC;3695.
)
Here is how much of TeX's memory you used:
16877 strings out of 474486
245316 string characters out of 5743284
17163 strings out of 474486
250241 string characters out of 5743284
1977542 words of memory out of 5000000
38592 multiletter control sequences out of 15000+600000
38859 multiletter control sequences out of 15000+600000
569162 words of font info for 85 fonts, out of 8000000 for 9000
1302 hyphenation exceptions out of 8191
75i,8n,79p,7940b,2289s stack positions out of 10000i,1000n,20000p,200000b,200000s
75i,8n,117p,7940b,2340s stack positions out of 10000i,1000n,20000p,200000b,200000s
<C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmbx10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmcsc10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmmi10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmr10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmr6.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmr7.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmr8.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmss10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmsy10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmti10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmti8.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmtt10.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmtt8.pfb><C:/Users/Marcus/AppData/Local/Programs/MiKTeX/fonts/type1/public/amsfonts/cm/cmtt9.pfb>
Output written on paper.pdf (13 pages, 590398 bytes).
Output written on paper.pdf (13 pages, 600187 bytes).
PDF statistics:
437 PDF objects out of 1000 (max. 8388607)
154 named destinations out of 1000 (max. 500000)
441 PDF objects out of 1000 (max. 8388607)
156 named destinations out of 1000 (max. 500000)
239 words of extra memory for PDF output out of 10000 (max. 10000000)

Binary file not shown.

Binary file not shown.

View file

@ -2,7 +2,10 @@
\usepackage{mathrsfs,comment}
\usepackage[usenames,dvipsnames]{color}
\usepackage[normalem]{ulem}
\usepackage{url}
\usepackage[hyphens]{url}
\usepackage{breakurl}
\usepackage[utf8]{inputenc} % Ensure proper encoding
\usepackage{hyperref} % For clickable links
\usepackage{listings}
\usepackage[all,arc,2cell]{xy}
\UseAllTwocells
@ -259,7 +262,7 @@ The Entity Component System (ECS) architecture provides infrastructure for repre
\subsection{Cache Locality}
When a CPU loads data from Random Access Memory it is stored in a cache tier (i.e. L1, L2, L3),
where the lower tiers are allowed to operate faster relatively to how closely
embedded it is to the CPU.\cite{Flecs} When a program requests some memory, the CPU grabs a whole slab, usually from around 64 to 128 bytes starting from the requested address, and puts it in the CPU cache, i.e. cache line. If the next requested data is in the same slab, the CPU reads it straight from the cache, which is faster than hitting RAM. Inversely, when there is a cache miss, i.e. it is not in the same slab then the CPU cannot process the next instruction because it needs said data and waits a couple of CPU cycles until it successfully fetches it. (Nystrom, 2011).
embedded it is to the CPU.\cite{Nystrom} When a program requests some memory, the CPU grabs a whole slab, usually from around 64 to 128 bytes starting from the requested address, and puts it in the CPU cache, i.e. cache line. If the next requested data is in the same slab, the CPU reads it straight from the cache, which is faster than hitting RAM. Inversely, when there is a cache miss, i.e. it is not in the same slab then the CPU cannot process the next instruction because it needs said data and waits a couple of CPU cycles until it successfully fetches it. (Nystrom, 2011).
\subsection{Data Layouts}
@ -298,7 +301,7 @@ Vectorization is where code meets the requirements to use SIMD instructions. Tho
\subsection{Archetype}
Storing data in contiguous arrays to maximize vectorization and SIMD is the ideal situation,
however it is a very complex problem in implementation. Below the ABC problem\cite{Anderson}
however it is a very complex problem in implementation. Below the ABC problem\cite{ABC}
is demonstrated where 3 entities all have the component \texttt{A} which can be stored in a single
column:
@ -363,7 +366,8 @@ references to the next archetype based on component types (see Figure 1).
Each edge in the graph corresponds to a component that can be added, akin to an
intersection operation on the archetype set. \[A \cap \left( B \cap C \right)\]
Removal of a component from the archetype is akin to a subtraction operation from the set. \[A \cap \left( B \cap C \right) - {C}\]`.
This archetype graph facilitates $\mathsf{O}(1)$ transitions between adjacent archetypes to mitigate the cost of fragmentation.
This archetype graph facilitates $\mathsf{O}(1)$ transitions between adjacent archetypes to
mitigate the cost of structual changes.
\begin{figure}[htbp]
\centering
@ -401,7 +405,7 @@ This method ensures that the dense array remains tightly packed.\cite{Caini}
The sparse set structure is beneficial for programs that frequently manipulate the component structures of entities. However, querying multiple components can become less efficient due to the need to load and reference each component array individually. In contrast to archetypes, which only needs to iterate over entities matching their query.
\section{Implementation}
The decision to use Lua scripting language for the ECS implementation was ultimately chosen because
The decision to use Luau\cite{Luau} for the ECS implementation was ultimately chosen because
a pure Lua implementation confers distinct advantages in terms
of compatibility and portability. By eschewing reliance on external C or C++ libraries
or bindings, we ensure that our ECS framework remains platform-agnostic and
@ -422,12 +426,12 @@ The ECS utilize several key data structures to organize and manage entities and
\item \textbf{EntityIndex:} Maps entity IDs to their corresponding records.
\item \textbf{ComponentIndex}: Maps IDs to archetype records.
\item \textbf{ArchetypeIndex}: Maps type hashes to archetype.
\item \textbf{ComponentIndex}: Maps IDs to archetype maps.
\item \textbf{ArchetypeMap:} Maps archetype IDs to archetype records which is used to find the column for the corresponding component.
\item \textbf{ArchetypeIndex}: Maps type hashes to archetype.
\item \textbf{Archetypes:} Maintains a collection of archetypes indexed by their IDs.
\end{itemize}
@ -634,45 +638,53 @@ meticulous evaluations of the minimal ECS implementation iterations.
My thanks also extend to Eryn L. K. and Lucien Greathouse for their invaluable
guidance and contributions to the Matter project.
\begin{thebibliography}{9}
\sloppy
\tolerance=2000
\hbadness=10000
\begin{thebibliography}{10000}
\bibitem{Martin}
Adam Martin (2007, September).
Entity Systems are the future of MMOG development - \\ Part 1.
Martin, Adam (2007).
\textit{Entity Systems are the future of MMOG development - Part 1}.
\url{https://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/}
\bibitem{Muratori}
Casey Muratori (2014, June).
Semantic Compression.
Muratori, Casey (2014).
\textit{Semantic Compression}.
\url{https://caseymuratori.com/blog_0015}
\bibitem{Flecs}
Sanders Mertens (2019).
Flecs.
\url{https://github.com/SanderMertens/flecs}
\bibitem{ABC}
Mertens, Sanders (2022). \texttt{Building Games in ECS with Entity Relationships. See the ABC problem, component index.}
\url{https://ajmmertens.medium.com/building-an-ecs-1-where-are-my-entities-and-components-63d07c7da742}
\bibitem{Archetypes}
Mertens, Sanders (2022). \texttt{Building an ECS \#2: Archetypes and Vectorization.}
\url{https://ajmmertens.medium.com/building-an-ecs-2-archetypes-and-vectorization-fe21690805f9}
\bibitem{Anderson}
Carter Anderson (2022).
Bevy.
\url{https://github.com/bevyengine/bevy}
Anderson, Carter (2022).
\textit{Bevy}.
Available at: \url{https://github.com/bevyengine/bevy}
\bibitem{Caini}
Michele Caini (2020, August).
ECS back and forth.
\url{https://skypjack.github.io/2020-08-02-ecs-baf-part-9/}
Caini, Michele (2020).
\textit{ECS back and forth}.
Available at: \url{https://skypjack.github.io/2020-08-02-ecs-baf-part-9/}
\bibitem{Nystrom}
Robert Nystrom (2011).
Game Programming Patterns.
Nystrom, Robert (2011).
\textit{Game Programming Patterns}.
\bibitem{gdc}
Scott Bilas (2002).
A Data-Driven Object System (GDC 2002 Talk by Scott Bilas).
\url{https://www.youtube.com/watch?v=Eb4-0M2a9xE}
Bilas, Scott (2002).
\textit{A Data-Driven Object System} (GDC 2002 Talk by Scott Bilas).
Available at: \url{https://www.youtube.com/watch?v=Eb4-0M2a9xE}
\bibitem{matter}
Matter, an archetypal ECS for Roblox
https://matter-ecs.github.io/matter/
\textit{Matter, an archetypal ECS for Roblox}.
Available at: \url{https://matter-ecs.github.io/matter/}
\bibitem{luau}
\end{thebibliography}