I looked again at the MockinBird ChangeQueue article, and indeed some important parts are left unsaid. I’ll improve the article tonight, but until then the most important bits to know are:
Override and implement at least NotifyEndChanges(). When that is called by the underlying system you know changes have been collected. To get those you issue a call to base class Flush(). You can see from the linked API doc the order in which the Apply* functions of your implementation get called.
If you are doing a modal renderer, then you actually don’t need the NotifyEndChanges(), but after CreateWorld() you can directly call Flush().
The ChangeDatabase et al I mainly use to map between Rhino and Cycles data IDs.