Autonomiczny silnik serwera zbudowany w oparciu o architekturę zorientowaną na dane (ECS), asynchroniczne wczytywanie chunków Anvil i podział świata na niezależne, nieblokujące się regiony.
$ ./gradlew run
[19:40:02 INFO]: Starting ArxEngine version 1.21-ALPHA (Java 25)
[19:40:02 INFO]: Initializing ArxRegistry: 142 items loaded
[19:40:03 INFO]: Loading world databases from /worlds/world/...
[19:40:03 INFO]: Starting Netty pipeline on port 25565 (epoll backend)
[19:40:03 INFO]: RegionScheduler initiated with 8 parallel worker threads
[19:40:04 SUCCESS]: Server started in 1.48s! Ready for connections.
[19:40:12 INFO]: Player Arxnes [127.0.0.1] connected. UUID: 069a79f4-4e94-726a-772c-6b82c6d822a0
[19:40:12 INFO]: Velocity player verification successful.
[19:40:13 INFO]: Spawning entity player at world(0.0, 64.0, 0.0) in Region[0, 0]
ArxServer nie jest kolejnym forkiem Spigota czy Papera. To niezależna baza kodu napisana z myślą o maksymalnym wykorzystaniu nowoczesnego sprzętu.
Świat gry jest dzielony na dynamiczne, niezależne regiony tikujące na osobnych wątkach roboczych (Work-Stealing / ForkJoinPool). Koniec z lagami całego serwera przez jednego gracza.
Encje gry i ich dane są przechowywane w zorientowanych na dane układach pamięci (Archetypes). Zapewnia to maksymalne wykorzystanie pamięci podręcznej procesora (CPU cache) i eliminuje presję na GC.
Nasz dedykowany moduł kompatybilności obsługuje wtyczki Bukkit/Paper poprzez dynamiczne proxy oraz mody Fabric bezpośrednio na poziomie punktów wejściowych (ModInitializer).
Zobacz, jak wygląda implementacja czystego systemu ruchu i kolizji w ArxEngine. Zamiast ciężkich obiektów typu Entity z Vanilla, dane o pozycji i prędkości są przetwarzane w liniowych tablicach komponentów.
package org.arxengine.arxserver.ecs.systems;
import org.arxengine.arxserver.ecs.*;
import org.arxengine.arxserver.ecs.components.*;
public class MovementSystem implements System {
@Override
public void update(World world, double deltaTime) {
var chunks = world.query(PositionComponent.class, VelocityComponent.class);
for (var chunk : chunks) {
var positions = chunk.get(PositionComponent.class);
var velocities = chunk.get(VelocityComponent.class);
for (int i = 0; i < chunk.size(); i++) {
var pos = positions[i];
var vel = velocities[i];
positions[i] = pos.translate(
vel.dx() * deltaTime,
vel.dy() * deltaTime,
vel.dz() * deltaTime
);
}
}
}
}
Rozwój platformy ArxEngine jest podzielony na fazy. Cały kod rdzenia serwera, bazy danych świata i stosu sieciowego został w pełni zaimplementowany.