A new version of MorphicExtras was added to project The Inbox:
http://source.squeak.org/inbox/MorphicExtras-ct.260.mcz ==================== Summary ==================== Name: MorphicExtras-ct.260 Author: ct Time: 4 September 2019, 3:53:54.175698 pm UUID: cab65f78-e646-cc40-9d0f-c16114d1bb44 Ancestors: MorphicExtras-mt.259 Refactor FrameRateMorph: Add accessors for updateInterval and expose measure data. Use TimeStamp instead of Time to avoid clock wrap around. =============== Diff against MorphicExtras-mt.259 =============== Item was changed: StringMorph subclass: #FrameRateMorph + instanceVariableNames: 'lastDisplayTime framesSinceLastDisplay updateInterval mSecsPerFrame framesPerSec' - instanceVariableNames: 'lastDisplayTime framesSinceLastDisplay' classVariableNames: '' poolDictionaries: '' category: 'MorphicExtras-Demo'! Item was added: + ----- Method: FrameRateMorph>>framesPerSec (in category 'accessing') ----- + framesPerSec + + ^ framesPerSec! Item was changed: ----- Method: FrameRateMorph>>initialize (in category 'initialization') ----- initialize "initialize the state of the receiver" super initialize. "" + lastDisplayTime := TimeStamp new. - lastDisplayTime := 0. framesSinceLastDisplay := 0. + self updateInterval: 500 milliSeconds. self font: (Preferences standardMenuFont emphasized: 1). ! Item was added: + ----- Method: FrameRateMorph>>mSecsPerFrame (in category 'accessing') ----- + mSecsPerFrame + + ^ mSecsPerFrame! Item was changed: ----- Method: FrameRateMorph>>step (in category 'stepping and presenter') ----- step "Compute and display (every half second or so) the current framerate" + | now timePassed newContents | - | now mSecs mSecsPerFrame framesPerSec newContents | framesSinceLastDisplay := framesSinceLastDisplay + 1. + now := TimeStamp now. + timePassed := now - lastDisplayTime. + (timePassed > self updateInterval) ifTrue: + [| mSecs | + mSecs := timePassed asMilliSeconds. + mSecsPerFrame := mSecs // framesSinceLastDisplay. - now := Time millisecondClockValue. - mSecs := now - lastDisplayTime. - (mSecs > 500 or: [mSecs < 0 "clock wrap-around"]) ifTrue: - [mSecsPerFrame := mSecs // framesSinceLastDisplay. framesPerSec := (framesSinceLastDisplay * 1000) // mSecs. newContents := mSecsPerFrame printString, ' mSecs (', framesPerSec printString, ' frame', (framesPerSec = 1 ifTrue: [''] ifFalse: ['s']), '/sec)'. self contents: newContents. lastDisplayTime := now. framesSinceLastDisplay := 0] ifFalse: ["Ensure at least one pixel is drawn per frame" Preferences higherPerformance ifTrue: [self invalidRect: (self position extent: 1@1)]]! Item was added: + ----- Method: FrameRateMorph>>updateInterval (in category 'accessing') ----- + updateInterval + + ^ updateInterval! Item was added: + ----- Method: FrameRateMorph>>updateInterval: (in category 'accessing') ----- + updateInterval: aNumber + + updateInterval := aNumber! |
Hi. I like the changes (especially the switch to DateAndTime), however, if you have a FrameRateMorph open when updating, it raises errors and fails to work (the time to timestamp gives it issues). Any chance you could prescript to fix this? Maybe either update existing instances with DateAndTimes and stop/start stepping around the update, or closing all instances (although I'm not sure if that is advisable with the comments about 'stand-alone entity' in initializeToStandAlone, which implies there are embedded instances). -cbc On Wed, Sep 4, 2019 at 6:54 AM <[hidden email]> wrote: A new version of MorphicExtras was added to project The Inbox: |
hmm. I didn't notice the use of TimeStamp. We should stop using that subclass where possible and not include any new uses in the base image. On Wed, Sep 4, 2019, 09:39 Chris Cunningham <[hidden email]> wrote:
|
In reply to this post by cbc
Hi, thanks for feedback!
I have no experience with upgrade scripts, how can we keep the code clean? Is it possible to have Metacello load a temporary version first and then load the final version, or are there any better patterns?
For a temporary version, we could prepend the following code to the #step method:
self updateInterval ifNil: [ "Upgrade existing instance"
lastDisplayTime := DateAndTime new.
self updateInterval: 500 milliSeconds].
Probably it would be a bad idea to have the method recompile itself after executing the upgrade part? ;)
Best, Christoph
PS: Yes, there was no special reason to use TimeStamp, except of [TimeStamp name size < DateAndTime name size] :) Von: Squeak-dev <[hidden email]> im Auftrag von Chris Cunningham <[hidden email]>
Gesendet: Mittwoch, 4. September 2019 18:39:13 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: MorphicExtras-ct.260.mcz Hi.
I like the changes (especially the switch to DateAndTime), however, if you have a FrameRateMorph open when updating, it raises errors and fails to work (the time to timestamp gives it issues).
Any chance you could prescript to fix this? Maybe either update existing instances with DateAndTimes and stop/start stepping around the update, or closing all instances (although I'm not sure if that is advisable with the comments about 'stand-alone entity'
in initializeToStandAlone, which implies there are embedded instances).
-cbc
On Wed, Sep 4, 2019 at 6:54 AM <[hidden email]> wrote:
A new version of MorphicExtras was added to project The Inbox:
Carpe Squeak!
|
A nicer way to do this is to use the preamble and postscript. With your version loaded (and changed to use DateAndTime), in the Morphic browser, choose the Scripts button ( ). Then choose "edit preamble" to edit the preamble script. Then, add the script to the window that pops up and save it. The script might look something like: FrameRateMorph allInstances do: [:frm|frm stopStepping. frm instVarNamed: #lastDisplayTime put: DateAndTime now. ]. Then, choose scripts again and edit postscript. In that editor, add code that start the stepping again. (Also, you'll need to remove the old postscript - it actively fails.) Then, save the new version and test it. Scripts are nice for one-shot updates. -cbc On Wed, Sep 4, 2019 at 12:06 PM Thiede, Christoph <[hidden email]> wrote:
|
Thank you very much for the tutorial!
I would not assume that all morphs are currently stepping. What would be the best way to pass information (a list of stopped morphs) from prescript to postscript? A class var? SmalltalkImage? Is there any Metacello cache for things like that?
Best, Christoph Von: Squeak-dev <[hidden email]> im Auftrag von Chris Cunningham <[hidden email]>
Gesendet: Mittwoch, 4. September 2019 23:27:15 An: The general-purpose Squeak developers list Betreff: Re: [squeak-dev] The Inbox: MorphicExtras-ct.260.mcz A nicer way to do this is to use the preamble and postscript. With your version loaded (and changed to use DateAndTime), in the Morphic browser, choose the Scripts button (
). Then choose "edit preamble" to edit the preamble script.
Then, add the script to the window that pops up and save it.
The script might look something like:
FrameRateMorph allInstances do: [:frm|frm stopStepping. frm instVarNamed: #lastDisplayTime put: DateAndTime now. ]. Then, choose scripts again and edit postscript. In that editor, add code that start the stepping again. (Also, you'll need to remove the old postscript - it actively fails.)
Then, save the new version and test it.
Scripts are nice for one-shot updates.
-cbc
On Wed, Sep 4, 2019 at 12:06 PM Thiede, Christoph <[hidden email]> wrote:
Carpe Squeak!
|
Hi Christoph, preamble and postscript are per package. I suppose that all FrameRateMorph instances are stepping. I would rather not add a global variable to pass information between scripts. Also, morphs do not step between code loading and postscript evaluation. So you should be fine with a single postscript: FrameRateMorph allInstances do: [:frm| frm stopStepping. frm instVarNamed: #lastDisplayTime put: DateAndTime now. frm startStepping]. Best, Marcel
|
Free forum by Nabble | Edit this page |