Critical performance fixes for ThreadedModuleSystem achieving 69-88% parallel efficiency. ## Performance Results (Fair Benchmark) - 2 modules: 1.72x speedup (86% efficiency) - 4 modules: 3.16x speedup (79% efficiency) - 8 modules: 5.51x speedup (69% efficiency) - 4 heavy: 3.52x speedup (88% efficiency) - 8 heavy: 6.76x speedup (85% efficiency) ## Bug #1: Atomic Barrier Optimization (10-15% gain) **Before:** 16 sequential lock operations per frame (8 workers × 2 phases) - Phase 1: Lock each worker mutex to signal work - Phase 2: Lock each worker mutex to wait for completion **After:** 0 locks in hot path using atomic counters - Generation-based frame synchronization (atomic counter) - Spin-wait with atomic completion counter - memory_order_release/acquire for correct visibility **Changes:** - include/grove/ThreadedModuleSystem.h: - Added std::atomic<size_t> currentFrameGeneration - Added std::atomic<int> workersCompleted - Added sharedDeltaTime, sharedFrameCount (main thread writes only) - Removed per-worker flags (shouldProcess, processingComplete, etc.) - src/ThreadedModuleSystem.cpp: - processModules(): Atomic generation increment + spin-wait - workerThreadLoop(): Wait on generation counter, no locks during processing ## Bug #2: Logger Mutex Contention (40-50% gain) **Problem:** All threads serialized on global logger mutex even with logging disabled - spdlog's multi-threaded sinks use internal mutexes - Every logger->trace/warn() call acquired mutex for level check **Fix:** Commented all logging calls in hot paths - src/ThreadedModuleSystem.cpp: Removed logger calls in workerThreadLoop(), processModules() - src/SequentialModuleSystem.cpp: Removed logger calls in processModules() (fair comparison) ## Bug #3: Benchmark Invalidity Fix **Problem:** SequentialModuleSystem only keeps 1 module (replaces on register) - Sequential: 1 module × 100k iterations - Threaded: 8 modules × 100k iterations (8× more work!) - Comparison was completely unfair **Fix:** Adjusted workload to be equal - Sequential: 1 module × (N × iterations) - Threaded: N modules × iterations - Total work now identical **Added:** - tests/benchmarks/benchmark_threaded_vs_sequential_cpu.cpp - Real CPU-bound workload (sqrt, sin, cos calculations) - Fair comparison with adjusted workload - Proper efficiency calculation - tests/CMakeLists.txt: Added benchmark target ## Technical Details **Memory Ordering:** - memory_order_release when writing flags (main thread signals workers) - memory_order_acquire when reading flags (workers see shared data) - Ensures proper synchronization without locks **Generation Counter:** - Prevents double-processing of frames - Workers track lastProcessedGeneration - Only process when currentGeneration > lastProcessed ## Impact ThreadedModuleSystem now achieves near-linear scaling for CPU-bound workloads. Ready for production use with 2-8 modules. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> |
||
|---|---|---|
| .claude | ||
| assets | ||
| docs | ||
| external/StillHammer | ||
| include/grove | ||
| modules | ||
| plans | ||
| src | ||
| Testing/Temporary | ||
| tests | ||
| .gitignore | ||
| build_renderer.bat | ||
| CLAUDE_NEXT_SESSION.md | ||
| CLAUDE.md | ||
| CMakeLists.txt | ||
| diagram_dev_workflow.html | ||
| diagram_iio_messaging.html | ||
| diagram_module_lifecycle.html | ||
| groveengine_architecture.html | ||
| groveengine_diagram.html | ||
| helgrind.supp | ||
| LICENSE-COMMERCIAL | ||
| LICENSE-GPL | ||
| logger_demo | ||
| README.md | ||
| run_all_tests.sh | ||
| run_full_stack_demo.bat | ||
GroveEngine 🌳
Experimental Modular C++ Engine Architecture for Rapid Prototyping
GroveEngine is a lightweight, modular engine architecture designed for blazing-fast development iteration (0.4ms hot-reload validated) and optimized for AI-assisted prototyping. Currently in development stage - suitable for experimentation and learning, not production games.
Key Features
- 🔥 Hot-Reload 0.4ms - Validated blazing-fast module reloading
- 🧩 Modular Architecture - Clean separation via interfaces (IEngine, IModule, IIO, IModuleSystem)
- 🚀 Development Velocity - Edit → Build → Hot-reload < 1 second total
- 🤖 AI-Assisted Development - 200-300 line modules optimized for Claude Code
- 📦 Autonomous Builds - Each module builds independently
- ⚠️ Experimental - Non-deterministic, development-focused architecture
Architecture Overview
grove::IEngine (Orchestration)
├── grove::IModuleSystem (Execution strategy)
│ ├── SequentialModuleSystem (✅ Implemented - 1 module at a time)
│ ├── ThreadedModuleSystem (🚧 TODO - Each module in thread)
│ └── MultithreadedModuleSystem (🚧 TODO - Thread pool)
├── grove::IModule (Business logic - 200-300 lines)
│ └── Your modules (.so/.dll hot-reloadable)
└── grove::IIO (Communication)
├── IntraIO (✅ Implemented - Same process pub/sub)
├── LocalIO (🚧 TODO - Same machine IPC)
└── NetworkIO (🚧 TODO - Distributed messaging)
Current Status
⚠️ Development Stage: GroveEngine is currently development-ready but not production-ready. The engine is non-deterministic and suited for prototyping, experimentation, and rapid iteration. Production use requires significant additional work (see Roadmap).
✅ Implemented Components
-
Core Engine:
DebugEngine- Comprehensive logging and health monitoringSequentialModuleSystem- Single-threaded module executionIntraIO+IntraIOManager- Sub-millisecond pub/sub with pattern matchingModuleLoader- Hot-reload system (0.4ms average, 0.055ms best)
-
Rendering Stack (BgfxRenderer):
- Sprite rendering with automatic batching
- Tilemap rendering with instancing
- Particle effects system
- Debug text overlay (8x8 bitmap font)
- RHI abstraction over bgfx
-
UI System (UIModule):
- 10 widget types (button, panel, label, checkbox, slider, text input, progress bar, image, scroll panel, tooltip)
- JSON layout loading
- Retained mode rendering (85%+ IIO reduction)
- Thread-safe input handling
-
Input System (InputModule):
- Mouse (movement, buttons, wheel)
- Keyboard (keys, text input)
- SDL2 backend
-
Test Suite: 20+ integration tests + visual demos
⚠️ Known Limitations
- Non-Deterministic Execution: Module execution order not guaranteed
- Single-Threaded Only: Only SequentialModuleSystem implemented
- No Determinism Guarantees: Not suitable for networked games or replays
- Development Focus: Optimized for rapid iteration, not stability
🚧 Roadmap to Production
- Deterministic Execution: Predictable module execution order
- Module Systems: ThreadedModuleSystem, MultithreadedModuleSystem
- IO Systems: LocalIO (IPC), NetworkIO (distributed)
- Input: Gamepad support (Phase 2)
- Renderer: Advanced text rendering, post-processing effects
- Stability: Error recovery, graceful degradation
- Performance: Profiling, optimization, memory pooling
Quick Start
Try the Interactive Demo
See it in action first! Run the full stack demo to see BgfxRenderer + UIModule + InputModule working together:
# Windows
run_full_stack_demo.bat
# Linux
./build/tests/test_full_stack_interactive
Features:
- Click buttons, drag sliders, interact with UI
- Spawn bouncing sprites with physics
- Complete input → UI → game → render flow
- All IIO topics demonstrated
See tests/visual/README_FULL_STACK.md for details.
Directory Structure
GroveEngine/
├── include/grove/ # 27 headers
│ ├── IEngine.h # Core interfaces
│ ├── IModule.h
│ ├── IModuleSystem.h
│ ├── IIO.h
│ ├── IDataTree.h # Configuration system
│ ├── IDataNode.h
│ └── ...
├── src/ # 10 implementations
│ ├── DebugEngine.cpp
│ ├── SequentialModuleSystem.cpp
│ ├── IntraIO.cpp
│ ├── ModuleFactory.cpp
│ └── ...
├── docs/ # Documentation
│ ├── architecture/
│ │ ├── architecture-modulaire.md
│ │ └── claude-code-integration.md
│ └── implementation/
│ └── CLAUDE-HOT-RELOAD-GUIDE.md
├── modules/ # Your application modules
├── tests/ # Tests
└── CMakeLists.txt # Build system
Build
cd GroveEngine
mkdir build && cd build
cmake ..
make
# Or use the root CMakeLists.txt directly
cmake .
make
Create a Module
// MyModule.h
#include <grove/IModule.h>
class MyModule : public grove::IModule {
public:
json process(const json& input) override {
// Your logic here (200-300 lines max)
return {"result": "processed"};
}
void setConfiguration(const IDataNode& config, IIO* io, ITaskScheduler* scheduler) override {
// Configuration setup
}
// ... other interface methods
};
Documentation
For Developers Using GroveEngine
- DEVELOPER_GUIDE.md - 📘 START HERE - Complete guide with modules, IIO topics, and full examples
- USER_GUIDE.md - Module system basics, hot-reload, IIO communication
Module Documentation
- BgfxRenderer - 2D rendering (sprites, tilemap, particles, debug text)
- UIModule - User interface (10 widget types, layout, scrolling)
- InputModule - Input handling (mouse, keyboard via SDL)
Architecture & Internals
- Architecture Modulaire - Core interface architecture
- Claude Code Integration - AI-optimized development workflow
- Hot-Reload Guide - 0.4ms hot-reload system
Philosophy
Micro-Context Development
- Small modules (200-300 lines) for AI-friendly development
- Autonomous builds - Zero parent dependencies
- Hot-swappable infrastructure - Change performance without touching business logic
Progressive Evolution
// Current (Production-Ready)
DebugEngine + SequentialModuleSystem + IntraIO
// Future Vision (Roadmap)
HighPerfEngine + MultithreadedModuleSystem + NetworkIO
// Same module code - just swap the infrastructure
Complexity Through Simplicity
Complex behavior emerges from the interaction of simple, well-defined modules.
Performance
Hot-Reload Benchmarks (Validated):
- Average: 0.4ms
- Best: 0.055ms
- 5-cycle test: 2ms total
- State persistence: 100% success rate
- Classification: 🚀 BLAZING (Theoretical maximum achieved)
Origin & Development
- WarFactory - Original architecture source and inspiration
- AISSIA - Experimental AI assistant project (development/testing)
GroveEngine is currently used for prototyping and experimentation, not production deployments.
License
GroveEngine is dual-licensed - you choose the license that fits your project:
📜 GPL v3 (Open Source - Free)
Use GroveEngine in open-source projects under the GNU GPL v3.
- ✅ 100% Free - No costs, no royalties
- ✅ Full engine access - Modify and use freely
- ❗ Your game must be GPL - Source code must be published
- 👥 Community support
💼 Commercial License (Proprietary - Royalty-Based)
Use GroveEngine in closed-source commercial games under the Commercial License.
- ✅ FREE up to €100,000 revenue per project
- ✅ 1% royalty on revenue above €100,000
- ✅ Keep your code private - Proprietary games allowed
- ✅ Email support - 72h response time
- ✅ Priority bug fixes
🎮 Best for indie developers: Most favorable royalty model in the industry!
📊 License Comparison
| Feature | GPL v3 (Free) | Commercial |
|---|---|---|
| Cost | Free | Free up to €100k revenue |
| Royalties | None | 1% above €100k |
| Your game license | Must be GPL (open) | Proprietary allowed |
| Engine modifications | Share modifications | Keep private |
| Support | Community | Email (72h) + priority |
| Updates | Yes | Yes + priority fixes |
| Attribution | Required | Required ("Powered by") |
| Number of projects | Unlimited | Unlimited |
❓ FAQ - Which License Should I Choose?
Q: I'm making a commercial indie game. Which license? A: Commercial License - It's FREE until €100k, then only 1% royalties. Much better than Unreal (5% above $1M).
Q: I'm making an open-source game. Which license? A: GPL v3 - Perfect for open-source projects, 100% free forever.
Q: How do I declare my revenue? A: Annual email with your project revenue. Simple and trust-based. Audits possible but rare.
Q: Can I modify the engine? A: Yes! Both licenses allow modifications. GPL requires sharing them, Commercial lets you keep them private.
Q: Is GroveEngine cheaper than Unreal Engine? A: Yes! We charge 1% above €100k vs Unreal's 5% above $1M USD. For a €500k game, you'd pay €4,000 with GroveEngine vs €0 with Unreal (under threshold). For a €1.5M game: €14,000 vs ~€25,000 with Unreal.
Q: What if my game makes €80,000? A: €0 royalties! You're within the free tier. No payment required.
Q: Is support included? A: GPL = community support. Commercial = email support (72h response) + priority bug fixes.
Q: How do I get the Commercial License? A: Email alexistrouve.pro@gmail.com with subject "GroveEngine Commercial License Request". No upfront payment - royalties only after €100k!
🏆 Industry Comparison
| Engine | Free Tier | Royalty | Notes |
|---|---|---|---|
| GroveEngine | €0 - €100k | 1% > €100k | Best for EU indie devs |
| Unreal Engine | $0 - $1M USD | 5% > $1M | Higher %, higher threshold |
| Unity | Subscription | None | Monthly fees (~€2k/year Pro) |
| Godot | 100% Free | None | MIT, but minimal official support |
GroveEngine = Best value for games earning €100k - €500k 🎯
📧 License Questions? Contact alexistrouve.pro@gmail.com
Contributing
This engine uses an architecture optimized for Claude Code development. Each module is autonomous and can be developed independently.
Constraints:
- ✅ Modules 200-300 lines maximum
- ✅ Autonomous build:
cmake .from module directory - ✅ JSON-only communication between modules
- ✅ Zero dependencies up (no
#include "../") - ❌ Never
cmake ..
GroveEngine - Where modules grow like trees in a grove 🌳