Phase 1 updates

Phase 1 · Outcome ·

Phase 1 outcome

milestone met. 10 conformance scenarios (the recorded spec, ~840 events) recorded in Unity 6000.2.10f1 pass (lifecycle, object lifetime, coroutines, Mathf, vectors, rotations/matrices, world-space transforms, value types, Random), and tassix_editor builds, undoes and redoes a scene from JSON-line commands.

  • World: GameObjects, components, hierarchy, activation (deactivation reported children-first, as Unity does), destroy; transforms in dense struct-of-arrays storage with dirty flags, lazy per-object evaluation, and a level-by-level parallel bulk update each frame.
  • Scripting: fake null, GameObject/Component/Behaviour/MonoBehaviour/Transform (local and world space), lifecycle player loop, [DefaultExecutionOrder], coroutines, Time, Debug. Callbacks come from tables emitted by Tassix.Generators ([UnsafeAccessor] for private methods; no reflection, NativeAOT-ready), with a reflection fallback for generic types.
  • Math and values: Mathf (incl. PerlinNoise), Vector2/3/4, Vector2Int/3Int, Quaternion, Matrix4x4, Color/Color32, Rect, Bounds, LayerMask (built-in layers), and Random with bit-identical seeded sequences.
  • Jobs: tassix_jobs frame task graph (levelled once, allocation-free runs apart from rayon's amortized injector blocks).
  • Performance (release, 32 threads, after the shared-view change below): fake-null check 0.3 ns, GetComponent 1.2 ns, localPosition/position/rotation get 1.7–2.3 ns (direct reads, no native call), localPosition set 8 ns, position set 16 ns, Vector3 math ~2 ns; 10k scripted objects + 5k children at 0.43 ms/frame with 0 managed bytes/frame. Transform bulk update: 10k dirty in 65 us, 100k in 0.80 ms (memory-bound).
  • Editor core: typed commands with JSON Schemas, stable ObjectIds, atomic batches, undo/redo with exact subtree restore, change events, tassix_editor CLI.
  • Findings: Unity's editor (Mono) uses double-precision intermediates for float math and formats float.ToString() with ~7 digits; scripts run with the invariant culture; WaitForEndOfFrame can't be recorded in batch mode (see conformance/README.md).
  • Shared view (follow-up, 2026-10-24): Rust publishes pointers to handle generations, the handle-to-slot table and the dense transform arrays; managed code reads them directly, refreshed after every native call (sound: managed code never runs while native code touches the world). Earlier per-call numbers were inflated by benchmarking before tiered JIT promotion; benchmarks now warm each body for 250 ms.
  • Carried forward: Native components other than Transform get dense storage as they arrive (Phase 2+). Editor component fields are editor-side data until managed components are bound to the editor (Phase 4 inspector).