Repository navigation
perf(editor): bound large-view work to visible and changed content #34
Description
Verified on branch / awaiting merge
Production implementation: dd5979c613b0fe8ebd9f7026f25001ceee9f8cee. Delivered head: dbae93e8f211d45a69cdffdb6afa3a33a0af0fa5; the subsequent diff contains documentation/acceptance evidence only. Exact-head CI: Engine CI and NuGet dependency graph passed; all six checks on this exact head are successful. All applicable acceptance conditions for this issue are verified; unavailable physical/manual device checks are explicitly scoped, not reported passed.
Owner: Visible tree/grid/Console rows and neutral graph display projection. Implementation commits: 63d4f7dc, 973a1aa7, bc88dc04.
Evidence: complete report, exact-head delivery attachment, portable test-case/raw-measurement/requirement indexes linked by the report. Specific proof: Visual/Workflows: 10k native range/edit/drag and clipped content counts; Contracts: 2k affected-node geometry reuse; Quantitative: five paired static and input producers.
Commands: official tests/Invoke-EditorUiAcceptance.ps1 Contracts/Workflows/Visual/Lifecycle/Products with SDK-selected independent outputs; complete source/entry preparation; formal InnoEngine.Build scripts --ide for the three companions; tests/Invoke-WikiChecks.ps1; controlled public performance fixtures where applicable. The report records original command owners, TRX/binlogs, negative tests, failures, skips, input hashes and device limits.
Profiles overlap; do not sum their pass counts into a distinct-test claim. Windows-only sharing fixtures and Unix-only filesystem fixtures are scoped to the executing host. Real native contexts/simulated display metrics and hidden product feature journeys are not a claim of physical display, OS IME or manual Mac testing. No BGCS/vendor/package/generated-binding modification, parallel Core system, test hook, IVT or private reflection was used.
Keep this issue Open. PR #26 includes an individual Fixes #34 and will close it only when the user merges to master. No automatic merge or premature master-resolution claim.
Original defect, ownership and accepted work
The following baseline observations describe the issue as opened. The verification above supersedes intermediate pending checkpoints; original failed/negative logs remain preserved. Acceptance checkboxes are checked only after the exact delivery-head verification completes.
Parent and original requirement
Parent: #27. Work item E07 from the approved Editor UI closure plan and its original implementation/acceptance requirements.
Baseline facts and risks at issue creation
Browser submits every entry, Hierarchy reconstructs visible selection while drawing, and Graph reconstructs all port positions. Native pixel clipping alone does not bound managed work. Magnitude of any performance regression remains unmeasured.
Owner and dependency boundary
Asset Browser/Hierarchy/Console presentation and Graph geometry over existing authoritative domain records.
Implementation
- Capture an unchanged-input baseline before optimization.
- Submit fixed rows/grid rows by visible range; flatten tree views by revision/expansion/filter/sort.
- Keep selection/anchor/edit/drag state independent from clipping.
- Cache variable-height Console measurements by content/width/scale/expansion.
- Reuse unchanged graph geometry and update affected nodes/ports only; pan applies transforms.
- Avoid speculative complex spatial indexes, pools or parallel domain databases.
Acceptance
- 10,000-entry tree/list/grid scroll/search/range/drag/rename remains correct.
- No lost focus/expansion/identity from clipping.
- 2,000-node single-node updates reuse unaffected geometry.
- Delete/Missing/reload/scale invalidate correctly.
- Record submitted item work and allocations, not only FPS.
Failure and lifecycle constraints
Preserve diagnostics, cancellation, atomic rollback/publication, Missing recovery and generation retirement. Reuse Core Events, Identity, IO, Serialization and History. Do not modify BGCS/vendor/generated code or add global/implicit imports, compatibility paths, IVT or private reflection.
Evidence and closure
Commits, exact commands, logs/TRX/data and remaining limits will be added during implementation. Until all acceptance passes this issue remains open. After verification mark Verified on branch / awaiting merge; add Fixes #34 with this issue's actual number to PR #26 only when complete. Close on merge to master, not on branch implementation.
Activity
FLwolfy commentedon Oct 27, 2026
Additional confirmed acceptance finding (before changing the renderer contract): the 10,000-row native Hierarchy workload aborts with CRT exit code 3 and ImGui's
Too many vertices in ImDrawList using 16-bit indicesassertion. A process-local diagnostic startup hook redirected CRT assertion output to stderr; assertions remained enabled and the run still failed. Evidence:e07-crash/hierarchy-assertion.logunder the execution evidence owner.The shared Tree widget submits custom content and guide geometry for clipped rows. Separately, the SDL and BGFX renderer implementations already consume per-command vertex offsets, while PlatformImGuiContext does not advertise that capability. The fix must address bounded presentation work and express the selected renderer's capability through its existing SPI, rather than disabling assertions or assuming a renderer by name. Native tests must cover both capability settings and use a validating draw-data consumer when collecting the large-workload baseline. No BGCS, generated binding, or third-party changes are authorized or required.
FLwolfy commentedon Oct 27, 2026
A new real-context retention regression confirms additional native growth: after 150 ordinary log updates with Console capacity fixed at 16, ImGui retained 154 windows. The 10,000-occurrence visible-row/keyboard case and seven related Console regressions passed. Per-occurrence child-window names cause the growth independently of managed log retention. The fix will reuse presentation-only child-window identifiers across frames, retain stable occurrence IDs inside each submitted card, and protect focused/popup sources. These identifiers are not object identities or an additional log store; domain selection/copy still uses the existing occurrence/group protocol. Evidence: e07/console-visible-before-slot-reuse.trx.
FLwolfy commentedon Oct 27, 2026
Branch implementation and regression update (not a closure claim):
D:/InnoEngine-Verification/editor-ui-closure-2026-10-27/e07/console-popup-final.trx(local acceptance evidence; final report will index the committed candidate).Large-view paired performance and the remaining original-plan acceptance are still pending. This issue stays open until its complete acceptance and PR merge.
FLwolfy commentedon Oct 27, 2026
New real-product regression found during the required FlappyBird Play/stop journey:
AssetFileSystem.Refresh()unregisters and recreates entry runtime identities even for unchanged content. The new derived UI views were keyed only by the asset content revision, which is unchanged for this refresh. Their runtime IDs therefore become stale.I am adding a public-boundary unchanged-rescan regression before fixing the cache identity boundary. The fix must preserve Core Identity resolution and avoid retaining live source objects or introducing a parallel resolver.
FLwolfy commentedon Oct 27, 2026
A further native regression reproduced during closure: with Console capacity 1, opening an occurrence context menu and evicting that occurrence left one native popup in the input stack after three frames. The new public-input theory failed for eviction before the fix (clear already passed). Selection retirement was incorrectly discarding the context key before its owning popup could close. The Console owner now preserves that key until its normal popup retirement path runs; no global popup clearing or native assertion suppression is introduced. Post-fix native regression is in progress. Evidence owner: editor-ui-closure-2026-10-27/e07/console-retired-popup-before.trx.
FLwolfy commentedon Oct 27, 2026
Correction to the immediately preceding popup report: the first test requested capacity 1, but EditorConsole correctly normalizes capacity to a minimum of 16. Two records therefore did not evict the original record; expecting its menu to close was invalid. The corrected regression uses the actual capacity, publishes enough replacements, and explicitly proves the original occurrence is absent before asserting retirement. Both clear and true eviction pass against the existing production implementation (console-retired-real-before.trx: 2 passed). The speculative ClearFocus change was withdrawn. Only the valid public-input regression remains. Earlier bounded-window results retain their actual numeric window counts, but the 'retained records: 1' text was inaccurate and is corrected to report the captured count.
FLwolfy commentedon Oct 28, 2026
Controlled graph regression and focused correction
The first complete clean alternating matrix has five valid original/current process pairs per workload. The 2,000-node graph regresses from approximately 25.00 ms median / 27.55 ms P95 to 30.21 / 36.83 ms. Allocation decreases slightly, but this CPU/P95 regression fails the approved acceptance threshold.
A separate EventPipe diagnostic run (not accepted timing data) attributes much of graph drawing to repeated native context acquisition. The Shader canvas already borrows one draw list, but the new generic graph methods acquire it again for each node/connection; output labels are measured twice; the Shader adapter queries the same frame mouse position for each port. The correction will pass the existing owned draw-list borrow explicitly, reuse the measured label width, and use the frame's input snapshot. Every actual draw-list operation retains its frame/window/context/thread checks. No BGCS/package/native binding change or global validation bypass is proposed.
The Core allocation correction is tracked separately in #45. Final SDK builds, public native regressions and the controlled five-pair matrix must be rerun after these changes; existing before-correction results are not final acceptance.
FLwolfy commentedon Oct 28, 2026
The first graph correction passes six actual native Graph/Settings regressions, but its single diagnostic probe is still too slow to claim acceptance. A further redundant hot path is the existing presentation color-format conversion: every constant node/port color crosses BGCS for a pure four-channel packing calculation. I will retain the public drawing-frame admission rule and implement that existing format conversion locally, with native-oracle tests for channel order, saturation, rounding and non-finite values. This is not a new cache, public API, binding patch or removal of drawing lifetime checks. The final five alternating process pairs remain the acceptance authority.
FLwolfy commentedon Oct 28, 2026
Native-oracle correction: ordinary managed float-to-int conversion failed for NaN (native 0x80000000 versus managed zero). The implementation now uses the standard Single.ConvertToIntegerNative API; all 4,387 numeric oracle vectors pass. An additional test assertion incorrectly expected a pure value conversion to reject a still-owned context immediately after Render. Existing admission checks Session/context/thread, while drawing borrows separately check frame/window. The test now checks rejection after owner disposal; no production guard was removed or relaxed. Its final native run and controlled performance remain pending.
FLwolfy commentedon Oct 28, 2026
The final five-pair measurements no longer reproduce the relative graph regression after f7dce89: frame median 29.01 -> 28.78 ms, P95 33.17 -> 33.39 ms (+0.65%), CPU unchanged, allocation 4.36 -> 3.63 MB/frame. The 10,000-item asset view improves to 18.73 ms median / 27.58 ms P95 and 0.98 MB/frame. Hierarchy improves substantially but still costs 345.14 ms median and 139.06 MB/frame; #46 records the remaining full-scene dirty-state path. Do not mark E07 fully complete from relative gains alone. All raw pairs and before/after identity checks are retained; full native committed-source CI remains running.
FLwolfy commentedon Oct 29, 2026
Remaining scale-workflow evidence found during closure review
The actual-input performance preflights cover native wheel scrolling, Browser text search and continuous real SceneEdits/History work on the 10,000-item input. The existing keyboard/range correctness matrix uses smaller data sets. That combination does not yet directly prove the entire large-view range/rename/drag workflow required here.
I am adding explicit 10,000-entry hierarchy, Browser list, grid and tree cases before final verification. They use the actual panels, native keyboard/text input, ordinary grid selection and the existing public identity/drop/History contracts. Grid selection is verified through the existing readable project-state writer, not private Panel fields. The test file is staged in the isolated continuation worktree while the primary frozen candidate finishes its current build. No new production test API or dependency is introduced. Final native-payload, clipping/identity and workflow claims will be scoped to the actual assertions and preserved TRX; this comment is not a pass or issue-closure claim.