Frontmatter
| id | 9168 |
| title | [Grid] Optimize Runtime Buffer Updates (Phase 2: Performance) |
| state | Closed |
| labels | enhancementaiperformance |
| assignees | tobiu |
| createdAt | Feb 15, 2026, 1:00 PM |
| updatedAt | Feb 15, 2026, 2:26 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9168 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9165 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 15, 2026, 2:26 PM |
[Grid] Optimize Runtime Buffer Updates (Phase 2: Performance)
tobiu assigned to @tobiu on Feb 15, 2026, 1:01 PM
tobiu added parent issue #9165 on Feb 15, 2026, 1:01 PM

tobiu
Feb 15, 2026, 2:26 PM
Input from Gemini 3 Pro:
✦ Implemented performance optimizations and fixed a visibility regression.
Changes:
- Optimization (Phase 2): Removed
force=truefrom buffer updates to allow row recycling, significantly reducing VDOM churn.- Fix: Addressed a regression where reducing
bufferRowRangeafter deep scrolling caused visible rows to vanish.
- Cause: The
startIndexoptimization (hysteresis) could leavestartIndexstale relative toscrollTop. Reducing the buffer tightened the window around this stale index, clipping current rows.- Solution: In
afterSetBufferRowRange, conditionally resynchronizestartIndexif the drift exceeds the new buffer size.Verification:
- Updated
test/playwright/unit/grid/PoolingRuntimeUpdates.spec.mjswith deep scrolling reproduction cases. All passed.
tobiu closed this issue on Feb 15, 2026, 2:26 PM
tobiu cross-referenced by #9169 on Feb 15, 2026, 2:51 PM
After fixing the functional regression in Phase 1, we need to optimize the runtime buffer updates. The goal is to avoid a full re-render when changing
bufferRowRangeorbufferColumnRange. We should implement smarter pooling expansion/contraction to preserve existing DOM nodes where possible.Parent Issue: #9165