timfromhcs's picture
FlyBrain V9.0.0 Space sync (v9 release, endless world, chunk streaming, FlyAsset compiler)
6343479 verified
Raw
History Blame Contribute Delete
4.81 kB
"""Empirical Resource Profiles and Subsystem Budget Allocator.
Sections 12 & 13:
Derives profile dynamically from measurements:
- MINIMAL: <= 8GB RAM, CPU-only
- LOW: 8-16GB RAM, integrated GPU or low VRAM
- BALANCED: 16-32GB RAM, integrated GPU (e.g. AMD 680M) or >= 6GB dedicated VRAM
- PERFORMANCE: >= 32GB RAM, >= 8GB dedicated VRAM
- MAXIMUM: >= 64GB RAM, >= 16GB dedicated VRAM
Computes bounded budgets with configurable safety margins:
- os_reserve
- renderer_reserve
- physics_reserve
- brain_reserve
- interactive_ai_reserve
- background_ai_reserve
- model_cache
"""
from dataclasses import dataclass, field
from enum import Enum
from typing import Dict, Any
class ProfileTier(str, Enum):
MINIMAL = "MINIMAL"
LOW = "LOW"
BALANCED = "BALANCED"
PERFORMANCE = "PERFORMANCE"
MAXIMUM = "MAXIMUM"
@dataclass
class SubsystemBudgets:
os_reserve_mb: float
renderer_reserve_mb: float
physics_reserve_mb: float
brain_reserve_mb: float
interactive_ai_reserve_mb: float
background_ai_reserve_mb: float
model_cache_mb: float
vram_budget_mb: float
safe_ram_target_mb: float
def to_dict(self) -> Dict[str, float]:
return {
"os_reserve_mb": self.os_reserve_mb,
"renderer_reserve_mb": self.renderer_reserve_mb,
"physics_reserve_mb": self.physics_reserve_mb,
"brain_reserve_mb": self.brain_reserve_mb,
"interactive_ai_reserve_mb": self.interactive_ai_reserve_mb,
"background_ai_reserve_mb": self.background_ai_reserve_mb,
"model_cache_mb": self.model_cache_mb,
"vram_budget_mb": self.vram_budget_mb,
"safe_ram_target_mb": self.safe_ram_target_mb
}
def derive_profile(probe: Dict[str, Any]) -> ProfileTier:
"""Derives empirical profile tier based on real probed hardware."""
ram_gb = probe["memory"]["ram_total_gb"]
gpu = probe["gpu"]
has_gpu = gpu.get("vulkan_available", False)
vram_mb = gpu.get("dedicated_vram_mb", 0.0) + gpu.get("shared_memory_mb", 0.0) * 0.25
if ram_gb <= 8.5:
return ProfileTier.MINIMAL
elif ram_gb <= 16.5:
return ProfileTier.LOW
elif ram_gb <= 32.5:
return ProfileTier.BALANCED
elif ram_gb <= 64.5 and has_gpu and vram_mb >= 6000:
return ProfileTier.PERFORMANCE
elif ram_gb > 64.5 and has_gpu and vram_mb >= 12000:
return ProfileTier.MAXIMUM
else:
return ProfileTier.BALANCED
def compute_budgets(probe: Dict[str, Any], tier: ProfileTier) -> SubsystemBudgets:
"""Computes bounded memory budgets with mandatory safety margins."""
ram_total_mb = probe["memory"]["ram_total_bytes"] / (1024 ** 2)
gpu = probe["gpu"]
has_vulkan = gpu.get("vulkan_available", False)
dedicated_vram = gpu.get("dedicated_vram_mb", 0.0)
# 15% OS safety reserve minimum
os_reserve = max(1024.0, ram_total_mb * 0.15)
usable_ram = max(512.0, ram_total_mb - os_reserve)
if tier == ProfileTier.MINIMAL:
# Strict low-memory allocation
renderer = 256.0
physics = 128.0
brain = 256.0
interactive_ai = 512.0
bg_ai = 0.0
model_cache = 1024.0
vram = 0.0 if not has_vulkan else 512.0
elif tier == ProfileTier.LOW:
renderer = 512.0
physics = 256.0
brain = 512.0
interactive_ai = 1536.0
bg_ai = 512.0
model_cache = 2048.0
vram = dedicated_vram if has_vulkan else 0.0
elif tier == ProfileTier.BALANCED:
# Standard desktop / AMD 680M workstation configuration
renderer = 1024.0
physics = 512.0
brain = 1024.0
interactive_ai = 2560.0
bg_ai = 1536.0
model_cache = 4096.0
vram = max(dedicated_vram, 2048.0) if has_vulkan else 0.0
elif tier == ProfileTier.PERFORMANCE:
renderer = 2048.0
physics = 1024.0
brain = 2048.0
interactive_ai = 4096.0
bg_ai = 3072.0
model_cache = 8192.0
vram = dedicated_vram if has_vulkan else 2048.0
else: # MAXIMUM
renderer = 4096.0
physics = 2048.0
brain = 4096.0
interactive_ai = 8192.0
bg_ai = 6144.0
model_cache = 16384.0
vram = dedicated_vram if has_vulkan else 4096.0
safe_ram_target = usable_ram * 0.85
return SubsystemBudgets(
os_reserve_mb=round(os_reserve, 1),
renderer_reserve_mb=round(renderer, 1),
physics_reserve_mb=round(physics, 1),
brain_reserve_mb=round(brain, 1),
interactive_ai_reserve_mb=round(interactive_ai, 1),
background_ai_reserve_mb=round(bg_ai, 1),
model_cache_mb=round(model_cache, 1),
vram_budget_mb=round(vram, 1),
safe_ram_target_mb=round(safe_ram_target, 1)
)