It almost seems like Krita is making a new layer at the beginning of the stroke, and at the end of the stroke it merges it.
AFAIK that is exactly right (functionally – internally it’s probably more optimized than making a whole new layer)
GIMP does the same thing (except for Mypaint-Brush tool, I think?)
It’s like making a new layer and setting its opacity to the brush opacity. Brush is then applied in the ‘normal’ fashion (ie. like Normal mode).
If you look at GIMP, it also has another setting ‘Force’ which IIRC is analogous to ‘Flow’ in Photoshop : it controls the opacity with which the brush is applied to the buffer. Low force == airbrushy buildup, High force == near instant buildup.
But it’s more complicated than that since within the stroke it doesn’t remix with itself. It also ratchets towards more opaque-- the stroke won’t get LESS opaque once it is drawn. Not sure how it’s doing that.
It does remix though; that’s normal behaviour that MyPaint already exhibits (applying dabs only reduces opacity of pixels if you are using Erase or Smudge; applying dabs that have lower opacity just adds less opacity at once.)
Smudge is kind of a corner case here.
If you turn this whole thing inside-out, you could say instead that MyPaint’s method is like each individual dab is one application of Wash. Since the application area is much smaller in MyPaint’s method, it’s more optimisable.
IMO MyPaint’s expectations WRT the behaviour of Smudge is the biggest stumbling block. I’m not sure what the correct behaviour for Smudge sampling is, but I suspect we cannot make it give just the same results with Wash application mode.
EDIT: GIMP’s handling of Smudge avoids this problem by making smudging entirely Mypaint-style (not wash). Since in MyPaint smudging is not a binary thing, we probably cannot directly adopt such a straightforward approach.