Dispatcher+Scheduler: decision to dispose of the TimeAnchor

several years ago, it seemed like a good idea to incorporate
the link between nominal time and wall-clock time into a dedicated
anchor point, which also regulates the continued frame planning.

But it turned out that such a design mixes up several concepts
and introduces confusion regarding the meaning of "real time"
- latency can not be reasonably defined for a whole planning chunk
- skipping or sliding due to missed deadlines can not reasonably handled
  within such an abstract entity; it must be handled rather at the
  level of a playback process
- linking the frame grid generation directly to a planning chunk
  undercuts the possible abstraction of a planning pipeline
This commit is contained in:
Fischlurch 2023-05-31 03:27:13 +02:00
parent 87f40c8169
commit fbfbd2a078
10 changed files with 322 additions and 64 deletions

View file

@ -260,7 +260,7 @@ namespace test{
/** create a random but not insane Time value */
/** create a random but not insane Time value between 1s ... 10min + 500ms */
inline lib::time::Time
randTime ()
{

View file

@ -102,9 +102,9 @@ namespace time {
* @warning this operation incurs information loss. Values may be rounded
* and / or clipped, according to the grid used. And, contrary to
* a QuTime value, the information about the actual grid is
* discarded. Please don't use this operation if you just
* "want a number" but feel to too lazy to understand
* properly what quantisation means!
* discarded. Please resist the temptation to abuse this
* operation to "just get a simple number", without
* understanding what quantisation means!
*/
TimeValue
Quantiser::materialise (TimeValue const& raw) const

View file

@ -56,7 +56,7 @@ namespace engine {
FrameCoord frame;
frame.absoluteNominalTime = refPoint;
frame.absoluteFrameNumber = refPoint.getStartFrame();
frame.absoluteRealDeadline = refPoint.establishDeadlineFor (frameOffset);
frame.realTimeDeadline = refPoint.establishDeadlineFor (frameOffset);
frame.modelPort = this->modelPort_;
frame.channelNr = this->channel_;

View file

@ -69,7 +69,7 @@ namespace engine {
TimeVar absoluteNominalTime;
FrameCnt absoluteFrameNumber;
TimeVar absoluteRealDeadline;
TimeVar realTimeDeadline;
ModelPort modelPort;
uint channelNr; ///////////////////////////////////////////////////////////////////////////TICKET #1297 : retract differentiation into channels here (instead use ModelPorts in the Segment)
@ -79,7 +79,7 @@ namespace engine {
FrameCoord()
: absoluteNominalTime(Time::NEVER)
, absoluteFrameNumber(std::numeric_limits<FrameCnt>::max())
, absoluteRealDeadline(Time::NEVER)
, realTimeDeadline(Time::NEVER)
, modelPort() // unconnected
, channelNr(0)
{ }
@ -91,7 +91,7 @@ namespace engine {
bool
isDefined() const
{
return absoluteRealDeadline != Time::NEVER;
return realTimeDeadline != Time::NEVER;
}
};

View file

@ -30,6 +30,8 @@
** @todo this is part of an implementation draft from 2013,
** to create a complete outline of player and render job generation.
** @todo as of 2016 this effort is stalled, but remains valid
**
** @deprecated 5/23 during rework of Playback / Rendering the concept TimeAnchor lost its substance
*/
@ -89,6 +91,9 @@ namespace engine {
* adjustments to the engine latency will be reflected in the planned job's
* deadlines. Actually, the embedded Timings record is responsible for this
* timing calculation and for fetching the current EngineConfig.
*
* @deprecated 5/23 during rework of Playback / Rendering it turns out that TimeAnchor
* is completely redundant and void of substantial meaning
*
* @see Dispatcher
* @see DispatcherInterface_test
@ -100,6 +105,8 @@ namespace engine {
FrameCnt anchorPoint_;
Time relatedRealTime_;
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
////////////////////////////////////////////////////////////////////////////////////////////////OOO sensible calculation, but pointless in TimeAnchor
static Time
expectedTimeofArival (play::Timings const& timings, FrameCnt startFrame, Offset startDelay)
{
@ -120,6 +127,14 @@ namespace engine {
}
return deadline;
}
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
static Time
expectedTimeofArival (play::Timings const& timings, FrameCnt startFrame, Offset startDelay)
{
TimeVar deadline = timings.isTimebound()? timings.getTimeDue(startFrame)
: RealClock::now();
return deadline + startDelay;
}
public:

View file

@ -128,14 +128,23 @@ namespace play {
{
return Offset (grid_->timeOf(refFrameNr), grid_->timeOf(refFrameNr + 1));
}
FrameCnt
Timings::getBreakPointAfter (TimeValue refPoint) const
{
FrameCnt frameNr = grid_->gridPoint (refPoint);
return grid_->timeOf(frameNr) == refPoint? frameNr
: frameNr+1;
}
/** @remarks the purpose of this function is to support scheduling
* and frame handling even in case the frame rate isn't constant.
* To indicate the case the frame rate is changing right now,
* this function might return Duration::NIL
* @todo implement real support for variable frame rates
* @todo implement real support for variable frame rates
*/ ////////////////////////////////////////////////////////TICKET #236
Duration
Timings::constantFrameTimingsInterval (TimeValue) const

View file

@ -100,7 +100,7 @@ namespace play {
PlaybackUrgency playbackUrgency;
boost::rational<FrameCnt> playbackSpeed; /////////////TICKET #902 we need a more generic representation for variable speed playback
Time scheduledDelivery; ///< a wall clock time corresponding to the Grid's origin. Can be Time::Never (=not time bound)
Duration outputLatency;
Duration outputLatency; ///////////////TICKET #1301 do we even need this information here (-> rather on some Engine state)
explicit
Timings (FrameRate fps);
@ -117,6 +117,9 @@ namespace play {
Duration getFrameDurationAt (TimeValue refPoint) const;
Duration getFrameDurationAt (FrameCnt refFrameNr) const;
/** the next grid point at or after the given reference time */
FrameCnt getBreakPointAfter (TimeValue refPoint) const;
/** the frame spacing and duration remains constant for some time...
* @param startPoint looking from that time point into future
* @return duration after this starting point, where it's safe
@ -174,6 +177,7 @@ namespace play {
bool isOriginalSpeed() const;
bool isTimebound() const;
/** Consistency self-check */
@ -196,6 +200,12 @@ namespace play {
return 1 == playbackSpeed;
}
inline bool
Timings::isTimebound() const
{
return play::TIMEBOUND == playbackUrgency;
}
}} // namespace steam::play

View file

@ -28,7 +28,7 @@
#include "lib/test/run.hpp"
#include "lib/error.hpp"
#include "lib/test/test-helper.hpp"
//#include "steam/engine/procnode.hpp"
#include "steam/play/dummy-play-connection.hpp"
@ -61,7 +61,7 @@ namespace test {
using lib::time::FrameRate;
using lib::time::Duration;
using lib::time::Offset;
using lib::time::TimeVar;
using lib::time::TimeValue;
using lib::time::Time;
using mobject::ModelPort;
using play::Timings;
@ -75,16 +75,23 @@ namespace test {
const uint DUMMY_CHANNEL(0); /////////////////////////////////////////////////////////////TICKET #1297 : get rid of the channels (use different ModelPort)
ModelPort
getTestPort()
// ModelPort
// getTestPort()
// {
// using play::test::ModelPorts;
// using play::test::PlayTestFrames_Strategy;
// using DummyPlaybackSetup = play::test::DummyPlayConnection<PlayTestFrames_Strategy>;
//
// DummyPlaybackSetup dummySetup;
// ModelPorts mockModelPorts = dummySetup.provide_testModelPorts();
// return *mockModelPorts; // using just the first dummy port
// }
FSecs
randTicks()
{
using play::test::ModelPorts;
using play::test::PlayTestFrames_Strategy;
using DummyPlaybackSetup = play::test::DummyPlayConnection<PlayTestFrames_Strategy>;
DummyPlaybackSetup dummySetup;
ModelPorts mockModelPorts = dummySetup.provide_testModelPorts();
return *mockModelPorts; // using just the first dummy port
return FSecs{1 + rand() % 600, 1 + rand() % 600};
}
} // (End) Test fixture
@ -120,53 +127,32 @@ namespace test {
void
verify_simpleFrameStep()
{
ModelPort modelPort (getTestPort());
Timings timings (FrameRate::PAL);
CHECK (timings.getOrigin() == Time::ZERO);
ENSURE (START_FRAME == 10);
TimeAnchor refPoint(timings, START_FRAME);
CHECK (refPoint == Time::ZERO + Duration(10, FrameRate::PAL));
FrameCoord frame; /////////////////TODO get / implement offset-by-#-Frames
FrameCnt frameOffset = 15;
frame.absoluteNominalTime = refPoint;
frame.absoluteFrameNumber = refPoint.getStartFrame();
frame.absoluteRealDeadline = refPoint.establishDeadlineFor (frameOffset);
frame.modelPort = modelPort;
frame.channelNr = DUMMY_CHANNEL;
ENSURE (frame.isDefined());
// frame = dispatcher_->locateRelative (frame, frameOffset); /////////////////////////////OOO MAGIC FAIRY DUST HERE
CHECK (frame.absoluteNominalTime == Time(0,1)); ///////////////////////////////////OOO Boooooom
CHECK (frame.absoluteFrameNumber == 25);
CHECK (refPoint.remainingRealTimeFor(frame) < Time(FSecs(25,25)));
CHECK (refPoint.remainingRealTimeFor(frame) >= Time(FSecs(24,25)));
CHECK (frame.modelPort == modelPort);
CHECK (timings.getFrameStartAt(START_FRAME) == Time::ZERO + Duration(10, FrameRate::PAL));
CHECK (timings.getFrameStartAt(START_FRAME+1) == Time::ZERO + Duration(11, FrameRate::PAL));
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #1301
}
/** action used as "continuation" in #check_ContinuationBuilder
* This function expects to be invoked with a time anchor bumped up
* to point exactly behind the end of the previously planned chunk of Jobs
/** @test detect boundaries of frame planning chunks for arbitrary chunk duration.
*/
void
verify_next_startPoint()
{
Timings timings (FrameRate::PAL);
TimeAnchor nextRefPoint(timings, START_FRAME); //////////////////////////////////////OOO : how is this actually determined (not yet implemented....)
UNIMPLEMENTED ("How to determine the start point of the next planning chunk");
Time refPoint{randTicks()};
FrameCnt startFrame = timings.getBreakPointAfter (refPoint);
Time frameStart = timings.getFrameStartAt(startFrame);
Duration frameDuration (1, FrameRate::PAL);
Time startAnchor = Time::ZERO + START_FRAME*frameDuration;
Duration time_to_cover = timings.getPlanningChunkDuration();
CHECK (Time(nextRefPoint) >= startAnchor + time_to_cover);
CHECK (Time(nextRefPoint) < startAnchor + time_to_cover + 1*frameDuration);
CHECK (frameStart >= refPoint);
CHECK (frameStart < refPoint + frameDuration);
}
};

View file

@ -77,7 +77,6 @@ namespace test {
CHECK (timings.getOrigin() == Time::ZERO);
CHECK (timings.getFrameDurationAt(t) == lengthPAL);
CHECK (timings.getFrameOffsetAt(t) == lengthPAL);
CHECK (ASAP == timings.playbackUrgency);
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #831
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////UNIMPLEMENTED :: TICKET #831

View file

@ -69527,6 +69527,51 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node CREATED="1685402933522" ID="ID_517929511" MODIFIED="1685406668551" TEXT="TimeAnchor">
<icon BUILTIN="button_cancel"/>
<node COLOR="#338800" CREATED="1685402939155" ID="ID_895439120" LINK="#ID_260441580" MODIFIED="1685402990260" TEXT="Konzept nochmal &#xfc;berpr&#xfc;ft: grunds&#xe4;tzlich OK">
<icon BUILTIN="button_ok"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685402993556" ID="ID_1110033319" MODIFIED="1685406661129" TEXT="Aber: sollte keine Latenz-Kompensation machen">
<icon BUILTIN="yes"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1685403027730" ID="ID_1618141786" MODIFIED="1685403315041" TEXT="das verwirrt die Konzepte &#xbb;realTime&#xab; und &#xbb;Deadline&#xab;">
<linktarget COLOR="#ff292c" DESTINATION="ID_1618141786" ENDARROW="Default" ENDINCLINATION="402;21;" ID="Arrow_ID_97219015" SOURCE="ID_1075266324" STARTARROW="None" STARTINCLINATION="250;-324;"/>
<icon BUILTIN="stop-sign"/>
</node>
<node CREATED="1685403065973" ID="ID_675806191" MODIFIED="1685403127990" TEXT="die Kompensation kann an dieser Stelle gar nicht korrekt/vollst&#xe4;ndig sein">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...denn dazu ben&#246;tigen wir <i>detailierte Timing-Beobachtungen, </i>welche erst im speziellen Job-Funktor vorliegen k&#246;nnen, nicht auf der Ebene eines ganzen Planning-Chunk
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685403325222" ID="ID_2694625" MODIFIED="1685403350256" TEXT="jedwede Latenz-Kompensation / Deadline-Bestimmung in die Planning-Pipeline verschieben">
<icon BUILTIN="flag-yellow"/>
</node>
<node CREATED="1685406566342" ID="ID_524698195" MODIFIED="1685406623527" TEXT="dann bleibt aber nix mehr &#xfc;brig....???">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
dann reduziert sich der TimeAnchor komplett auf einen Proxy zu den Timings (die obendrein noch als Kopie mitgeschleppt werden)
</p>
</body>
</html></richcontent>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685406639037" ID="ID_1524269116" MODIFIED="1685406674080" TEXT="Also: TimeAnchor ist &#xfc;berfl&#xfc;ssig">
<icon BUILTIN="yes"/>
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node CREATED="1681169265752" ID="ID_388188594" MODIFIED="1681169268100" TEXT="JobTicket">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681169270184" ID="ID_778864690" MODIFIED="1681169283728" TEXT="die schon gecodete Logik sieht sehr nach Skizze aus">
<linktarget COLOR="#cc608f" DESTINATION="ID_778864690" ENDARROW="Default" ENDINCLINATION="-105;0;" ID="Arrow_ID_1647546023" SOURCE="ID_380471864" STARTARROW="None" STARTINCLINATION="-62;-87;"/>
@ -69565,6 +69610,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685227587042" ID="ID_1506519459" MODIFIED="1685227597731" TEXT="EngineConfig">
<icon BUILTIN="messagebox_warning"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685227599324" ID="ID_996861061" MODIFIED="1685227641903" TEXT="Timings verwenden einen Singleton-Zugang">
<linktarget COLOR="#b03e6a" DESTINATION="ID_996861061" ENDARROW="Default" ENDINCLINATION="1914;0;" ID="Arrow_ID_280066938" SOURCE="ID_978050958" STARTARROW="None" STARTINCLINATION="202;-9;"/>
<icon BUILTIN="stop-sign"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685227615700" ID="ID_233202097" MODIFIED="1685227641889" TEXT="sollte besser in die RenderEnvironmentClosure">
@ -73083,9 +73129,99 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742836995" ID="ID_456677168" MODIFIED="1684878195489" TEXT="using a frame step as base tick">
<icon BUILTIN="full-2"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685063204038" ID="ID_1320162919" MODIFIED="1685063213261" TEXT="Vorarbeit: Timings_test">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685063204038" ID="ID_1320162919" MODIFIED="1685401869753" TEXT="Vorarbeit">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685063216695" ID="ID_918094283" MODIFIED="1685063243124" TEXT="ich bin immer wieder verwirrt...">
<node CREATED="1685396470984" ID="ID_977131570" MODIFIED="1685396475818" TEXT="Grunds&#xe4;tzliches...">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685403171015" ID="ID_1491439076" MODIFIED="1685403230708" TEXT="der Code sieht konfus aus">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...was auf eine Verwirrung in den Konzepten und Begriffen hindeutet (die ich schon seit Tagen vermute, aber noch nicht recht fassen kann)
</p>
</body>
</html></richcontent>
<icon BUILTIN="closed"/>
</node>
<node CREATED="1685396476863" ID="ID_639678188" MODIFIED="1685399823940" TEXT="die verschiedenen Zeiten sind verwirrend">
<arrowlink COLOR="#3048bc" DESTINATION="ID_334635354" ENDARROW="Default" ENDINCLINATION="-699;-102;" ID="Arrow_ID_1276385023" STARTARROW="None" STARTINCLINATION="-673;45;"/>
<icon BUILTIN="smiley-neutral"/>
<node CREATED="1685399857119" ID="ID_1465166407" MODIFIED="1685401807863" TEXT="mehrfach kaskadiert">
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1685399869137" ID="ID_1340639570" MODIFIED="1685399872381" TEXT="TimeAnchor">
<node CREATED="1685399887711" ID="ID_1101109058" MODIFIED="1685399892290" TEXT="anchorPoint">
<node CREATED="1685399911211" ID="ID_1078648686" MODIFIED="1685399915129" TEXT="Frame-Nr"/>
<node CREATED="1685399915763" ID="ID_1286626168" MODIFIED="1685399941235" TEXT="relativ zur &#x201e;absoluten&#x201c; nominellen Zeitskala"/>
<node CREATED="1685399944455" ID="ID_556515153" MODIFIED="1685399962428">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
also relativ zum Ursprung des Time-Grid <i>dieser Timeline</i>
</p>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1685401719809" ID="ID_892456481" MODIFIED="1685401724412" TEXT="relatedRealTime">
<node CREATED="1685401730920" ID="ID_1452346847" MODIFIED="1685401741562" TEXT="nominelle Zeit zur Frame-Nr"/>
<node CREATED="1685401764875" ID="ID_1929447704" MODIFIED="1685401777485" TEXT="verkn&#xfc;pft mit der Wall-Clock-Zeitachse"/>
</node>
</node>
</node>
<node CREATED="1685403241929" ID="ID_1075266324" MODIFIED="1685403315041" TEXT="&#xbb;Deadline&#xab; und &#xbb;realTime&#xab; sind vermischt">
<arrowlink COLOR="#ff292c" DESTINATION="ID_1618141786" ENDARROW="Default" ENDINCLINATION="402;21;" ID="Arrow_ID_97219015" STARTARROW="None" STARTINCLINATION="250;-324;"/>
<icon BUILTIN="idea"/>
<node CREATED="1685403382547" ID="ID_1490411843" MODIFIED="1685403437934" TEXT="der Code ist zwar logisch korrekt aber inhaltlich sinnlos">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...deshalb kapiere ich ihn immer nicht
</p>
<p>
...dann lese ich ihn einzeln durch, und alles sieht &#8222;richtig&#8220; aus...
</p>
</body>
</html></richcontent>
<icon BUILTIN="smiley-angry"/>
</node>
<node CREATED="1685403505076" ID="ID_1411221122" MODIFIED="1685403562528" TEXT="der TimeAnchor wurde mit Proze&#xdf;-Belangen aufgeladen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...weil ich erst mal einen Test schreiben wollte, und sonst noch keinerlei tragende Strukturen hatte
</p>
</body>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685403577421" ID="ID_1838234667" MODIFIED="1685403609231">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
&#10233; alles mit <i>Latency </i>und <i>Deadline </i>mu&#223; weg
</p>
</body>
</html></richcontent>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1685401871210" ID="ID_1279877312" MODIFIED="1685401884954" TEXT="Timings_test">
<node CREATED="1685063216695" ID="ID_918094283" MODIFIED="1685401873636" TEXT="ich bin immer wieder verwirrt...">
<richcontent TYPE="NOTE"><html>
<head>
@ -73106,12 +73242,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685063128431" ID="ID_1958871740" MODIFIED="1685063140918" TEXT="Startpunkt gewinnen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685063142277" ID="ID_1900307953" MODIFIED="1685063194220" TEXT="Problem: mu&#xdf; die Frame-Nummer an diese Stelle bekommen">
<arrowlink COLOR="#fb1618" DESTINATION="ID_548686360" ENDARROW="Default" ENDINCLINATION="-27;-313;" ID="Arrow_ID_567963048" STARTARROW="None" STARTINCLINATION="-36;126;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1685231891079" ID="ID_260441580" MODIFIED="1685231911607" TEXT="Rolle des Start-Punktes (TimeAnchor) kl&#xe4;ren">
<icon BUILTIN="yes"/>
<node CREATED="1685231941823" ID="ID_1623940961" MODIFIED="1685231953912" TEXT="verankert jeden Planning-Chunk erneut">
@ -73126,7 +73259,73 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1685236006596" ID="ID_844227051" MODIFIED="1685236120369" TEXT="sonst &#x27f9; aktuelle Zeit + Puffer f&#xfc;r Latency"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1685063142277" ID="ID_1900307953" MODIFIED="1685406733269" TEXT="Problem: mu&#xdf; die Frame-Nummer an diese Stelle bekommen">
<arrowlink COLOR="#fb1618" DESTINATION="ID_548686360" ENDARROW="Default" ENDINCLINATION="-59;-351;" ID="Arrow_ID_567963048" STARTARROW="None" STARTINCLINATION="-369;18;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1685231918246" ID="ID_1408660753" MODIFIED="1685231930041" TEXT="stellt zugleich den Link zur Wall-Clock-Time her"/>
<node CREATED="1685406699651" ID="ID_789896275" MODIFIED="1685406708225" TEXT="das machen aber die Timings auch bereits"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1685406743623" ID="ID_1294162294" MODIFIED="1685406767041" TEXT="TimeAnchor ist ohne sinnvollen Gehalt">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
<icon BUILTIN="stop-sign"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1685369565772" ID="ID_1409610431" MODIFIED="1685406829731" TEXT="der TimeAnchor selber bestimmt das">
<icon BUILTIN="button_cancel"/>
<node CREATED="1685369583234" ID="ID_173951952" MODIFIED="1685369590725" TEXT="implementiert unter R&#xfc;ckgriff auf die Timings">
<node CREATED="1685369618821" ID="ID_591055660" MODIFIED="1685369635383" TEXT="Timings::establishNextPlanningChunkStart (oldAnchorFrame)"/>
<node CREATED="1685369819711" ID="ID_92215727" MODIFIED="1685369839386" TEXT="dort findet nur Aufruf von Grid-API-Funktionen statt">
<icon BUILTIN="idea"/>
</node>
<node CREATED="1685369847871" ID="ID_962123040" MODIFIED="1685369878551" TEXT="und verwendet Timings::getPlanningChunkDuration()">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1685369901303" ID="ID_437509684" MODIFIED="1685369913102" TEXT="push/pull und Locking beachten">
<icon BUILTIN="clanbomber"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685369887513" ID="ID_978050958" MODIFIED="1685406802098" TEXT="Problematik: dynamische Updates von Engine-Werten">
<arrowlink COLOR="#b03e6a" DESTINATION="ID_996861061" ENDARROW="Default" ENDINCLINATION="1914;0;" ID="Arrow_ID_280066938" STARTARROW="None" STARTINCLINATION="202;-9;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
</node>
<node COLOR="#5b280f" CREATED="1685369987788" ID="ID_920255984" MODIFIED="1685406837547" TEXT="&#xdc;berpr&#xfc;fen: Quantisierung logisch korrekt?">
<icon BUILTIN="help"/>
<icon BUILTIN="button_cancel"/>
<node CREATED="1685370021456" ID="ID_1840609510" MODIFIED="1685370045718" TEXT="Spezialfall: wenn der n&#xe4;chste Frame exakt getroffen wird">
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685370055315" ID="ID_1311898937" MODIFIED="1685406806410" TEXT="generelle Policy in Lumiera: auf den vorherigen Frame abrunden">
<icon BUILTIN="yes"/>
</node>
</node>
<node COLOR="#5b280f" CREATED="1685401941899" ID="ID_36079260" MODIFIED="1685406843234" TEXT="API festlegen">
<icon BUILTIN="button_cancel"/>
<node CREATED="1685401954481" ID="ID_807804418" MODIFIED="1685402029862">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
bisher: <font face="Monospaced" size="2" color="#7b2b47">FrameCnt</font><font face="Monospaced" size="2">&#160;</font><font face="Monospaced" size="2" color="#cc2727">getNextAnchorPoint()</font>
</p>
</body>
</html></richcontent>
<icon BUILTIN="info"/>
</node>
<node CREATED="1685406846904" ID="ID_923084245" MODIFIED="1685406864116" TEXT="sollte den TImeAnchor inkrementell weitersetzen...?">
<icon BUILTIN="button_cancel"/>
</node>
</node>
</node>
<node CREATED="1685406878775" ID="ID_143543979" MODIFIED="1685406890912" TEXT="Nein: alles komplett &#xfc;berfl&#xfc;ssig">
<icon BUILTIN="idea"/>
<icon BUILTIN="yes"/>
<node CREATED="1685406892909" ID="ID_877192337" MODIFIED="1685406903491" TEXT="wir z&#xe4;hlen einfach die Frame-Nummer hoch und gut is"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685406904249" ID="ID_1903725712" MODIFIED="1685406939765" TEXT="aus dem TimeAnchor wird eine einfache Variable chunkStart">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685066463050" ID="ID_1613334312" MODIFIED="1685066472930" TEXT="Mock-Setup schaffen">
@ -73291,7 +73490,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</p>
</body>
</html></richcontent>
<linktarget COLOR="#fb1618" DESTINATION="ID_548686360" ENDARROW="Default" ENDINCLINATION="-27;-313;" ID="Arrow_ID_567963048" SOURCE="ID_1900307953" STARTARROW="None" STARTINCLINATION="-36;126;"/>
<linktarget COLOR="#fb1618" DESTINATION="ID_548686360" ENDARROW="Default" ENDINCLINATION="-59;-351;" ID="Arrow_ID_567963048" SOURCE="ID_1900307953" STARTARROW="None" STARTINCLINATION="-369;18;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1685062714666" ID="ID_1331730136" MODIFIED="1685062746213" TEXT="bisher habe ich mit der InvocationInstaceID &quot;getrickst&quot;">
<icon BUILTIN="info"/>
@ -74079,6 +74278,44 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="hourglass"/>
</node>
</node>
<node CREATED="1685399667668" ID="ID_463573092" MODIFIED="1685399687234" TEXT="Begriffe">
<node CREATED="1685399688969" ID="ID_334635354" MODIFIED="1685399823941" TEXT="Arten von Zeiten">
<linktarget COLOR="#3048bc" DESTINATION="ID_334635354" ENDARROW="Default" ENDINCLINATION="-699;-102;" ID="Arrow_ID_1276385023" SOURCE="ID_639678188" STARTARROW="None" STARTINCLINATION="-673;45;"/>
<icon BUILTIN="info"/>
<node CREATED="1685396490909" ID="ID_1811324240" MODIFIED="1685396514990" TEXT="Frame-Zeit &#x2261; &#xbb;nominal time&#xab;"/>
<node CREATED="1685398161904" ID="ID_1260221239" MODIFIED="1685398489680" TEXT="&#xbb;absolute&#xab; &#x27f6; auf die jeweilige Timeline bezogen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...ein eigenartiger Widerspruch, den ich nicht aufl&#246;sen kann...
</p>
<p>
Absolut &#10233; nicht relativ &#10233; nicht explizit auf etwas bezogen &#10233; also implizit auf &#8222;den Nullpunkt&#8220; bezogen &#10233; also relativ zur jeweiligen Timeline
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1685398491390" ID="ID_880596225" MODIFIED="1685398609729" TEXT="&#xbb;realTime&#xab; &#x2261; &#x201e;wall clock time&#x201c; &#x2261; &#xbb;Instant&#xab;"/>
<node CREATED="1685398581508" ID="ID_999222806" MODIFIED="1685398604780">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
&#187;Deadline&#171; ist immer in <i>realTime</i>
</p>
</body>
</html></richcontent>
<node CREATED="1685398620907" ID="ID_454350455" MODIFIED="1685398749007" TEXT="&#xbb;Frame Deadline&#xab; &#x2261; absolute Deadline of delivery"/>
<node CREATED="1685398663573" ID="ID_135003232" MODIFIED="1685398735255" TEXT="&#xbb;Job Deadline&#xab; &#x2261; latest time the Job can be started"/>
<node CREATED="1685398713881" ID="ID_1091261870" MODIFIED="1685398773416" TEXT="&#xbb;Plan Deadline&#xab; &#x2261; latest time to dispatch the calculation plan"/>
</node>
</node>
</node>
<node CREATED="1680563506475" ID="ID_53985081" MODIFIED="1680563509211" TEXT="Interface">
<node CREATED="1681341888374" ID="ID_1288070081" MODIFIED="1681341890674" TEXT="Konzepte">
<node CREATED="1681341891551" ID="ID_1494961491" MODIFIED="1681341894065" TEXT="CalcStream">
@ -74481,12 +74718,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</html></richcontent>
</node>
<node CREATED="1685316553665" ID="ID_1469791" MODIFIED="1685316844661" TEXT="eigentlich m&#xfc;&#xdf;ten zwei oder drei verschiedene Prozess-Arten programmiert werden">
<arrowlink COLOR="#fffac4" DESTINATION="ID_779629114" ENDARROW="Default" ENDINCLINATION="13;-20;" ID="Arrow_ID_1083704754" STARTARROW="None" STARTINCLINATION="-69;0;"/>
<arrowlink COLOR="#ffeac4" DESTINATION="ID_779629114" ENDARROW="Default" ENDINCLINATION="13;-20;" ID="Arrow_ID_1083704754" STARTARROW="None" STARTINCLINATION="-69;0;"/>
<icon BUILTIN="messagebox_warning"/>
</node>
</node>
<node CREATED="1685316762484" ID="ID_779629114" MODIFIED="1685316844661" TEXT="wir nutzen Zeitsteuerung als integrierendes Agens" VSHIFT="18">
<linktarget COLOR="#fffac4" DESTINATION="ID_779629114" ENDARROW="Default" ENDINCLINATION="13;-20;" ID="Arrow_ID_1083704754" SOURCE="ID_1469791" STARTARROW="None" STARTINCLINATION="-69;0;"/>
<arrowlink COLOR="#f9ffd5" DESTINATION="ID_503599380" ENDARROW="Default" ENDINCLINATION="-127;-352;" ID="Arrow_ID_215108045" STARTARROW="None" STARTINCLINATION="-65;91;"/>
<linktarget COLOR="#ffeac4" DESTINATION="ID_779629114" ENDARROW="Default" ENDINCLINATION="13;-20;" ID="Arrow_ID_1083704754" SOURCE="ID_1469791" STARTARROW="None" STARTINCLINATION="-69;0;"/>
<icon BUILTIN="idea"/>
<node CREATED="1685317008821" ID="ID_75624396" MODIFIED="1685317551995" TEXT="den zus&#xe4;tzlichen Overhead m&#xfc;ssen wir durch Parallelisierungs-Gewinn aufwiegen">
<richcontent TYPE="NOTE"><html>
@ -74557,6 +74795,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
<node CREATED="1685320663808" ID="ID_503599380" MODIFIED="1685320675723" TEXT="Struktur-Elemente">
<linktarget COLOR="#f9ffd5" DESTINATION="ID_503599380" ENDARROW="Default" ENDINCLINATION="-127;-352;" ID="Arrow_ID_215108045" SOURCE="ID_779629114" STARTARROW="None" STARTINCLINATION="-65;91;"/>
<node CREATED="1685320702161" ID="ID_1864388669" MODIFIED="1685320717483">
<richcontent TYPE="NODE"><html>
<head>