[性能] 方案 E:实例化渲染 —— A→C 落地后每帧顶点数据只剩 28.7 KB,收益同样被剔除吃掉 #18
Labels
No Label
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Blocks
#16 [性能] 渲染主循环掉到 20 tps:零视口剔除(88.6% 白画)+ 图集页切换导致单帧最高 3077 次 draw call
troytt/diablo2-web
Reference: troytt/diablo2-web#18
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
拆自 #16 的方案 E。和 #D 一样,开出来主要是为了基于实测裁决要不要做。
方案原意
四边形几何只上传一次,per-instance 属性只放
(x, y, w, h, u0, v0, u1, v1, unit, tint),用drawArraysInstanced一次画完。调研共识是:对 tile/粒子这类"大量相似精灵",实例化能显著降低 CPU 开销。现在的数字
A→C 之后顶点布局是 4 顶点 × 9 float = 36 float/四边形(改造前是 6 顶点 × 8 = 48)。换成实例化约 12 float/实例。
每帧省 19 KB 的总线传输和约 1.9 µs 的写入。按 60 fps 算是 1.1 MB/s —— 在任何现代 GPU 上都测不出来。
额外代价
drawArraysInstanced里实例的绘制顺序虽然在实践中通常按索引,但规范并不保证跨实例的片元顺序,2D 等距靠的就是严格后画覆盖先画。要保序就得靠深度缓冲或分批,两者都会把结构搞复杂。a_unit)的组合,需要重写整个批处理器。建议
暂不做。 等实机 profile 出现「顶点上传是瓶颈」的证据再回来。
请裁决:关闭 / 降级挂起 / 仍然要做。
按实测关闭:每帧顶点数据已从 400.6 KB 降到 28.7 KB,实例化最多再省 19 KB(60 fps 约 1.1 MB/s),而跨实例的片元顺序没有规范保证,与本项目依赖的严格画家序冲突,还要重写整个批处理器。
如果以后实机 profile 出现「顶点上传是瓶颈」的证据,再重开。