Skip to content

fix(parser): accumulate assets and subscenes in place to remove superlinear cost - #1031

Merged
MakinoharaShoko merged 1 commit into
OpenWebGAL:devfrom
A-kirami:fix/parser-asset-accumulation-quadratic
Sep 13, 2026
Merged

MakinoharaShoko merged 1 commit into
OpenWebGAL:devfrom
A-kirami:fix/parser-asset-accumulation-quadratic

Conversation

@A-kirami

Copy link
Copy Markdown
Contributor

改动

sceneParser 累积语句资源时写成了 assetsList = [...assetsList, ...sentenceAssets],每条语句都会复制一遍当前已累积的列表,解析成本因此随资源引用数二次增长。资源密集的脚本(每条语句都带 bg / changeFigure / say -vocal)规模上去后开销很明显。

改成就地 push。累积结果、顺序、去重以及 assetsPrefetcher 的入参都不变;另外补了两条测试:多条语句的资源/子场景累积与去重,以及一个复杂度守卫(语句数 ×4 时耗时不得超过 ×8,旧实现在该用例下比值 22)。

效果

每条语句都带一个资源引用时(本机实测):8000 条语句 41.1ms → 11.8ms,4000 条 13.1ms → 5.9ms。编辑器类调用方每次编辑都会整篇解析,这部分直接体现为输入延迟。

验证

cd packages/parser && npx vitest run,31 个用例通过。

sceneParser 在逐语句 map 里用 [...assetsList, ...sentenceAssets] 复制整个
已累积列表,资源密集脚本的整体复杂度因此是 Θ(资源数²):8000 条语句
(5333 个资源引用)解析耗时 47.8ms,而同样语句数、不带资源的脚本只要
6.7ms(线性)。

改为就地 push 追加,结果内容与顺序完全不变。新增回归测试:
- 多条语句的资源/子场景累积顺序、类型去重与 prefetcher 入参保持一致
- 语句数 ×4 时耗时不得超过 ×8(旧实现在该测试下比值约 22)
@MakinoharaShoko
MakinoharaShoko merged commit e780672 into OpenWebGAL:dev Sep 13, 2026
1 check passed
@A-kirami
A-kirami deleted the fix/parser-asset-accumulation-quadratic branch September 13, 2026 13:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants