【01】Git Hub文档
Dirty Flag Pattern 脏标记模式
01.01-意义
Intent
Avoid unnecessary work by deferring it until the result is needed.
将工作推迟到必要时进行,以避免不必要的工作。
01.02-模式描述
The Pattern
A set of primary data changes over time. A set of derived data is determined from this using some expensive process. A “dirty” flag tracks when the derived data is out of sync with the primary data. It is set when the primary data changes. If the flag is set when the derived data is needed, then it is reprocessed and the flag is cleared. Otherwise, the previous cached derived data is used.
一组原始数据随时间变化。一组颜色数据经过一些代价昂贵的操作由这些数据确定。一个脏标记跟踪这个衍生数据是否和原始数据同步。它在原始数据改变时被设置。如果它被设置了,那么当需要衍生数据时,它们就会被重新计算并且标记被清除。否则就使用缓存的数据。
01.03-使用情形
When to Use It
就像其他优化模式一样,此模式会增加代码复杂度。只在有足够大的性能问题时,再考虑使用这一模式。
脏标记在这两种情况下适用:
当前任务有昂贵的计算开销
当前任务有昂贵的同步开销。
若满足这两者之一,也就是两者从原始数据转换到目标数据会消耗很多时间,都可以考虑使用脏标记模式来节省开销。
若原始数据的变化速度远高于目标数据的使用速度,此时数据会因为随后的修改而失效,此时就不适合使用脏标记模式。
01.04-我的收获
01 是怎么实现优化的?
02 何时使用
03 关键词
代价昂贵的操作
用于优化,是优化模式的一种
原始数据,目标数据
【02】博客
将工作延期至需要其结果时才去执行,避免不必要的工作。
游戏中进行位置变化时,递归调用其所有子对象。调用“父节点相关的变换”对“对象的自身变换”进行变化,计算对象的世界变换。
如果在游戏中每一帧都进行计算的话,其中有些部分的位置是没有变换的,所有只需计算那些位置发生变换的对象。如果每次变换都立即更新世界变换,那么浪费CPU进行无效的运算。
解耦自身变换和世界变换,在一次批处理中改变自身变换,在渲染它之前按,重新计算它们的世界变换。通过脏标识,当需要对象的世界变换时,检测该对象的脏标识,如果被设置,计算世界变换后清除标识。
一组原始数据随着时间变化而改变。使用昂贵的过程推定一组导出数据。一个“脏”标识追踪导出数据是否与原始数据保持一致。它在原始数据改变时被设置。 如果导出数据被请求时,该标识被设置了,那么重新计算并清除标识否则的话,使用之前缓存的导出数据。
当原始数据变换到导出数据消耗很多时间或者有很多其他方面的消耗时,使用本模式。本模式将某些耗时的工作延期到真正需要结果的时候,当它要时通常是现在就要,耗时的计算会引起卡顿。延期的另一个问题,如果东西出错,可能就无法弥补,当使用这个模式将状态持久化,更为突出。比如经常碰到的word文档,突然死机,就懵逼了。
推导数据本质就是缓存,要保持缓存一致性,也就是任何原始数据变化时设置脏标识,否则引起难以追踪的漏洞。可以将原始数据的修改隐藏在接口之后,任何修改状态的代码都要通过api,在api那里设置脏标识。当推倒数据被请求而脏标识没有设置时,使用之前设置的数据,否则重新计算推导数据并将其放入内存。
