Job-Planning: new draft - organise the overall planning process

- introduce a new entity: RenderDrive
- it supersedes the CalcPlanCalculation, but is managed by CalcStream
- moreover, the RenderDrive will house a IterTreeExplorer-Pipeline
- define the concerns and relationships more clearly (see Drawing)
- prerequisite to disentangle the Job-planning "mechanics"
This commit is contained in:
Fischlurch 2023-04-17 04:51:38 +02:00
parent bcd2b3d632
commit 25c8579695
18 changed files with 2436 additions and 86 deletions

File diff suppressed because it is too large Load diff

After

Width:  |  Height:  |  Size: 105 KiB

View file

@ -53,10 +53,10 @@ with the *ASCIIDOC* tool and published at the [Lumiera website](http://Lumiera.o
/* ==== Layers ==== */
/** @defgroup backend Backend-Layer
/** @defgroup vault Vault-Layer
*/
/** @defgroup proc Proc-Layer
/** @defgroup steam Steam-Layer
*/
/** @defgroup gui Graphical User Interface
@ -65,23 +65,23 @@ with the *ASCIIDOC* tool and published at the [Lumiera website](http://Lumiera.o
/* ==== Subsystems ==== */
/** @defgroup asset Asset Management
@ingroup proc
@ingroup steam
*/
/** @defgroup session Session
@ingroup proc
@ingroup steam
*/
/** @defgroup player Playback and Render Control
@ingroup proc
@ingroup steam
*/
/** @defgroup engine Render Engine
@ingroup proc
@ingroup vault
*/
/** @defgroup scheduler Scheduler
@ingroup backend
@ingroup vault
*/

View file

@ -23,7 +23,7 @@
/** @file calc-plan-continuation.cpp
** Implementation elements of render process planning.
** @todo a draft created in 2013 and then stalled. This is not obsolete.
** @deprecated 4/2023 »Playback Vertical Slice« -- reworked into the RenderDrive /////////////////////////TICKET #1221
*/

View file

@ -29,7 +29,7 @@
** to the jobs, which perform and update this plan on the go. And in fact, the head of the
** calculation process, the CalcStream, holds onto such a closure to access current planning.
**
** @todo a draft created in 2013 and then stalled. This is not obsolete.
** @deprecated 4/2023 »Playback Vertical Slice« -- reworked into the RenderDrive /////////////////////////TICKET #1221
*/
@ -65,7 +65,7 @@ namespace engine {
* planning process is determined and controlled by the CalcStream owning
* this closure.
*
* @todo 5/13 still WIP -- write type comment
* @deprecated 4/2023 »Playback Vertical Slice« -- reworked into the RenderDrive //////////////////////////TICKET #1221
*/
class CalcPlanContinuation
: public JobClosure

View file

@ -48,7 +48,7 @@
#include "lib/error.hpp"
#include "steam/play/timings.hpp"
#include "steam/play/output-slot.hpp"
#include "steam/engine/calc-plan-continuation.hpp"
#include "steam/engine/render-drive.hpp"
//#include "include/dummy-player-facade.h"
//#include "include/display-facade.h"
//#include "common/instancehandle.hpp"
@ -56,9 +56,10 @@
//
//#include <string>
#include <vector>
#include <memory>
namespace steam {
namespace steam {
namespace engine{
namespace error = lumiera::error;
@ -67,25 +68,11 @@ namespace engine{
// using lumiera::Subsys;
// using lumiera::Display;
// using lumiera::DummyPlayer;
class RenderEnvironment;
/**
* Abstract definition of the environment
* hosting a given render activity (CalcStream).
* Exposes all the operations necessary to adjust the
* runtime behaviour of the render activity, like e.g.
* re-scheduling with modified playback speed. Since the
* CalcStream is an conceptual representation of "the rendering",
* the actual engine implementation is kept opaque this way.
*/
class RenderEnvironmentClosure
{
public:
virtual ~RenderEnvironmentClosure() { } ///< this is an interface
virtual play::Timings& effectiveTimings() =0;
};
@ -108,29 +95,26 @@ namespace engine{
*/
class CalcStream
{
RenderEnvironmentClosure* eng_;
engine::CalcPlanContinuation* plan_;
std::shared_ptr<RenderDrive> drive_;
protected:
CalcStream (RenderEnvironmentClosure& abstractEngine)
: eng_(&abstractEngine)
CalcStream (RenderEnvironment& abstractEngine)
: drive_{}/////////////////////////////////////////////////TODO
{ }
friend class EngineService;
CalcStream
void
sendToOutput (play::DataSink)
{
UNIMPLEMENTED ("set up dispatcher to start calculating and feeding to the given output sink");
return *this;
}
public:
CalcStream()
: eng_(0)
, plan_(0)
: drive_{}
{ }
~CalcStream() { }
@ -138,15 +122,6 @@ namespace engine{
// using standard copy operations
play::Timings const&
getTimings()
{
if (!eng_)
throw error::State ("attempt to get the playback timings "
"of an unconfigured, disabled or halted calculation stream"
,error::LUMIERA_ERROR_LIFECYCLE);
return eng_->effectiveTimings();
}
};

View file

@ -66,11 +66,11 @@ namespace engine{
/** special engine configuration for mock/testing operation.
*/
RenderEnvironmentClosure&
RenderEnvironment&
EngineServiceMock::configureCalculation (ModelPort,Timings,Quality)
{
UNIMPLEMENTED ("represent *this as RenderEnvironmentClosure)");
RenderEnvironmentClosure* todo_fake(0); ////KABOOOM
UNIMPLEMENTED ("represent *this as RenderEnvironment Closure)");
RenderEnvironment* todo_fake(0); ////KABOOOM
return *todo_fake;
}

View file

@ -91,7 +91,7 @@ namespace engine{
protected:
virtual RenderEnvironmentClosure& configureCalculation (ModelPort,Timings,Quality);
virtual RenderEnvironment& configureCalculation (ModelPort,Timings,Quality);
};

View file

@ -23,6 +23,7 @@
/** @file engine-service.cpp
** Implementation parts related to the engine service abstraction
** @warning as of 4/2023 Render-Engine integration work is underway ////////////////////////////////////////TICKET #1233
*/
@ -81,7 +82,7 @@ namespace engine{
OutputConnection& output,
Quality serviceQuality)
{
RenderEnvironmentClosure& renderConfig = configureCalculation (mPort,nominalTimings,serviceQuality);
RenderEnvironment& renderConfig = configureCalculation (mPort,nominalTimings,serviceQuality);
function<CalcStream(play::DataSink)> triggerRenderStart = bind (activateCalculation, _1, ref(renderConfig));
CalcStreams runningCalculations;
@ -111,11 +112,11 @@ namespace engine{
/** @internal build a representation of a single, ongoing calculation effort.
* This "CalcStream" is tied to the actual engine implementation, but only
* through an opaque link, representing this concrete engine as an
* RenderEnvironmentClosure. This enables the created CalcStream to be
* re-configured and adjusted while running.
* engine::RenderEnvironment closure. This enables the created CalcStream
* to be re-configured and adjusted while running.
*/
CalcStream
EngineService::activateCalculation (play::DataSink sink, RenderEnvironmentClosure& engineCallback)
EngineService::activateCalculation (play::DataSink sink, RenderEnvironment& engineCallback)
{
CalcStream calcStream(engineCallback);
calcStream.sendToOutput (sink);
@ -132,18 +133,18 @@ namespace engine{
* the individual channel streams linked together for playback or rendering;
* they all share the same media type and quality settings.
* @return an abstracted representation of the specific setup for this render;
* from this point on, this RenderEnvironmentClosure will be the only way
* from this point on, this RenderEnvironment closure will be the only way
* for client code to talk to "the engine". The actual instance of this
* closure is just a handle and can be copied; any CalcStream created
* off this closure will be linked to the same "environment" and be
* tracked and managed for resource usage automatically.
* @note variations and especially mock implementations of the render engine
* might choose to configure internals differently. As long as the
* CalcStream and the embedded RenderEnvironmentClosure are consistent,
* such a specific configuration remains opaque for the user of the
* created render activity
* CalcStream and the embedded RenderEnvironment are consistent,
* such a specific configuration remains opaque for the user of
* the created render activity
*/
RenderEnvironmentClosure&
RenderEnvironment&
EngineService::configureCalculation (ModelPort mPort,
Timings nominalTimings,
Quality serviceQuality)
@ -151,7 +152,7 @@ namespace engine{
UNIMPLEMENTED ("Access and wire to the Scheduler-frontend. "
"Then access the Segmentation and invoke a builder function for a suitable dispatcher table. "
"Package all of this into a suitable RenderEnvironementClosure subclass.");
RenderEnvironmentClosure* todo_fake(0); ////KABOOOM
RenderEnvironment* todo_fake(0); ////KABOOOM
return *todo_fake;
}

View file

@ -40,6 +40,8 @@
**
** @ingroup engine
** @todo draft from 2013, stalled, but still relevant and to be continued eventually
** @warning as of 4/2023 Render-Engine integration work is underway ////////////////////////////////////////TICKET #1233
**
** @see EngineInterface_test
** @see CalcStream_test
** @see steam::play::PlayerService
@ -69,7 +71,7 @@
//#include <string>
namespace steam {
namespace steam {
namespace engine{
// using std::string;
@ -158,7 +160,7 @@ namespace engine{
protected:
virtual RenderEnvironmentClosure& configureCalculation (ModelPort,Timings,Quality);
virtual RenderEnvironment& configureCalculation (ModelPort,Timings,Quality);
void activateTracing();
void disableTracing(); ///< EX_FREE
@ -166,7 +168,7 @@ namespace engine{
friend class EngineDiagnostics;
private:
static CalcStream activateCalculation (play::DataSink, RenderEnvironmentClosure&);
static CalcStream activateCalculation (play::DataSink, RenderEnvironment&);
};

View file

@ -61,6 +61,7 @@ namespace engine {
* There is no reference to any kind of time grid (or similar session internals).
*
* @todo 1/12 WIP-WIP-WIP defining the invocation sequence and render jobs
* @todo 4/23 WIP-WIP-WIP recast the dispatch- and job invocation sequence
*/
struct FrameCoord
{

View file

@ -157,6 +157,8 @@ namespace engine {
,this->point_to_calculate_);
}
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
/** integrate another chain of prerequisites into the current evaluation line.
* Further evaluation will start to visit prerequisites from the new starting point,
* and return to the current evaluation chain later on exhaustion of the side chain.
@ -200,6 +202,8 @@ namespace engine {
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
/**
* iterator, exposing a sequence of JobPlanning elements
*/
@ -314,6 +318,8 @@ namespace engine {
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
#endif /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
/**
* Generate a sequence of starting points for Job planning,
* based on the underlying frame grid. This sequence will be

View file

@ -0,0 +1,113 @@
/*
RenderDrive - repetitively advancing a render calculation stream
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
* *****************************************************/
/** @file render-drive.cpp
** Implementation elements of render process planning.
** @todo 4/2023 »Playback Vertical Slice« -- effort towards first integration of render process ////////////TICKET #1221
*/
#include "steam/engine/render-drive.hpp"
#include "steam/engine/frame-coord.hpp"
#include "steam/engine/job-ticket.hpp"
#include "lib/time/timevalue.hpp"
//#include "lib/frameid.hpp"
//#include "steam/state.hpp"
#include <boost/functional/hash.hpp>
namespace steam {
namespace engine {
/** entry point (interface JobClosure): invoke the concrete job operation.
* In this case, the job operation is responsible for planning a chunk of actual render jobs.
*/
void
RenderDrive::invokeJobOperation (JobParameter parameter)
{
ASSERT (parameter.nominalTime == getTimings().getFrameStartAt (parameter.invoKey.frameNumber));
this->performJobPlanningChunk (parameter.invoKey.frameNumber);
}
void
RenderDrive::signalFailure (JobParameter parameter, JobFailureReason reason)
{
UNIMPLEMENTED ("what needs to be done when a planning continuation cant be invoked?");
}
bool
RenderDrive::verify (Time nominalTime, InvocationInstanceID invoKey) const
{
UNIMPLEMENTED ("the actual meat: advance the render process");
return getTimings().isValid()
&& Time::MIN < nominalTime && nominalTime < Time::MAX
&& nominalTime == getTimings().getFrameStartAt (invoKey.frameNumber);
}
size_t
RenderDrive::hashOfInstance (InvocationInstanceID invoKey) const
{
UNIMPLEMENTED ("the actual meat: advance the render process");
return boost::hash_value (invoKey.frameNumber);
}
Job
RenderDrive::prepareRenderPlanningFrom (FrameCnt startFrame)
{
InvocationInstanceID invoKey;
invoKey.frameNumber = startFrame;
Time nominalPlanningStartTime = getTimings().getFrameStartAt (startFrame);
return Job(*this, invoKey, nominalPlanningStartTime);
}
void
RenderDrive::performJobPlanningChunk(FrameCnt nextStartFrame)
{
UNIMPLEMENTED ("the actual meat: advance the render process");
}
Job
RenderDrive::buildFollowUpJobFrom (TimeAnchor const& refPoint)
{
return this->prepareRenderPlanningFrom(
refPoint.getNextAnchorPoint());
}
}} // namespace engine

View file

@ -0,0 +1,155 @@
/*
RENDER-DRIVE.hpp - repetitively advancing a render calculation stream
Copyright (C) Lumiera.org
2023, Hermann Vosseler <Ichthyostega@web.de>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of
the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/** @file render-drive.hpp
** The active core within a CalcStream, causing the render mechanism to re-trigger repeatedly.
** Rendering is seen as an open-ended, ongoing process, and thus the management and planning
** of the render process itself is performed chunk wise and embedded into the other rendering
** calculations. The _"rendering-as-it-is-planned-right-now"_ can be represented as a closure
** to the jobs, which perform and update this plan on the go. And in fact, the head of the
** calculation process, the CalcStream, maintains this closure instance, as parametrised
** with the appropriate configuration for the specific playback/render process underway.
** Enclosed into this instance lives the actual job planning pipeline, connected at the
** rear to the dispatcher and thus to the fixture and the low-level model
**
** @todo 4/2023 »Playback Vertical Slice« -- effort towards first integration of render process ////////////TICKET #1221
*/
#ifndef STEAM_ENGINE_RENDER_DRIVE_H
#define STEAM_ENGINE_RENDER_DRIVE_H
#include "steam/common.hpp"
#include "steam/mobject/model-port.hpp"
#include "steam/engine/time-anchor.hpp"
#include "steam/engine/dispatcher.hpp"
#include "steam/play/timings.hpp"
#include "vault/engine/job.h"
#include "lib/nocopy.hpp"
namespace steam {
namespace engine {
// using std::function;
using vault::engine::JobParameter;
using vault::engine::JobClosure;
using mobject::ModelPort;
// using lib::time::TimeSpan;
// using lib::time::FSecs;
// using lib::time::Time;
using lib::time::FrameCnt;
/**
* Abstract definition of the environment
* hosting a given render activity (CalcStream).
* Exposes all the operations necessary to adjust the
* runtime behaviour of the render activity, like e.g.
* re-scheduling with modified playback speed. Since the
* CalcStream is an conceptual representation of "the rendering",
* the actual engine implementation is kept opaque this way.
*/
class RenderEnvironment
{
public:
virtual ~RenderEnvironment() { } ///< this is an interface
virtual play::Timings& effectiveTimings() =0;
virtual Dispatcher& getDispatcher() =0;
};
/**
* The active drive to keep the render process going -- implemented as a
* job planning job, that repeatedly triggers itself again for the next
* planning chunk. The RenderDrive is created and owned by the corresponding
* CalcStream, and operates the job planning pipeline, backed by the dispatcher.
*
* @todo 4/23 early DRAFT -- find out what this does and write type comment
*/
class RenderDrive
: public JobClosure
, util::NonCopyable
{
RenderEnvironment& engine_;
// const ModelPort modelPort_;
// const uint channel_;
/* === JobClosure Interface === */
JobKind
getJobKind() const
{
return META_JOB;
}
bool verify (Time, InvocationInstanceID) const;
size_t hashOfInstance (InvocationInstanceID) const;
void invokeJobOperation (JobParameter);
void signalFailure (JobParameter, JobFailureReason);
public:
/**
* @todo
*/
RenderDrive (RenderEnvironment& renderEnvironment
,ModelPort port, uint chan)
: engine_{renderEnvironment}
{ }
play::Timings const&
getTimings() const
{
return engine_.effectiveTimings();
}
/** create the "start trigger job"
* Scheduling this job will effectively get a calculation stream
* into active processing, since it causes the first chunk of job planning
* plus the automated scheduling of follow-up planning jobs. The relation
* to real (wall clock) time will be established when the returned job
* is actually invoked
* @param startFrame where to begin rendering, relative to the nominal
* time grid implicitly given by the ModelPort to be pulled
*/
Job prepareRenderPlanningFrom (FrameCnt startFrame);
private:
void performJobPlanningChunk(FrameCnt nextStartFrame);
Job buildFollowUpJobFrom (TimeAnchor const& refPoint);
};
}} // namespace steam::engine
#endif /*STEAM_ENGINE_RENDER_DRIVE_H*/

View file

@ -80,7 +80,7 @@ namespace mobject {
/**
* Handle denoting a point within the model,
* Handle designating a point within the model,
* where actually output data can be pulled.
* ModelPort is a frontend to be used by clients.
* These ModelPort handle objects may be copied and stored

View file

@ -99,7 +99,7 @@ namespace play {
public:
PlaybackUrgency playbackUrgency;
boost::rational<FrameCnt> playbackSpeed; /////////////TICKET #902 we need a more generic representation for variable speed playback
Time scheduledDelivery;
Time scheduledDelivery; ///< a wall clock time corresponding to the Grid's origin. Can be Time::Never (=not time bound)
Duration outputLatency;
explicit

BIN
wiki/draw/Play.Dispatch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View file

@ -2525,14 +2525,14 @@ Additionally, they may be used for resource management purposes by embedding a r
#* one OpenGL Dataframe could contain raw texture data (but I am lacking expertise for this topic)
</pre>
</div>
<div title="FrameDispatcher" modifier="Ichthyostega" created="201105222330" modified="201712101920" tags="def Rendering" changecount="10">
<div title="FrameDispatcher" modifier="Ichthyostega" created="201105222330" modified="202304170244" tags="def Rendering" changecount="18">
<pre>An entity within the RenderEngine, responsible for translating a logical [[calculation stream|CalcStream]] (corresponding to a PlayProcess) into a sequence of individual RenderJob entries, which can then be handed over to the [[Scheduler]]. Performing this operation involves a special application of [[time quantisation|TimeQuant]]: after establishing a suitable starting point, a typically contiguous series of frame numbers need to be generated, together with the time coordinates for each of those frames.
The dispatcher works together with the job ticket(s) and the scheduler; actually these are the //core abstractions//&amp;nbsp; the process of ''job planning'' relies on. While the actual scheduler implementation lives within the Vault, the job tickets and the dispatcher are located within the [[Segmentation]], which is the backbone of the [[low-level model|LowLevelModel]]. More specifically, the dispatcher interface is //implemented//&amp;nbsp; by a set of &amp;rarr; [[dispatcher tables|DispatcherTables]] within the segmentation.
{{red{stalled since 2014}}} -- development on this (important) topic has been postponed. Moreover, some rough edges remain within the Design &amp;rarr; see [[some notes...|AboutMonads]]
!defining the dispatcher interface
!Collaborations
The purpose of this interface is to support the planning of new jobs, for a given CalcStream. From time to time, a chunk of new RenderJob entries will be prepared for the [[Scheduler]]. Each job knows his frame number and the actual ProcNode to operate. So, to start planning jobs, we need to translate time &amp;rarr; frame number &amp;rarr; segment &amp;rarr; real exit node.
!!!Invocation situation
@ -2555,7 +2555,7 @@ The frame dispatch step joins and combines multiple time axes. Through the proce
These complex relationships are reflected in the invocation structure leading to an individual frame job. The [[calculation stream|CalcStream]] provides the [[render/playback timings|Timings]], while the actual implementation of the dispatcher, backed by the [[Fixture]] and thus linked to the session models, gets to relate the effective nominal time, the frame number, the exit node and the //processing function.//
!!!controlling the planning process
New render jobs are planned as an ongoing process, proceeding in chunks of evaluation. Typically, to calculate a single frame, several jobs are necessary -- to find out which and how, we'll have to investigate the model structures corresponding to this frame, resulting in a tree of prerequisites. Basically, the planning for each frame is seeded by establishing the nominal time position, in accordance to the current [[mode of playback|NonLinearPlayback]]. Conducted by the [[play controller|PlayController]], there is a strategy to define the precise way of spacing and sequence of frames to be calculated -- yet for the actual process of evaluating the prerequisites and planning the jobs, those details are irrelevant and hidden behind the dispatcher interface, as is most of the model and context information. The planning operation just produces a sequence of job definitions, which can then be associated with real time (wall clock) deadlines for delivery. The relation between the spacing and progression of the nominal frame time (as controlled by the playback mode) and the actual sequence of deadlines (which is more or less dictated by the output device) is rather loose and established anew for each planning chunk, relying on the ''time anchor''. The latter in turn uses the [[timings record|Timings]] of the [[calculation stream|CalcStream]] currently being planned, and these timings act as a strategy to represent the underlying timing grid and playback modalities.
[&gt;img[Structure of the Fixture|draw/Play.Dispatch.png]]New render jobs are planned as an ongoing process, proceeding in chunks of evaluation. Typically, to calculate a single frame, several jobs are necessary -- to find out which and how, we'll have to investigate the model structures corresponding to this frame, resulting in a tree of prerequisites. Basically, the planning for each frame is seeded by establishing the nominal time position, in accordance to the current [[mode of playback|NonLinearPlayback]]. Conducted by the [[play controller|PlayController]], there is a strategy to define the precise way of spacing and sequence of frames to be calculated -- yet for the actual process of evaluating the prerequisites and planning the jobs, those details are irrelevant and hidden behind the dispatcher interface, as is most of the model and context information. The planning operation just produces a sequence of job definitions, which can then be associated with real time (wall clock) deadlines for delivery. The relation between the spacing and progression of the nominal frame time (as controlled by the playback mode) and the actual sequence of deadlines (which is more or less dictated by the output device) is rather loose and established anew for each planning chunk, relying on the ''time anchor''. The latter in turn uses the [[timings record|Timings]] of the [[calculation stream|CalcStream]] currently being planned, and these timings act as a strategy to represent the underlying timing grid and playback modalities.
While the sequence of frame jobs to be planned is possibly infinite, the actual evaluation is confined to the current planning chunk. When done with planning such a chunk of jobs, an additional ''continuation job'' is included to prepare a re-invocation of the planning function for preparation of the next chunk. Terminating playback is equivalent to not including or not invoking this continuation job. Please note that planning proceeds independently for each [[Feed]] -- in Lumiera the //current playback position//&amp;nbsp; is just a conceptual projection of wall clock time to nominal time, yet there is no such thing like a synchronously proceeding &quot;Playhead&quot;
@ -7095,7 +7095,7 @@ We need to detect attaching and detaching of
* root &amp;harr; [[Fork]]
</pre>
</div>
<div title="Segmentation" modifier="Ichthyostega" created="201012121901" modified="201204150033" tags="def spec Builder">
<div title="Segmentation" modifier="Ichthyostega" created="201012121901" modified="202304162242" tags="def spec Builder" changecount="4">
<pre>//Segmentation of timeline// denotes a data structure and a step in the BuildProcess.
When [[building the fixture|BuildFixture]], ~MObjects -- as handled by their Placements -- are grouped below each timeline using them; Placements are then to be resolved into [[explicit Placements|ExplicitPlacement]], resulting in a single well defined time interval for each object. This allows to cut this effective timeline into slices of constant wiring structure, which are represented through the ''Segmentation Datastructure'', a time axis with segments holding object placements and [[exit nodes|ExitNode]]. &amp;nbsp;&amp;rarr; see [[structure of the Fixture|Fixture]]
* for each Timeline we get a Segmentation
@ -7112,7 +7112,7 @@ When [[building the fixture|BuildFixture]], ~MObjects -- as handled by their Pla
;(2) commit stage
: -- after the build process(es) are completed, the new fixture gets ''committed'', thus becoming the officially valid state to be rendered. As render processes might be going on in parallel, some kind of locking or barrier is required. It seems advisable to make the change into a single atomic hot-swap. Meaning we'd get a single access point to be protected. But there is another twist: We need to find out which render processes to cancel and restart, to pick up the changes introduced by this build process -- which might include adding and deleting of timelines as a whole, and any conceivable change to the segmentation grid. Because of the highly dynamic nature of the placements, on the other hand it isn't viable to expect the high-level model to provide this information. Thus we need to find out about a ''change coverage'' at this point. We might expand on that idea to //prune any new segments which aren't changed.// This way, only a write barrier would be necessary on switching the actually changed segments, and any render processes touching these would be //tainted.// Old allocations could be released after all tainted processes are known to be terminated.
;(3) rendering use
:Each play/render process employs a ''frame dispatch step'' to get the right exit node for pulling a given frame (&amp;rarr; [[Dispatcher|FrameDispatcher]]). From there on, the process proceeds into the [[processing nodes|ProcNode]], interleaved with Vault/scheduler actions due to splitting into individually scheduled jobs. The storage of these processing nodes and accompanying wiring descriptors is hooked up behind the individual segments, by sharing a common {{{AllocationCluster}}}. Yet the calculation of individual frames also depends on ''parameters'' and especially ''automation'' linked with objects in the high-level model. It is likely that there might be some sharing or some kind of additional communication interface, as the intention was to allow ''live changes'' to automated values. &lt;br/&gt;{{red{WIP 12/2010}}} details need to be worked out. &amp;rarr; [[parameter wiring concept|Wiring]]
:Each play/render process employs a ''frame dispatch step'' to get the right exit node for pulling a given frame (&amp;rarr; [[Dispatcher|FrameDispatcher]]). Planning appropriate [[render jobs|RenderJob]] involves support by the JobTicket for each Segment and port, which provides //a blueprint for rendering and connectivity.// From there on, the calculation process -- transmitted through [[Scheduler activity|RenderActivity]] -- proceeds into the [[processing nodes|ProcNode]]. The storage of these processing nodes and accompanying wiring descriptors is hooked up behind the individual segments, by sharing a common {{{AllocationCluster}}}. Yet the calculation of individual frames also depends on ''parameters'' and especially ''automation'' linked with objects in the high-level model. It is likely that there might be some sharing or some kind of additional communication interface, as the intention was to allow ''live changes'' to automated values. &lt;br/&gt;{{red{WIP 4/2023}}} details about to be elaborated &amp;rarr; PlaybackVerticalSlice
!!!observations
* Storage and initialisation for explicit placements is an issue. We should strive at making that inline as much as possible.
* the overall segmentation emerges from a sorting of time points, which are start points of explicit placements

View file

@ -68383,8 +68383,39 @@
<node CREATED="1448314932726" ID="ID_669869188" MODIFIED="1557498707237" POSITION="right" TEXT="Render">
<icon BUILTIN="stop"/>
<node CREATED="1512923568305" ID="ID_1329323311" MODIFIED="1557498707237" TEXT="Player">
<node CREATED="1512923658341" ID="ID_1855109590" MODIFIED="1557498707237" TEXT="Interface"/>
<node CREATED="1512923661892" ID="ID_1580804608" MODIFIED="1557498707237" TEXT="Control"/>
<node CREATED="1512923658341" ID="ID_1855109590" MODIFIED="1557498707237" TEXT="Interface">
<node CREATED="1681597122589" ID="ID_1328094537" MODIFIED="1681597126593" TEXT="Spec">
<node CREATED="1681597127282" ID="ID_761595186" MODIFIED="1681597130528" TEXT="Timings">
<node CREATED="1681597133168" ID="ID_1308926052" MODIFIED="1681597148947">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
Zeitma&#223; f&#252;r <i>diesen </i>Wiedergabevorgang
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1681597167602" ID="ID_205208976" MODIFIED="1681597182099" TEXT="playbackUrgency = {ASAP,NICE,TIMEBOUND}"/>
<node CREATED="1681597212993" ID="ID_615732474" MODIFIED="1681597273762" TEXT="scheduledDelivery(nur TIMEBOUND) &#x2254; &#xbb;wall clock time&#xab; des Grid-Ursprungs"/>
</node>
</node>
</node>
<node CREATED="1512923661892" ID="ID_1580804608" MODIFIED="1557498707237" TEXT="Control">
<node CREATED="1681685173232" ID="ID_1497274477" MODIFIED="1681685179516" TEXT="Play-controller"/>
<node CREATED="1681685180222" ID="ID_1922002466" MODIFIED="1681685183138" TEXT="Play-Process"/>
<node CREATED="1681685183696" ID="ID_453528685" MODIFIED="1681685186032" TEXT="CalcStream">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681685187803" ID="ID_1654025761" MODIFIED="1681685196333" TEXT="Umbau 4/23">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681685197444" ID="ID_1313231227" MODIFIED="1681685335962" TEXT="kann man CalcStream move-only machen?">
<linktarget COLOR="#e0804f" DESTINATION="ID_1313231227" ENDARROW="Default" ENDINCLINATION="2513;164;" ID="Arrow_ID_861540006" SOURCE="ID_439004499" STARTARROW="None" STARTINCLINATION="676;-84;"/>
<icon BUILTIN="help"/>
</node>
</node>
</node>
</node>
<node CREATED="1512923672275" ID="ID_1369059082" MODIFIED="1557498707237" TEXT="Wiring"/>
<node CREATED="1512923682530" ID="ID_1204903801" MODIFIED="1557498707237" TEXT="Planning">
<node CREATED="1512925214070" ID="ID_491842947" MODIFIED="1557498707237" TEXT="1.Entwurf">
@ -68457,7 +68488,7 @@
</html></richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1680568453218" ID="ID_1951039343" MODIFIED="1680568466316" TEXT="was passiert in job-planning.hpp?">
<node COLOR="#435e98" CREATED="1680568453218" FOLDED="true" ID="ID_1951039343" MODIFIED="1681511763512" TEXT="was passiert in job-planning.hpp?">
<icon BUILTIN="help"/>
<node CREATED="1681007533926" ID="ID_282014609" MODIFIED="1681007543121" TEXT="der schrittweise Planungsmechanismus">
<node CREATED="1681007545653" ID="ID_1444648679" MODIFIED="1681007547984" TEXT="gegeben....">
@ -68513,7 +68544,7 @@
<node CREATED="1681077183565" ID="ID_96294471" MODIFIED="1681077188182" TEXT="Referenz auf den Dispatcher"/>
</node>
<node CREATED="1681089094840" ID="ID_573422091" MODIFIED="1681089145775" TEXT="hier steigen wir direkt in die Monaden-Kacke ein">
<arrowlink COLOR="#b03a63" DESTINATION="ID_256520127" ENDARROW="Default" ENDINCLINATION="34;-147;" ID="Arrow_ID_1652427615" STARTARROW="None" STARTINCLINATION="-162;10;"/>
<arrowlink COLOR="#983ab0" DESTINATION="ID_256520127" ENDARROW="Default" ENDINCLINATION="34;-147;" ID="Arrow_ID_1652427615" STARTARROW="None" STARTINCLINATION="-162;10;"/>
</node>
</node>
<node CREATED="1681076854338" ID="ID_137032068" MODIFIED="1681076861563" TEXT="f&#xfc;r jeden Schritt...">
@ -68540,8 +68571,8 @@
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681089112917" ID="ID_256520127" MODIFIED="1681089910511" TEXT="was machen die Monaden hier?">
<linktarget COLOR="#b03a63" DESTINATION="ID_256520127" ENDARROW="Default" ENDINCLINATION="34;-147;" ID="Arrow_ID_1652427615" SOURCE="ID_573422091" STARTARROW="None" STARTINCLINATION="-162;10;"/>
<node COLOR="#435e98" CREATED="1681089112917" ID="ID_256520127" MODIFIED="1681511734896" TEXT="was machen die Monaden hier?">
<linktarget COLOR="#983ab0" DESTINATION="ID_256520127" ENDARROW="Default" ENDINCLINATION="34;-147;" ID="Arrow_ID_1652427615" SOURCE="ID_573422091" STARTARROW="None" STARTINCLINATION="-162;10;"/>
<icon BUILTIN="help"/>
<node CREATED="1681089212896" ID="ID_337268997" MODIFIED="1681170523138" TEXT="JobPlanningSequence">
<linktarget COLOR="#b4597c" DESTINATION="ID_337268997" ENDARROW="Default" ENDINCLINATION="18;60;" ID="Arrow_ID_311262374" SOURCE="ID_1034254567" STARTARROW="None" STARTINCLINATION="-177;-12;"/>
@ -68645,7 +68676,7 @@
<node CREATED="1681090118071" ID="ID_600100783" MODIFIED="1681090127602" TEXT="Ergebnistyp der FlatMap-Operation"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681171685380" ID="ID_1860128661" MODIFIED="1681171722392" TEXT="wann / wie findet die eigentliche Planung(Auswertung) statt?">
<node COLOR="#435e98" CREATED="1681171685380" ID="ID_1860128661" MODIFIED="1681511730984" TEXT="wann / wie findet die eigentliche Planung(Auswertung) statt?">
<icon BUILTIN="help"/>
<node CREATED="1681171733502" ID="ID_433565768" MODIFIED="1681171751420" TEXT="expandPrerequisites(JobPlanning) wird monadisch gebunden (flatMap)"/>
<node CREATED="1681171757291" ID="ID_1142053734" MODIFIED="1681171885232">
@ -68844,28 +68875,31 @@
<icon BUILTIN="yes"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681250556444" ID="ID_1991482624" MODIFIED="1681250575871" TEXT="Grundlegendes Auswertungs-Schema">
<node COLOR="#435e98" CREATED="1681250556444" ID="ID_1991482624" MODIFIED="1681511717857" TEXT="Grundlegendes Auswertungs-Schema">
<icon BUILTIN="yes"/>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681250582708" ID="ID_1884826569" MODIFIED="1681250667138" TEXT="auf welcher Ebene wird die fortschreitende Planung angesetzt?">
<node COLOR="#435e98" CREATED="1681250582708" ID="ID_1884826569" MODIFIED="1681511406548" TEXT="auf welcher Ebene wird die fortschreitende Planung angesetzt?">
<icon BUILTIN="help"/>
<node CREATED="1681250669452" ID="ID_1404510345" MODIFIED="1681424264776" TEXT="dar&#xfc;ber">
<arrowlink COLOR="#68678a" DESTINATION="ID_1399425577" ENDARROW="Default" ENDINCLINATION="-321;0;" ID="Arrow_ID_26789445" STARTARROW="None" STARTINCLINATION="-353;107;"/>
<node CREATED="1681250669452" ID="ID_1404510345" MODIFIED="1681511443549" TEXT="dar&#xfc;ber">
<arrowlink COLOR="#68678a" DESTINATION="ID_1399425577" ENDARROW="Default" ENDINCLINATION="-321;0;" ID="Arrow_ID_26789445" STARTARROW="None" STARTINCLINATION="-435;100;"/>
<icon BUILTIN="forward"/>
<node CREATED="1681250697202" ID="ID_591609787" MODIFIED="1681250718160" TEXT="die Pipeline beschreibt die fortlaufende Job-Planung l&#xfc;ckenlos"/>
<node CREATED="1681250769368" ID="ID_772063728" MODIFIED="1681250784298" TEXT="ein separater Taktgeber ist dar&#xfc;ber gesetzt..."/>
<node CREATED="1681250785294" ID="ID_1717449216" MODIFIED="1681250805743" TEXT="...und entnimmt jeweils einen &#xbb;chunk&#xab; an Planung"/>
</node>
<node CREATED="1681250684195" ID="ID_1446227888" MODIFIED="1681250686359" TEXT="darunter">
<node CREATED="1681250684195" ID="ID_1446227888" MODIFIED="1681511427222" TEXT="darunter">
<icon BUILTIN="button_cancel"/>
<node CREATED="1681250819275" ID="ID_92926923" MODIFIED="1681250835367" TEXT="der &#xbb;chunk&#xab;-Taktgeber ist die Basis der Pipeline"/>
<node CREATED="1681250837199" ID="ID_947581885" MODIFIED="1681250885117" TEXT="jeder Schritt wird einmal monadisch entfaltet &#x27f6; Jobs f&#xfc;r einen &#xbb;chunk&#xab;"/>
<node CREATED="1681250898279" ID="ID_1453593011" MODIFIED="1681250924584" TEXT="der Konsument erkennt das Ende eines Chunk &#x2014; und pflanzt sich dann fort"/>
</node>
<node CREATED="1681250688531" ID="ID_1904669959" MODIFIED="1681250693486" TEXT="separat">
<node CREATED="1681250688531" ID="ID_1904669959" MODIFIED="1681511427227" TEXT="separat">
<icon BUILTIN="button_cancel"/>
<node CREATED="1681250972125" ID="ID_492221110" MODIFIED="1681250991302" TEXT="ein separater Dispatcher-Mechanismus konstruiert f&#xfc;r jeden &#xbb;chunk&#xab; eine Pipeline"/>
<node CREATED="1681251006417" ID="ID_115424466" MODIFIED="1681251032211" TEXT="der Planungs-Job konsumiert und wertet diese aus und generiert Jobs"/>
<node CREATED="1681251047923" ID="ID_1020628588" MODIFIED="1681251058990" TEXT="die Limitierung auf einen Chunk steckt in der Pipeline selber"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1681344133719" ID="ID_642967019" MODIFIED="1681424266741" TEXT="Diskussion">
<node COLOR="#435e98" CREATED="1681344133719" FOLDED="true" ID="ID_642967019" MODIFIED="1681424266741" TEXT="Diskussion">
<icon BUILTIN="info"/>
<node CREATED="1681344155430" ID="ID_1775975727" MODIFIED="1681344193644" TEXT="Separation of Concerns &#x27f9; spricht f&#xfc;r die reine l&#xfc;ckenlose Job-Planung"/>
<node CREATED="1681344197504" ID="ID_1110233377" MODIFIED="1681344469258" TEXT="das wirft das Problem auf: Invariante Time-Anchor &#x2261; alles bis dahin geregelt">
@ -68972,6 +69006,7 @@
</node>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1681422192014" ID="ID_686946668" MODIFIED="1681422278056" TEXT="&#x27f9; Verhalten und Benachrichtigungen planen &#x2014; ohne Dependencies explizit zu repr&#xe4;sentieren">
<arrowlink COLOR="#7c2e36" DESTINATION="ID_964028347" ENDARROW="Default" ENDINCLINATION="1221;-42;" ID="Arrow_ID_727391713" STARTARROW="None" STARTINCLINATION="-29;337;"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
</node>
@ -69013,7 +69048,7 @@
<node CREATED="1681423752401" ID="ID_1703609923" MODIFIED="1681423762827" TEXT="Fazit">
<icon BUILTIN="forward"/>
<node CREATED="1681423765518" ID="ID_1399425577" MODIFIED="1681424264776" TEXT="wir k&#xf6;nnen komplett trennen und die Pipeline ist nur noch die reine Planung">
<linktarget COLOR="#68678a" DESTINATION="ID_1399425577" ENDARROW="Default" ENDINCLINATION="-321;0;" ID="Arrow_ID_26789445" SOURCE="ID_1404510345" STARTARROW="None" STARTINCLINATION="-353;107;"/>
<linktarget COLOR="#68678a" DESTINATION="ID_1399425577" ENDARROW="Default" ENDINCLINATION="-321;0;" ID="Arrow_ID_26789445" SOURCE="ID_1404510345" STARTARROW="None" STARTINCLINATION="-435;100;"/>
</node>
<node CREATED="1681423785083" ID="ID_83395390" MODIFIED="1681423811754" TEXT="das JobPlanning mu&#xdf; ein Zeitfenster sichtbar machen; das gen&#xfc;gt zur Planungs-Steuerung"/>
<node CREATED="1681423881164" ID="ID_947885657" MODIFIED="1681423903640" TEXT="die Job-Deskriptor-Datenstruktur wird erweitert, so da&#xdf; sie Scheduler-Actions beinhaltet"/>
@ -69126,8 +69161,83 @@
</node>
</node>
</node>
<node CREATED="1681511517424" ID="ID_1109133019" MODIFIED="1681511570233" TEXT="Aufteilung des eigentlichen Planungsvorgangs">
<node CREATED="1681511579310" ID="ID_1531444492" MODIFIED="1681511599329" TEXT="JobTicket stellt on-demand die Dependencies bereit"/>
<node CREATED="1681511631477" ID="ID_972174517" MODIFIED="1681511657301" TEXT="die Planungs-&#xbb;Mechanik&#xab; wird in JobPlanning &#xfc;bersetzt"/>
<node CREATED="1681511601097" ID="ID_964028347" MODIFIED="1681511694671" TEXT="daraus werden aber direkt einzel-Beziehungen f&#xfc;r den Scheduler gebaut">
<linktarget COLOR="#7c2e36" DESTINATION="ID_964028347" ENDARROW="Default" ENDINCLINATION="1221;-42;" ID="Arrow_ID_727391713" SOURCE="ID_686946668" STARTARROW="None" STARTINCLINATION="-29;337;"/>
</node>
<node CREATED="1681513765614" ID="ID_1274319760" MODIFIED="1681515077439" TEXT="Aufbau">
<icon BUILTIN="info"/>
<node CREATED="1681513770238" HGAP="30" ID="ID_1755305963" MODIFIED="1681514318606" TEXT="Play-Service">
<arrowlink COLOR="#5e5972" DESTINATION="ID_80916607" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1602613098" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<node CREATED="1681520404028" ID="ID_139747553" MODIFIED="1681520414735" TEXT="konfiguriert Modus und Timings"/>
<node CREATED="1681520421034" ID="ID_1253264357" MODIFIED="1681520442787" TEXT="verbindet ModelPorts &#x27fc; output-connection"/>
<node CREATED="1681520449253" ID="ID_616433102" MODIFIED="1681520472992" TEXT="resultierende RenderConfig &#x27f9; PlayProcess"/>
</node>
<node CREATED="1681513866097" HGAP="30" ID="ID_80916607" MODIFIED="1681514389653" TEXT="PlayProcess" VSHIFT="-1">
<arrowlink COLOR="#5e5972" DESTINATION="ID_1732223894" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1129120203" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<linktarget COLOR="#5e5972" DESTINATION="ID_80916607" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1602613098" SOURCE="ID_1755305963" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<node CREATED="1681520521181" ID="ID_127137475" MODIFIED="1681520530807" TEXT="verwendet gegebenen Render-Configurator"/>
<node CREATED="1681520531323" ID="ID_741530178" MODIFIED="1681520580039" TEXT="erstellt daraus die Feeds + CalcStreams"/>
</node>
<node CREATED="1681513775661" HGAP="30" ID="ID_1732223894" MODIFIED="1681515122691" TEXT="Engine-Service">
<arrowlink COLOR="#5e5972" DESTINATION="ID_1709285340" ENDARROW="Default" ENDINCLINATION="-55;-7;" ID="Arrow_ID_1166695691" STARTARROW="None" STARTINCLINATION="-42;8;"/>
<linktarget COLOR="#5e5972" DESTINATION="ID_1732223894" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1129120203" SOURCE="ID_80916607" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<node CREATED="1681520606402" ID="ID_833200775" MODIFIED="1681520624991" TEXT="Initiiert CalcStream(s)"/>
<node CREATED="1681520779187" ID="ID_809350382" MODIFIED="1681520811410" TEXT="verdrahtet dazu einen Dispatcher"/>
<node CREATED="1681520822876" ID="ID_4022163" MODIFIED="1681521853518" TEXT="erstellt ein RenderDrive mit Output"/>
</node>
<node CREATED="1681513782908" HGAP="30" ID="ID_1709285340" MODIFIED="1681515121003" TEXT="CalcStream">
<arrowlink COLOR="#5e5972" DESTINATION="ID_1418303343" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1246156345" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<linktarget COLOR="#5e5972" DESTINATION="ID_1709285340" ENDARROW="Default" ENDINCLINATION="-55;-7;" ID="Arrow_ID_1166695691" SOURCE="ID_1732223894" STARTARROW="None" STARTINCLINATION="-42;8;"/>
<node CREATED="1681520869358" ID="ID_248036437" MODIFIED="1681521862197" TEXT="betreibt den RenderDrive"/>
<node CREATED="1681520874613" ID="ID_1197599470" MODIFIED="1681520883624" TEXT="dieser ist intern mit dem Dispatcher verdrahtet"/>
</node>
<node CREATED="1681513790253" HGAP="30" ID="ID_1418303343" MODIFIED="1681515151463" TEXT="Dispatcher">
<arrowlink COLOR="#5e5972" DESTINATION="ID_786643460" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_876462297" STARTARROW="None" STARTINCLINATION="-29;7;"/>
<linktarget COLOR="#5e5972" DESTINATION="ID_1418303343" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1246156345" SOURCE="ID_1709285340" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<node CREATED="1681520888910" ID="ID_1891724948" MODIFIED="1681520896702" TEXT="ist angesiedelt in der Fixture"/>
<node CREATED="1681520912952" ID="ID_1717997829" MODIFIED="1681520920398" TEXT="bietet Anbindung an ein Frame-Grid"/>
<node CREATED="1681520921575" ID="ID_1652151815" MODIFIED="1681520933542" TEXT="bietet Anbindung an die JobTicket(s)"/>
</node>
<node CREATED="1681513796795" HGAP="30" ID="ID_786643460" MODIFIED="1681521871090" TEXT="RenderDrive">
<arrowlink COLOR="#5e5972" DESTINATION="ID_947997771" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_364168275" STARTARROW="None" STARTINCLINATION="-24;5;"/>
<linktarget COLOR="#5e5972" DESTINATION="ID_786643460" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_876462297" SOURCE="ID_1418303343" STARTARROW="None" STARTINCLINATION="-29;7;"/>
<node CREATED="1681520948109" ID="ID_1974741811" MODIFIED="1681520958397" TEXT="der aktive Nutzer des Dispatcher-Interfaces"/>
<node CREATED="1681520997813" ID="ID_1498779054" MODIFIED="1681521034522" TEXT="re-aktiviert sich fortlaufend selbst"/>
<node CREATED="1681521035833" ID="ID_744901458" MODIFIED="1681521051722" TEXT="ist verdrahtet mit der EngineFacade"/>
<node CREATED="1681521090001" ID="ID_1206046554" MODIFIED="1681521101922" TEXT="erstellt und betreibt die JobPlanning-Pipeline"/>
</node>
<node CREATED="1681513815536" HGAP="30" ID="ID_947997771" MODIFIED="1681515143216" TEXT="JobPlanning">
<arrowlink COLOR="#5e5972" DESTINATION="ID_839385817" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1889540359" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<linktarget COLOR="#5e5972" DESTINATION="ID_947997771" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_364168275" SOURCE="ID_786643460" STARTARROW="None" STARTINCLINATION="-24;5;"/>
<node CREATED="1681521107332" ID="ID_764418758" MODIFIED="1681521118625" TEXT="konkrete StateCore mit allen aktiven Verdrahtungen"/>
<node CREATED="1681521122833" ID="ID_479512654" MODIFIED="1681521129047" TEXT="wird wie ein Cursor navigiert"/>
<node CREATED="1681521246771" ID="ID_1361044565" MODIFIED="1681521267392" TEXT="bewegt sich auf Basis von JobTicket-Konfigurationen"/>
<node CREATED="1681521294153" ID="ID_718588107" MODIFIED="1681521306565" TEXT="Mittel der Bewegung ist der JobTIcket::ExplorationState"/>
</node>
<node CREATED="1681513818806" HGAP="30" ID="ID_839385817" MODIFIED="1681514365078" TEXT="JobTicket">
<linktarget COLOR="#5e5972" DESTINATION="ID_839385817" ENDARROW="Default" ENDINCLINATION="-60;-5;" ID="Arrow_ID_1889540359" SOURCE="ID_947997771" STARTARROW="None" STARTINCLINATION="-23;5;"/>
<node CREATED="1681521333950" ID="ID_1882410873" MODIFIED="1681521341316" TEXT="ist ein passiver Bauplan"/>
<node CREATED="1681521341799" ID="ID_1831867258" MODIFIED="1681521349882" TEXT="wird on-demand konkretisiert"/>
<node CREATED="1681521357484" ID="ID_633522131" MODIFIED="1681521366470" TEXT="kolaboriert mit einem aktiven ExplorationState"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1681168811429" ID="ID_72728251" MODIFIED="1681168821401" TEXT="Aufr&#xe4;um-Arbeiten">
<icon BUILTIN="bell"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681519830697" ID="ID_1168919012" MODIFIED="1681519846021" TEXT="Nomenklatur unscharf">
<icon BUILTIN="messagebox_warning"/>
<node CREATED="1681519851664" ID="ID_1426982855" MODIFIED="1681519854742" TEXT="Engine-Service">
<node CREATED="1681519855695" ID="ID_1479404578" MODIFIED="1681519922674" TEXT="&#x201e;die Renderengine&#x201c; &#x27f7; &#xbb;renderConfig&#xab;"/>
<node CREATED="1681519892562" ID="ID_1833190140" MODIFIED="1681519916866" TEXT="die gleiche Closure hei&#xdf;t aber auch &#xbb;engineCallback&#xab;"/>
</node>
<node CREATED="1681596404095" ID="ID_582234271" MODIFIED="1681596416421" TEXT="&#x201e;nominal time&#x201c;">
<node CREATED="1681596418090" ID="ID_1704128775" MODIFIED="1681596439782" TEXT="die Bedeutung von &#x201e;nominal&#x201c; ist zweifelhaft"/>
<node CREATED="1681596470078" ID="ID_184267509" MODIFIED="1681596498936" TEXT="es ist nicht &#xbb;wall clock time&#xab; &#x2014; aber welche Zeitachse ist es dann?"/>
</node>
</node>
<node CREATED="1681168823213" ID="ID_70139544" MODIFIED="1681168829891" TEXT="LinkedElements">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681168834655" ID="ID_775810104" MODIFIED="1681168886034" TEXT="Kompatibilit&#xe4;t mit STL verifizieren">
<icon BUILTIN="flag-yellow"/>
@ -69247,9 +69357,183 @@
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1681007034731" ID="ID_380471864" MODIFIED="1681007071540" TEXT="Implementierung (dispatcher-table) nur gestubbed">
<icon BUILTIN="bell"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681425423695" ID="ID_1928295133" MODIFIED="1681426106281" TEXT="Reorganisation : CalcDriver verwenden">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681425423695" ID="ID_1928295133" MODIFIED="1681685384037" TEXT="Reorganisation : RenderDrive verwenden">
<linktarget COLOR="#f4fec9" DESTINATION="ID_1928295133" ENDARROW="Default" ENDINCLINATION="-1068;-69;" ID="Arrow_ID_362199078" SOURCE="ID_1888344503" STARTARROW="None" STARTINCLINATION="1381;58;"/>
<linktarget COLOR="#ffe4c9" DESTINATION="ID_1928295133" ENDARROW="Default" ENDINCLINATION="-724;353;" ID="Arrow_ID_1773297165" SOURCE="ID_845968912" STARTARROW="None" STARTINCLINATION="-257;23;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1681597653622" ID="ID_1608883275" MODIFIED="1681597683317" TEXT="Eigenschaften">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...erschlossen aus den bestehenden Strukturen + der neuen Intention
</p>
</body>
</html></richcontent>
<icon BUILTIN="idea"/>
<node COLOR="#5b280f" CREATED="1681597684802" ID="ID_1406063015" MODIFIED="1681683228188" TEXT="kleines Value-Parameter-Objekt">
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1681598452915" ID="ID_573477354" MODIFIED="1681598473868" TEXT="ist der aktive Kern im Calcstream"/>
<node CREATED="1681598513826" ID="ID_1817819165" MODIFIED="1681598599379" TEXT="konstituiert eine Proze&#xdf;-Instanz-Identit&#xe4;t"/>
<node CREATED="1681683275337" ID="ID_1515003010" MODIFIED="1681683297990" TEXT="berwirkt repetitive Selbst-Aktivierung"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681598877348" ID="ID_789757597" MODIFIED="1681683172391" TEXT="zu kl&#xe4;ren">
<icon BUILTIN="yes"/>
<node CREATED="1681598885498" ID="ID_1614960356" MODIFIED="1681598899763" TEXT="Redundanz / &#xdc;berschneidung mit dem CalcStream">
<node CREATED="1681598901535" ID="ID_1286823970" MODIFIED="1681599043639" TEXT="beide haben auff&#xe4;llig &#xe4;hnliche Eigenschaften">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<ul>
<li>
repr&#228;sentieren eine parameter-basierte Instanz-Identit&#228;t
</li>
<li>
sind jeweils voll kopierbare Wertobjekte
</li>
<li>
ben&#246;tigen zudem eine Dependency-Injection
</li>
<li>
gespeichert im Play-Process und damit in der &#187;Prozess-Tafel&#171;
</li>
</ul>
</body>
</html></richcontent>
</node>
<node CREATED="1681599056122" ID="ID_458680948" MODIFIED="1681646642507" TEXT="Unterscheidung aus logischen/semantsichen Gr&#xfc;nden eingef&#xfc;hrt">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<ul>
<li>
Der CalcStream ist eben das, also ein Organisationsmerkmal bzw. die Identit&#228;t eines Teilprozesses
</li>
<li>
Der RenderDrive soll ein zyklischer Mechanismus sein, und als JobFunctor genutzt werden
</li>
</ul>
</body>
</html></richcontent>
</node>
</node>
<node CREATED="1681599191305" ID="ID_1167449829" MODIFIED="1681599208482" TEXT="ben&#xf6;tigte Dependency-Injection ">
<node CREATED="1681599223716" ID="ID_86738790" MODIFIED="1681599346318" TEXT="Timings (impliziert Frame-Grid)"/>
<node CREATED="1681599210089" ID="ID_684433972" MODIFIED="1681599218026" TEXT="Zugang zum Dispatcher"/>
<node CREATED="1681599257945" ID="ID_733064533" MODIFIED="1681599268652" TEXT="Zugang zum Scheduler"/>
</node>
<node CREATED="1681646460442" ID="ID_866977884" MODIFIED="1681646477449" TEXT="multiplicity and usage structure">
<node CREATED="1681646502158" ID="ID_1554914113" MODIFIED="1681646512969" TEXT="die Planungs-Pipeline wird strikt sequentiell bespielt"/>
<node CREATED="1681646532062" ID="ID_1383559792" MODIFIED="1681646551375" TEXT="es gibt nur einen Drive pro CalcStream"/>
<node CREATED="1681646829918" ID="ID_284324155" MODIFIED="1681646835657" TEXT="nur minimlae bewegliche Teile"/>
<node CREATED="1681646836533" ID="ID_1000053188" MODIFIED="1681646846261" TEXT="k&#xf6;nnte im Heap sitzen">
<icon BUILTIN="idea"/>
</node>
</node>
</node>
<node CREATED="1681646866174" ID="ID_246853832" MODIFIED="1681646885323" TEXT="&#x27f9; Struktur">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681646891090" ID="ID_1766076946" MODIFIED="1681683127682" TEXT="non-copyable Heap-alloziert">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681646907319" ID="ID_682236351" MODIFIED="1681683367234" TEXT="wird per smart-ptr gemanaged">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681683094086" ID="ID_1384696790" MODIFIED="1681690034337" TEXT="beherbergt die Planungs-Pipeline">
<arrowlink COLOR="#fd4259" DESTINATION="ID_1735556854" ENDARROW="Default" ENDINCLINATION="20;-71;" ID="Arrow_ID_91051045" STARTARROW="None" STARTINCLINATION="-206;16;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681646916186" ID="ID_806901618" MODIFIED="1681683127683" TEXT="wird erstellt aus">
<icon BUILTIN="flag-yellow"/>
<node CREATED="1681646926897" ID="ID_1301053260" MODIFIED="1681646934364" TEXT="CalcStream-Kenndaten">
<node CREATED="1681646935872" ID="ID_1191393929" MODIFIED="1681646959241" TEXT="Timings&amp;"/>
<node CREATED="1681646946919" ID="ID_1576152420" MODIFIED="1681646966921" TEXT="ModelPort + channel"/>
</node>
<node CREATED="1681646971664" ID="ID_524941672" MODIFIED="1681646985378" TEXT="Environment-Resourcen">
<node CREATED="1681646987124" ID="ID_147954437" MODIFIED="1681647202903" TEXT="bereitgestellt f&#xfc;r Render-Quality">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
ein Play/Renderproze&#223; wird mit einer definiten Quality-of-Service-Strategie aufgebaut; daraus ergibt sich implizit, was ben&#246;tigt wird &#8212; und das ist ein sehr erweiterungsf&#228;higes Konzept: beispielsweise k&#246;nnte man das auf die Verf&#252;gbarkeit gewisser Klassen von Mediendaten erweitern, und es m&#252;&#223;ten somit nicht alle Daten immer direkt greifbar sein
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1681646998860" ID="ID_375377074" MODIFIED="1681647365953" TEXT="garantiert Verf&#xfc;gbarkeit der Ressourcen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
mit der Erstellung eines CalcStream geht die Zusage einher, alle ben&#246;tigten Resourcen tats&#228;chlich im geforderten Ma&#223; verf&#252;gbar zu haben; diese Zusage m&#252;ndet in die &#220;bersetzung in eine abstrahierte RenderEnvironmentClosure; dahinter k&#246;nnen sehr weitreichende Dispositionen verborgen sein, z.B. verteilte Resourcen in einem Render-Cluster/Netwerk-Setup, oder spezielle Hardware
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1681647059168" ID="ID_403042221" MODIFIED="1681647527409" TEXT="steteless + fail-Fast">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
die Zusage ist verbindlich und ohne zeitliche Parametrisierung; sollte eine Resource wegbrechen, so l&#228;&#223;t man sofort den btr. Renderproze&#223; zusammenbrechen und markiert ihn als schadhaft
</p>
</body>
</html></richcontent>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681647531976" ID="ID_438278550" MODIFIED="1681683133041" TEXT="ist selber ein JobFunktor">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#ccb59b" COLOR="#6e2a38" CREATED="1681647578298" ID="ID_328838794" MODIFIED="1681647594158" TEXT="usage-constraints werden grunds&#xe4;tzlich implizit gehandhabt">
<font ITALIC="true" NAME="SansSerif" SIZE="14"/>
<icon BUILTIN="yes"/>
</node>
<node CREATED="1681647609917" ID="ID_1941277429" MODIFIED="1681647652741" TEXT="hat bereits alle operativen Dependencies fertig injiziert"/>
<node CREATED="1681647654353" ID="ID_1685443734" MODIFIED="1681647671007" TEXT="einziger beweglicher Parameter: die Start-Framenummer"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681689961426" ID="ID_1735556854" MODIFIED="1681690034338" TEXT="was wird dann aber aus dem Dispatcher?">
<linktarget COLOR="#fd4259" DESTINATION="ID_1735556854" ENDARROW="Default" ENDINCLINATION="20;-71;" ID="Arrow_ID_91051045" SOURCE="ID_1384696790" STARTARROW="None" STARTINCLINATION="-206;16;"/>
<icon BUILTIN="help"/>
<node CREATED="1681689971576" ID="ID_497495407" MODIFIED="1681690040742">
<richcontent TYPE="NODE"><html>
<head>
</head>
<body>
<p>
dieser wird nun mehr und mehr <i>entkernt....</i>
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1681690048013" ID="ID_800389319" MODIFIED="1681690224577" TEXT="sieht aktuell mehr aus wie eine Facade zur Fixture">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...und das kommt nicht von ungef&#228;hr; schon im Entwurf von 2012 sollte ja&#160;<font color="#331eb5" face="Monospaced">Dispatcher</font>&#160; ein Interface sein, und die aktuelle Implementierung w&#228;re eine&#160; <font color="#331eb5" face="Monospaced">DispatchTable</font>, die direkt in der Fixture angesiedelt und gemanaged w&#252;rde
</p>
</body>
</html></richcontent>
</node>
<node CREATED="1681690087200" ID="ID_14312341" MODIFIED="1681690107889" TEXT="folglich wird dieser Teil komplett entkoppelt von &#xbb;der Engine&#xab;"/>
<node CREATED="1681690260176" ID="ID_1829278703" MODIFIED="1681690292694" TEXT="aber er sollte per DependencyInjection eingebracht werden (&#x2023; EngineService)"/>
</node>
</node>
</node>
@ -69429,10 +69713,25 @@
</html></richcontent>
<icon BUILTIN="idea"/>
</node>
<node CREATED="1681685256388" ID="ID_845968912" MODIFIED="1681685407179" TEXT="besitzt/verwaltet den RenderDrive">
<arrowlink COLOR="#ffe4c9" DESTINATION="ID_1928295133" ENDARROW="Default" ENDINCLINATION="-724;353;" ID="Arrow_ID_1773297165" STARTARROW="None" STARTINCLINATION="-257;23;"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681685287808" ID="ID_439004499" MODIFIED="1681685335962" TEXT="TODO: non-copyable?">
<arrowlink COLOR="#e0804f" DESTINATION="ID_1313231227" ENDARROW="Default" ENDINCLINATION="2513;164;" ID="Arrow_ID_861540006" STARTARROW="None" STARTINCLINATION="676;-84;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node CREATED="1681341894866" ID="ID_94172116" MODIFIED="1681341900624" TEXT="RenderEnvironmentClosure">
<node CREATED="1681341905668" ID="ID_432577558" MODIFIED="1681341915150" TEXT="das ist die &#xbb;abstrahierte Render-Engine&#xab;"/>
</node>
<node CREATED="1681594252245" ID="ID_1719102613" MODIFIED="1681594256245" TEXT="InvocationInstanceID">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681594257143" ID="ID_689625560" MODIFIED="1681594270271" TEXT="Bedeutung kl&#xe4;ren">
<icon BUILTIN="bell"/>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1681594271596" ID="ID_963803611" MODIFIED="1681594283643" TEXT="in welchem Scope ist sie eindeutig?">
<icon BUILTIN="help"/>
</node>
</node>
</node>
</node>
<node CREATED="1680563509728" ID="ID_1883500842" MODIFIED="1680563511567" TEXT="Scheduler">