脏标记模式

“将工作推迟到必要时进行以避免不必要的工作。”

一组原始数据随时间变化。一组衍生数据经过一些代价昂贵的操作由这些数据确定。一个脏标记跟踪这个衍生数据是否和原始数据同步。它在原始数据改变时被设置。如果它被设置了,那么当需要衍生数据时,它们就会被重新计算并且标记被清除。否则就使用缓存的数据。

游戏服务器开发,最经典的就是同步玩家数据给客户端,例如

class GameObject
{
public:
    virtual void OnTick()
    {
        if(IsDirty())
        {
            ClearDirty();
            NotifyData();
        }
    }
    void doSomething()
    {
        GetData()->x++;
        MarkDirty();
    }
};

可能doSomething在每一个逻辑帧中被调用了非常多次,优势并不用每次调用都发数据给客户端, 完全没必要,可以使用一个属性进行标记,跑到下一次Tick时,判断标记并通知客户端,清除标记。