加载中...
脏标记是一种性能优化模式:用一个布尔标记记录某状态自上次处理后是否发生变化,只有在标记为脏时才执行昂贵的重新计算或同步,从而避免每帧或每次访问都做无谓的重复工作。它在游戏与图形编程中尤为常见。

| 中文名 | 脏标记模式 |
| 外文名 | Dirty Flag |
| 类别 | 性能优化模式 |
| 核心思想 | 延迟与合并计算 |
| 常见领域 | 游戏、图形、UI |
| 相关概念 | 惰性求值、缓存失效 |
脏标记模式(Dirty Flag Pattern)是一种通过延迟并按需执行昂贵计算来提升性能的技术:为某个派生数据维护一个脏标记,当其依赖的原始数据被修改时把标记置脏,只有在真正需要用到派生结果且标记为脏时才重新计算,并随即清除标记。
许多系统中存在从基础状态推导出来的派生数据,例如由局部变换矩阵推导世界变换、由源数据生成缓存或摘要。若每次访问都重新推导会造成大量重复计算,若每次修改都立即推导又可能算了却用不上。脏标记在这两个极端之间取平衡:修改时只是打个标记,把实际推导推迟到读取时,并保证连续多次修改只触发一次重算,是一种把工作合并与延迟的优化。
脏标记在游戏与图形编程中极为普遍,如场景图中变换矩阵的惰性更新、渲染批次或包围盒的重建、UI 布局的重新计算。它也用于文档编辑器判断是否需要保存(未保存的更改)、缓存系统的失效标记、以及任何需要把频繁修改与偶尔读取解耦的场合。
问:脏标记的主要风险是什么?答:最大的风险是忘记在某条修改路径上置脏,导致读取到过期的派生数据,产生难以察觉的错误;因此所有会影响派生结果的修改入口都必须可靠地设置标记。
问:脏标记和记忆化有何不同?答:记忆化按输入缓存结果、命中即返回,强调相同输入复用;脏标记则针对可变状态,用标记跟踪失效并在读取时惰性重算,更适合有明确修改点的可变对象。

| 中文名 | 脏标记模式 |
| 外文名 | Dirty Flag |
| 类别 | 性能优化模式 |
| 核心思想 | 延迟与合并计算 |
| 常见领域 | 游戏、图形、UI |
| 相关概念 | 惰性求值、缓存失效 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧