[Cuis-dev] Morph redrawNeeded

Juan Vuletich juan at cuis.st
Wed May 3 12:45:09 PDT 2023


Hi Jon,

On 5/3/2023 4:01 PM, Jon Hylands via Cuis-dev wrote:
> Hey Juan,
>
> Try the attached in a virgin image. There is definitely something 
> weird going on - #drawOn: is getting called twice when #redrawNeeded 
> is sent. Make sure the Transcript is open.
>
> - Jon

This is good. It lets us talk about concrete stuff.

#drawOn: is called twice. You can print the class of the canvas 
argument. It is called once on a BoundsFinderCanvas, and another on a 
VectorCanvas. This Morph is a subclass of PlacedMorph, meaning that it 
has all the VectorGraphics generality available, with some possible 
performance cost. I'll come back to this later.

Now, if I remove the clearing of the startTime variable at the end of 
#drawOn:, open an instance, and close all windows (including the 
Transcript), I see values around 150mS. But, if I move my mouse quickly 
to generate _many_ mouse move events, the times it displays are 0 or 2 
(on a rather fast laptop). It is because Morphic sleeps a bit if there's 
nothing to do. This is essentially to avoid wasting CPU, energy, etc. 
See use of ivar 'pause' in WorldMorph. On the Raspi, 10 to 20 fps should 
be possible.

As I said above, this Morph can be made more efficient. Morphic in Cuis 
lets you do stuff like Sample01Star. Check it. It doesn't say what are 
its 'bounds', what pixels are inside it, etc. It only knows how to draw 
itself and it just works. It is the framework who takes the trouble to 
find out all the details. But his generality has some cost. For 
instance, the need for a BoundsFinderCanvas, and the need to call 
#drawOn: twice: the first call is to find the current bounds of the morph.

But as your example doesn't really need all this, but we want good 
performance on a slow cpu, we can use a more limited style and features, 
that is enough for simple boxes and text (Browsers and other Smalltalk 
tools, SystemWindows, PluggableMorphs all work like this) :
- Copy the class as #RedrawNeededTest2
- Change superclass to BoxedMorph
- Add this method:
initialize
     super initialize.
     extent := `500 at 500`.
     color := Color black.
     borderColor := Color white.
     borderWidth := 1.
- Make #drawOn: call super drawOn: aCanvas. Remove the call to draw and 
fix the box.
Doing something similar could make a visible difference in your actual 
application. Or not. Not sure.

Hope this helps,

-- 
Juan Vuletich
cuis.st
github.com/jvuletich
researchgate.net/profile/Juan-Vuletich
independent.academia.edu/JuanVuletich
patents.justia.com/inventor/juan-manuel-vuletich
linkedin.com/in/juan-vuletich-75611b3
twitter.com/JuanVuletich



More information about the Cuis-dev mailing list