It seems inefficient that we allocate a new GroupFeatureState for every single pass of process().  (Likely the compiler is smart and reuses the memory, but it still seems bad to allocate 8 doubles and 10 bools per deck per buffer.)  So I would say the fix is to have GroupFeatureState be a member variable, and if there's no change then it doesn't need to edit the values.