BPMIntervalTrigger Fix: host atom missing from Target Atom list
Fixed an issue where the atom holding the BPMIntervalTrigger plugin was excluded from the "Target Atom" dropdown in the Period Value Output section.
You can now keep everything on a single atom — e.g. load BPMIntervalTrigger and a receiver plugin (thrust driver, etc.) on the same atom and pipe the period value to it directly. No workaround atom needed.
No other behavior changes; existing scenes are unaffected.
Reduced GC Pressure: Major refactoring across core scripts to eliminate per-frame memory allocations (gc), resulting in smoother frame rates and reduced stuttering during long sessions.
CPU Optimization: Optimized Update loops to remove unnecessary overhead.
Script Specifics
RhythmReactor
Fix: Implemented caching for BPM string conversion in PushBPMValue. This eliminates string allocation garbage generated every frame when pushing data to other atoms.
Optimization: Improved logic to only update targets when integer values actually change.
BPMIntervalTrigger
Optimization: Completely removed try-catch blocks from the main Update loop, replacing them with efficient null checks to reduce CPU overhead.
New Feature: Implemented a Parameter Caching System (UpdateCachedTarget). Target parameters (Float/Bool/String) are now resolved and cached upon selection, eliminating expensive string parsing (Substring/Trim) and lookup calls during runtime execution.
Fixed a minor bug where External Param list was empty after loading a saved scene. The plugin now correctly restores the selected external storable and parameter without requiring manual re-selection.
Improved initialization flow for external plugin and parameter lists.
Minor internal cleanup and stability improvements.
Switched per-material Material.SetColor writes to MaterialPropertyBlock (MPB) per renderer, with per-renderer MPB caching.
Added update throttling via _updateInterval (default 1/60s) to cap live-update frequency.
Implemented per-frame batching with _maxRenderersPerFrame and a rolling _rendererCursor to spread large updates across frames.
Introduced color-change thresholding (NearlyEqualColor) to skip redundant writes when the effective emission color hasn’t changed.
Resolved a potential GC performance issue that occurred during LiveUpdate when "ApplyToAllRenderers" was disabled. The selected Renderer is now cached upon selection instead of being searched for by its string path every frame, eliminating per-frame allocations and potential stutter.