Job-Planning: extended deadline integration test
- allow to configure the expected job runtime in the test spec - remove link to EngineConfig and hard-wire the engine latency for now ... extended integration testing reveals two further bugs ;-) ... document deadline calculation
This commit is contained in:
parent
1f840730a0
commit
8c78e50730
12 changed files with 236 additions and 153 deletions
|
|
@ -37,6 +37,7 @@
|
|||
#include "lib/time/timevalue.hpp"
|
||||
#include "vault/engine/job.h" //////////////////////////////////////////////////////////////////TICKET #1295 : rather need a way to retrieve a real JobFunctor building block from the ProcNode
|
||||
|
||||
#include <utility>
|
||||
#include <deque>
|
||||
|
||||
using lib::HashVal;
|
||||
|
|
@ -52,6 +53,10 @@ namespace engine {
|
|||
|
||||
using vault::engine::JobFunctor;
|
||||
|
||||
namespace {// hard wired placeholder config....
|
||||
const Duration DUMMY_JOB_RUNTIME{FSecs{1,50}};
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* A top-level point in the render node network where data generation can be driven.
|
||||
|
|
@ -68,23 +73,33 @@ namespace engine {
|
|||
: util::Cloneable
|
||||
{
|
||||
HashVal pipelineIdentity_; //////////////////////////////////////////////////////////TICKET #1293 : Hash-Chaining for invocation-ID... derive from ProcNode wiring
|
||||
ExitNodes prerequisites_; ///////////////////////////////////////////////////////////TICKET #1306 : actual access to low-level-Model (ProcNode)
|
||||
JobFunctor* action_{nullptr}; ////////////////////////////////////////////////////////////TICKET #1295 : link to actual implementation action in low-level-Model
|
||||
Duration runtimeBound_; ///////////////////////////////////////////////////////////TICKET #1283 : integrate with dynamic runtime observation
|
||||
ExitNodes prerequisites_; ////////////////////////////////////////////////////////////TICKET #1306 : actual access to low-level-Model (ProcNode)
|
||||
JobFunctor* action_{nullptr}; /////////////////////////////////////////////////////////////TICKET #1295 : link to actual implementation action in low-level-Model
|
||||
|
||||
public:
|
||||
ExitNode()
|
||||
: pipelineIdentity_{0}
|
||||
, runtimeBound_{DUMMY_JOB_RUNTIME}
|
||||
, prerequisites_{}
|
||||
{ }
|
||||
|
||||
ExitNode (HashVal id
|
||||
,ExitNodes&& prereq =ExitNodes{}
|
||||
,Duration jobRuntime
|
||||
,ExitNodes&& prereq =ExitNodes{}
|
||||
,JobFunctor* functor =nullptr)
|
||||
: pipelineIdentity_{id}
|
||||
, runtimeBound_{jobRuntime}
|
||||
, prerequisites_{std::move (prereq)}
|
||||
, action_{functor}
|
||||
{ }
|
||||
|
||||
explicit
|
||||
ExitNode (HashVal id
|
||||
,ExitNodes&& prereq =ExitNodes{})
|
||||
: ExitNode{id, DUMMY_JOB_RUNTIME, std::move(prereq)}
|
||||
{ }
|
||||
|
||||
static ExitNode NIL;
|
||||
|
||||
|
||||
|
|
@ -125,7 +140,7 @@ namespace engine {
|
|||
getUpperBoundRuntime() const
|
||||
{
|
||||
///////////////////////////////////////////////////////////////////////////TICKET #1283 : lay foundation how to observe timing behaviour for a render pipeline
|
||||
return Duration{FSecs{1,50}}; // Uh-Oh booo
|
||||
return runtimeBound_;
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -213,21 +213,18 @@ namespace engine {
|
|||
|
||||
|
||||
|
||||
Duration
|
||||
totalLatency (Timings const& timings)
|
||||
{
|
||||
return jobTicket_.getExpectedRuntime()
|
||||
+ timings.currentEngineLatency()
|
||||
+ timings.outputLatency;
|
||||
}
|
||||
|
||||
Time
|
||||
doCalcDeadline(Timings const& timings)
|
||||
{
|
||||
Time anchor = isTopLevel()? timings.getTimeDue(frameNr_)
|
||||
: dependentPlan_->determineDeadline (timings); ////////////////////TICKET #1310 : quadratic in the depth of the dependency chain
|
||||
return anchor
|
||||
- totalLatency(timings);
|
||||
if (isTopLevel())
|
||||
return timings.getTimeDue(frameNr_) // anchor at timing grid
|
||||
- jobTicket_.getExpectedRuntime() // deduce the presumably runtime
|
||||
- timings.engineLatency // and the generic engine overhead
|
||||
- timings.outputLatency; // Note: output latency only on top-level job
|
||||
else
|
||||
return dependentPlan_->determineDeadline (timings) ////////////////////////////////////////////TICKET #1310 : WARNING - quadratic in the depth of the dependency chain
|
||||
- jobTicket_.getExpectedRuntime()
|
||||
- timings.engineLatency;
|
||||
}
|
||||
|
||||
#if false /////////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET #1276 :: to be refactored...
|
||||
|
|
|
|||
|
|
@ -31,20 +31,26 @@
|
|||
|
||||
|
||||
#include "steam/play/timings.hpp"
|
||||
#include "vault/engine/engine-config.hpp"
|
||||
#include "lib/time/formats.hpp"
|
||||
#include "lib/time/timequant.hpp"
|
||||
|
||||
#include "lib/rational.hpp"
|
||||
|
||||
|
||||
namespace steam {
|
||||
namespace play {
|
||||
|
||||
using vault::engine::EngineConfig;
|
||||
using lib::time::PQuant;
|
||||
using lib::time::Time;
|
||||
using lib::time::TimeVar;
|
||||
using lib::time::FrameCnt;
|
||||
using lib::time::FSecs;
|
||||
|
||||
namespace { // Hard wired placeholder settings...
|
||||
|
||||
const Duration DEFAULT_ENGINE_LATENCY = Duration{Time{10,0}}; ///////////////////////////////////////TICKET #802 : shouldn't be hard wired
|
||||
const Duration DEFAULT_JOB_PLANNING_TURNOVER(FSecs(3,2));
|
||||
|
||||
}//(End)hard wired settings
|
||||
|
||||
|
||||
namespace { // hidden local details of the service implementation....
|
||||
|
|
@ -74,7 +80,8 @@ namespace play {
|
|||
, playbackUrgency {ASAP}
|
||||
, playbackSpeed {1}
|
||||
, scheduledDelivery{Time::NEVER}
|
||||
, outputLatency {Duration::NIL}
|
||||
, outputLatency{Duration::NIL}
|
||||
, engineLatency{DEFAULT_ENGINE_LATENCY} //////////////////////////////////////////////////////////////TICKET #802 : derive from engine state -- but make it adjustable for unit tests!!!
|
||||
{
|
||||
ENSURE (grid_);
|
||||
}
|
||||
|
|
@ -85,6 +92,7 @@ namespace play {
|
|||
, playbackSpeed {1}
|
||||
, scheduledDelivery{realTimeAnchor}
|
||||
, outputLatency {Duration::NIL}
|
||||
, engineLatency{DEFAULT_ENGINE_LATENCY}
|
||||
{
|
||||
ENSURE (grid_);
|
||||
}
|
||||
|
|
@ -190,7 +198,7 @@ namespace play {
|
|||
Duration
|
||||
Timings::getPlanningChunkDuration() const
|
||||
{
|
||||
return EngineConfig::get().currentJobPlanningRhythm();
|
||||
UNIMPLEMENTED ("controlling the job planning rhythm");
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -211,13 +219,6 @@ namespace play {
|
|||
}
|
||||
|
||||
|
||||
Duration
|
||||
Timings::currentEngineLatency() const
|
||||
{
|
||||
return EngineConfig::get().currentEngineLatency();
|
||||
}
|
||||
|
||||
|
||||
|
||||
Timings
|
||||
Timings::constrainedBy (Timings additionalConditions)
|
||||
|
|
|
|||
|
|
@ -100,7 +100,8 @@ 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; ///////////////TICKET #1301 do we even need this information here (-> rather on some Engine state)
|
||||
Duration outputLatency; ///////////////TICKET #802 this information is necessary, but it is not clear who maintains and updates the latency
|
||||
Duration engineLatency; ///< reasonable guess at the scheduling and dispatch-delay of the render engine
|
||||
|
||||
explicit
|
||||
Timings (FrameRate fps);
|
||||
|
|
@ -172,11 +173,6 @@ namespace play {
|
|||
* follow-up planning job */
|
||||
FrameCnt establishNextPlanningChunkStart(FrameCnt anchorFrame) const;
|
||||
|
||||
/** reasonable guess of the current engine working delay.
|
||||
* Frame calculation deadlines will be readjusted by that value,
|
||||
* to be able to deliver in time with sufficient likeliness. */
|
||||
Duration currentEngineLatency() const;
|
||||
|
||||
|
||||
bool isOriginalSpeed() const;
|
||||
bool isTimebound() const;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,9 @@
|
|||
|
||||
/** @file engine-config.cpp
|
||||
** implementation of engine configuration and parametrisation
|
||||
** @todo 6/2023 not clear if this is placeholder code or something substantial;
|
||||
** however, it seems not plausible; rather I'd expect some data collection
|
||||
** and information service to be connected with the RenderEnvironmentClosure
|
||||
*/
|
||||
|
||||
|
||||
|
|
@ -31,7 +34,6 @@
|
|||
#include "lib/rational.hpp"
|
||||
|
||||
|
||||
using boost::rational;
|
||||
using lib::time::FrameRate;
|
||||
using lib::time::FSecs;
|
||||
using util::Rat;
|
||||
|
|
|
|||
|
|
@ -23,6 +23,9 @@
|
|||
|
||||
/** @file engine-config.hpp
|
||||
** access point to configuration of engine parameters
|
||||
** @todo 6/2023 not clear if this is placeholder code or something substantial;
|
||||
** however, it seems not plausible; rather I'd expect some data collection
|
||||
** and information service to be connected with the RenderEnvironmentClosure
|
||||
*/
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -52,11 +52,12 @@ END
|
|||
TEST "Render job planning calculation" JobPlanning_test <<END
|
||||
out-lit: Frame #5 @ ∆200ms
|
||||
out-lit: real-time-origin : 0:05:00.000
|
||||
out-lit: total latency : ≺52ms≻
|
||||
out-lit: deadline : 0:05:00.148
|
||||
out-lit: total latency : ≺30ms≻
|
||||
out-lit: deadline : 0:05:00.170
|
||||
out-lit: Prerequisite......
|
||||
out-lit: latency : ≺52ms≻
|
||||
out-lit: deadline : 0:05:00.096
|
||||
out-lit: master deadline : 0:05:00.160
|
||||
out-lit: latency : ≺60ms≻
|
||||
out-lit: prereq deadline : 0:05:00.100
|
||||
return: 0
|
||||
END
|
||||
|
||||
|
|
|
|||
|
|
@ -163,7 +163,7 @@ namespace test {
|
|||
|
||||
CHECK (materialise (
|
||||
treeExplore (eachNum(5,13))
|
||||
.transform([&](FrameCnt frameNr) -> TimeVar //////////////////////////////////TICKET #1261 : transform-iterator unable to handle immutable time
|
||||
.transform([&](FrameCnt frameNr)
|
||||
{
|
||||
return grid->timeOf (frameNr);
|
||||
})
|
||||
|
|
@ -175,10 +175,9 @@ namespace test {
|
|||
play::Timings timings (FrameRate::PAL);
|
||||
|
||||
CHECK (materialise (
|
||||
treeExplore (
|
||||
dispatcher.forCalcStream(timings)
|
||||
.timeRange(Time{200,0}, Time{500,0}) // Note: end point is exclusive
|
||||
))
|
||||
dispatcher.forCalcStream(timings)
|
||||
.timeRange(Time{200,0}, Time{500,0}) // Note: end point is exclusive
|
||||
)
|
||||
== "200ms-240ms-280ms-320ms-360ms-400ms-440ms-480ms"_expect);
|
||||
}
|
||||
|
||||
|
|
@ -268,10 +267,13 @@ namespace test {
|
|||
{
|
||||
MockDispatcher dispatcher{MakeRec() // define a single segment for the complete time axis
|
||||
.attrib("mark", 11) // the »master job« for each frame has pipeline-ID ≔ 11
|
||||
.attrib("runtime", Duration{Time{10,0}})
|
||||
.scope(MakeRec()
|
||||
.attrib("mark",22) // a »prerequisite job« marked with pipeline-ID ≔ 22
|
||||
.attrib("runtime", Duration{Time{20,0}})
|
||||
.scope(MakeRec()
|
||||
.attrib("mark",33) // further »recursive prerequisite«
|
||||
.attrib("runtime", Duration{Time{30,0}})
|
||||
.genNode())
|
||||
.genNode())
|
||||
.genNode()};
|
||||
|
|
@ -307,15 +309,15 @@ namespace test {
|
|||
return _Fmt{"J(%d|%s⧐%s)"}
|
||||
% mark % nominalTime % deadline;
|
||||
};
|
||||
CHECK (visualise(pipeline) == "J(11|200ms⧐1s148ms)"_expect); // first job in pipeline: nominal t=200ms, deadline 1s148ms
|
||||
|
||||
CHECK (visualise(pipeline) == "J(11|200ms⧐1s180ms)"_expect); // first job in pipeline: nominal t=200ms,
|
||||
// .... 10ms engine latency + 10ms job runtime ⟶ deadline 1s180ms
|
||||
CHECK (materialise(
|
||||
treeExplore(move(pipeline))
|
||||
.transform(visualise)
|
||||
)
|
||||
== "J(11|200ms⧐1s148ms)-J(22|200ms⧐1s96ms)-J(33|200ms⧐1s44ms)-"
|
||||
"J(11|240ms⧐1s188ms)-J(22|240ms⧐1s136ms)-J(33|240ms⧐1s84ms)-"
|
||||
"J(11|280ms⧐1s228ms)-J(22|280ms⧐1s176ms)-J(33|280ms⧐1s124ms)"_expect);
|
||||
== "J(11|200ms⧐1s180ms)-J(22|200ms⧐1s150ms)-J(33|200ms⧐1s110ms)-" // ... -(10+10) | -(10+10)-(10+20) | -(10+10)-(10+20)-(10+30)
|
||||
"J(11|240ms⧐1s220ms)-J(22|240ms⧐1s190ms)-J(33|240ms⧐1s150ms)-"
|
||||
"J(11|280ms⧐1s260ms)-J(22|280ms⧐1s230ms)-J(33|280ms⧐1s190ms)"_expect);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -109,7 +109,7 @@ namespace test {
|
|||
|
||||
// the following calculations are expected to happen....
|
||||
Duration latency = ticket.getExpectedRuntime()
|
||||
+ timings.currentEngineLatency()
|
||||
+ timings.engineLatency
|
||||
+ timings.outputLatency;
|
||||
|
||||
Offset nominalOffset (timings.getFrameStartAt(0), timings.getFrameStartAt(frameNr));
|
||||
|
|
@ -143,7 +143,9 @@ namespace test {
|
|||
setupDependentJob()
|
||||
{
|
||||
MockDispatcher dispatcher{MakeRec() // »master job« for each frame
|
||||
.attrib("runtime", Duration{Time{30,0}})
|
||||
.scope(MakeRec() // a »prerequisite job« on which the »master job« depends
|
||||
.attrib("runtime", Duration{Time{50,0}})
|
||||
.genNode())
|
||||
.genNode()};
|
||||
|
||||
|
|
@ -169,14 +171,15 @@ namespace test {
|
|||
|
||||
// the following relations are expected to hold for the prerequisite....
|
||||
Duration latency = prereq.getExpectedRuntime()
|
||||
+ timings.currentEngineLatency()
|
||||
+ timings.outputLatency;
|
||||
+ timings.engineLatency; // Note: here only the engine, not the output latency
|
||||
|
||||
Time expectedDeadline{masterDeadline - latency};
|
||||
|
||||
cout << util::_Fmt{"Prerequisite......\n"
|
||||
"master deadline : %s\n"
|
||||
"latency : %s\n"
|
||||
"deadline : %s"}
|
||||
"prereq deadline : %s"}
|
||||
% masterDeadline
|
||||
% latency
|
||||
% prereqDeadline
|
||||
<< endl;
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ namespace test {
|
|||
static ExitNode
|
||||
defineSimpleSpec (HashVal seed = 1+rand())
|
||||
{
|
||||
return ExitNode{seed
|
||||
return ExitNode{seed, DUMMY_JOB_RUNTIME
|
||||
,ExitNodes{}
|
||||
,& MockJob::getFunctor()};
|
||||
}
|
||||
|
|
@ -224,6 +224,7 @@ namespace test {
|
|||
buildExitNodeFromSpec (GenNode const& spec)
|
||||
{
|
||||
return ExitNode{buildSeed (spec)
|
||||
,buildRuntime (spec)
|
||||
,buildPrerequisites (spec)
|
||||
,& MockJob::getFunctor()};
|
||||
}
|
||||
|
|
@ -241,6 +242,13 @@ namespace test {
|
|||
return seed? HashVal(*seed) : HashVal(rand() % 1000);
|
||||
}
|
||||
|
||||
Duration
|
||||
buildRuntime (GenNode const& spec)
|
||||
{
|
||||
auto runtime = spec.retrieveAttribute<Duration> ("runtime");
|
||||
return runtime? *runtime : DUMMY_JOB_RUNTIME;
|
||||
}
|
||||
|
||||
ExitNodes
|
||||
buildPrerequisites (GenNode const& spec)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2498,34 +2498,32 @@ 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="202306122204" tags="def Player Rendering img" changecount="34">
|
||||
<div title="FrameDispatcher" modifier="Ichthyostega" created="201105222330" modified="202306202209" tags="def Player Rendering img" changecount="46">
|
||||
<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. As a //service// the Dispatcher acts as //bridge// between [[»playback«|Player]] and the [[render nodes network|Rendering]].
|
||||
|
||||
The Dispatcher works together with the [[job ticket(s)|JobTicket]] and the [[Scheduler]]; actually these are the //core abstractions//&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//&nbsp; by a set of &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 &rarr; see [[some notes...|AboutMonads]]
|
||||
|
||||
!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 &rarr; frame number &rarr; segment &rarr; real exit node.
|
||||
|
||||
The purpose of this interface is to support the planning of new jobs, for a given [[stream-of-calculations|CalcStream]]. From time to time, a chunk of new [[frame rendering jobs|RenderJob]] entries will be prepared for the [[Scheduler]]. Each job knows his frame number and the actual [[render node|ProcNode]] to operate. So, to start planning jobs, we need to translate...
|
||||
⧐ time &rarr; frame number &rarr; segment &rarr; real exit node.
|
||||
!!!Invocation situation
|
||||
* our //current starting point//&nbsp; is given as ''anchor frame'', related to the [[Timings]] of a [[render/playback process|PlayProcess]]
|
||||
* we want to address a specific frame, addressed by an //absolute frame-number// -- interpreted relative to the //frame grid// of these //playback {{{Timings}}}//
|
||||
* &rArr; the dispatcher establishes the //fundamental coordinates// of that frame (''frame coordinates''), comprised of
|
||||
* we want to address a specific frame, denominated by an //absolute frame-number// -- interpreted relative to the //frame grid// of these //playback {{{Timings}}}//
|
||||
* ⟹ the dispatcher establishes the //fundamental characteristics// of that frame, comprised of
|
||||
** the absolute nominal time
|
||||
** the absolute frame number
|
||||
** the ModelPort to draw data from
|
||||
** focussed context information:
|
||||
** additional focussed context information:
|
||||
*** the relevant [[segment|Segmentation]] responsible for producing this frame
|
||||
*** the corresponding JobTicket to use at this point
|
||||
*** a concrete ExitNode to pull for this frame
|
||||
*** possibly a real-time ''deadline''
|
||||
*** possibly a real-time related [[deadline|JobDeadline]]
|
||||
|
||||
!!!Planning Chunks
|
||||
In fact, the whole process of playback or rendering is a continued series of exploration and evaluation. The outline of what needs to be calculated is determined continuously, proceeding in chunks of evaluation. The evaluation structure of the render engine is quite similar to the //fork-join//-pattern, just with the addition of timing constraints. This leads to an invocation pattern, where a partial evaluation happens from time to time. Each of those evaluations establishes a breaking point in time: everything //before// this point is settled and planned thus far. So, this point is an ''anchor'' and starting point for the next partial evaluation. On the implementation level, each CalcStream maintains a {{{RenderDrive}}} (see below), which acts both as //planning pipeline// and JobFunctor for the next planning chunk to come. Moreover, the associated [[Timings]] record establishes a definitive binding between the abstract logical time of the session timeline, and the real wall-clock time forming the deadline for render evaluation.
|
||||
As such, the whole process of playback or rendering is a continued series of exploration and evaluation. The outline of what needs to be calculated is determined continuously, proceeding in chunks of evaluation. The evaluation structure of the render engine is quite similar to the //fork-join//-pattern, just with the addition of timing constraints. This leads to an invocation pattern, where a partial evaluation happens from time to time. Each of those evaluations establishes a breaking point in time: everything //before// this point is settled and planned thus far. So, this point is an ''anchor'' and starting point for the next partial evaluation. On the implementation level, each CalcStream maintains a {{{RenderDrive}}} (see below), which acts both as //planning pipeline// and JobFunctor for the next planning chunk to come. Moreover, the associated [[Timings]] record establishes a definitive binding between the abstract logical time of the session timeline, and the real wall-clock time forming the deadline for render evaluation.
|
||||
|
||||
!!!related timelines and the frame grid
|
||||
The frame dispatch step joins and combines multiple time axes. Through the process of //scheduling,// the output generation is linked to real ''wall clock time'' and the dispatch step establishes the deadlines, taking the ''engine latency'' into account. As such, any render or playback process establishes an ''output time grid'', linking frame numbers to nominal output time or timecode, based on the ''output frame rate'' -- where both the framerate and the actual progression (speed) might be changed dynamically. But beyond all of this there is a third, basically independent temporal structure involved: the actual content to render, the ''effective session timeline''. While encoded in nominal, absolute, internal time values not necessarily grid aligned, in practice at least the //breaking points,// the temporal location where the content or structure of the pipeline changes, are aligned //to a grid used while creating the edit.// Yet this session timing structure need not be related in any way to the playback grid, nor is it necessarily the same as the ''source grid'' defined by the media data used to feed the pipeline.
|
||||
The frame dispatch step joins and combines multiple time axes. Through the process of //scheduling,// the output generation is linked to real ''wall clock time'' and the dispatch step establishes the [[deadlines|JobDeadline]], taking the ''engine latency'' into account. As such, any render or playback process establishes an ''output time grid'', linking frame numbers to nominal output time or timecode, based on the ''output frame rate'' -- where both the framerate and the actual progression (speed) might be changed dynamically. But beyond all of this there is a third, basically independent temporal structure involved: the actual content to render, the ''effective session timeline''. While encoded in nominal, absolute, internal time values not necessarily grid aligned, in practice at least the //breaking points,// the temporal location where the content or structure of the pipeline changes, are aligned //to an implicit grid used while creating the edit.// Yet this ''edit timing'' structure need not be related in any way to the ''playback grid'', nor is it necessarily the same as the ''source grid'' defined by the media data used to feed the pipeline.
|
||||
|
||||
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.//
|
||||
|
||||
|
|
@ -4261,9 +4259,21 @@ Thus an invocation trail represents one specific path leading to the invocation
|
|||
''Note'': {{red{future plans and visions -- no clear and distinct meaning -- as of 4/21}}}
|
||||
</pre>
|
||||
</div>
|
||||
<div title="JobPlanningPipeline" creator="Ichthyostega" modifier="Ichthyostega" created="202305260209" modified="202306122212" tags="operational Rendering draft" changecount="8">
|
||||
<div title="JobDeadline" creator="Ichthyostega" modifier="Ichthyostega" created="202306202223" modified="202306202303" tags="def Rendering draft" changecount="14">
|
||||
<pre>//Point at the real wall-clock time axis, at which a [[render job|RenderJob]] must have delivered its action.//
|
||||
After that point, further pursuing the evaluation of such a job, or any of its dependencies is futile and can be abandoned.
|
||||
|
||||
!External constraints and Latency
|
||||
For the typical calculation of media data frames, several dependent actions have to be carried out in proper order. The »top-level job« serves the purpose to deliver the complete media frame into some external //data sink.// When the render engine operates //time-bound// (as for real-time playback), delivery of data is acceptable only during a limited //time window// -- it starts when the data buffer (from a double buffering or round-robin scheme) becomes „open“ and ready to receive data, and it ends with the next »frame clock tick« when this data must be posted to the external hardware output or receiver. Working backward from these external constraints, it is clear that the job actually must be dispatched earlier by some margin, since moving forward all these interactions requires some processing time. This additional time margin is known as ''Latency'' -- further structured into the //output latency// inherent to the presentation mechanism, and the //engine latency// due to the overhead of coordinating the render operations. In addition to the latency, also the actual ''calculation effort'' must be accounted for, and combining these figures gives the ''schedule deadline'', which is the latest point in (real wall-clock) time where a calculation may still possibly reach its goal.
|
||||
|
||||
Most calculations are not monolithic and can not be performed in-memory in a single run -- rather, some ''prerequisites'' must be prepared, like e.g. loading source media data from disk and decoding this data through an external library. Often prerequisites are //I/O-bound// and //intermittent// in nature, and will thus be organised as separate ''prerequisite jobs''. Deadline calculations for these are coordinated by a similar scheme and lined up backwards to the dependend job's schedule deadline.
|
||||
!!!Computation of Deadlines
|
||||
Pre-planning this chain of schedules is only necessary for {{{TIMEBOUND}}} playback -- in the other cases, for //best effort// or //background// computations, just the sequence of dependencies must be observed, starting the next step only after all prerequisites are ready. And while the [[Scheduler]] actually has the capability to react on such logical dependencies, for precise timing the schedule deadlines will be prepared in the JobPlanningPipeline. Working backwards from the »top-level« frame job, prerequisites will be discovered incrementally by a recursive depth-first »tree exploration«. Defined by a //exploration function// within an iterator-pipeline construct, further layers of child dependencies are discovered and pushed onto a stack. At some point, a »leaf prerequisite« is discovered -- and at that point the complete chain of dependencies resides within this stack, each represented as a {{{JobPlanning}}} data record. The computation is arranges in a way to link these dependent planning contexts together, allowing to determine the dependent scheduling deadlines by recurring to the parent {{{JobPlanning}}} record, all the way up to the root record, which aligns to an time gird point externally set by the playback timings.
|
||||
</pre>
|
||||
</div>
|
||||
<div title="JobPlanningPipeline" creator="Ichthyostega" modifier="Ichthyostega" created="202305260209" modified="202306202218" tags="operational Rendering draft" changecount="10">
|
||||
<pre>//Depth-first evaluation pipeline used in the FrameDispatcher to generate the next chunk of [[render jobs|RenderJob]]//
|
||||
This is an implementation structure backed and established by the [[Dispatcher|FrameDispatcher]] and operated by the RenderDrive core of each CalcStream, where it is assembled by a //builder notation// -- backed by the {{{TreeExplorer}}} iterator pipeline framework; besides the typical filter and transform operations, the latter offers an »expansion« mechanism to integrate a //monadic exhaustive depth-first search,// allowing to pick up all prerequisites of a given calculation step by step within a local planning context.
|
||||
This is an implementation structure backed and established by the [[Dispatcher|FrameDispatcher]] and operated by the RenderDrive core of each CalcStream, where it is assembled by a //builder notation// -- backed by the {{{TreeExplorer}}} iterator pipeline framework; besides the typical filter and transform operations, the latter offers an »expansion« mechanism to integrate a //monadic exhaustive depth-first search,// allowing to pick up all prerequisites of a given calculation, proceeding step by step within a local planning context.
|
||||
|
||||
!Stages of the Job-planning pipeline
|
||||
;frame-tick
|
||||
|
|
@ -4276,7 +4286,7 @@ This is an implementation structure backed and established by the [[Dispatcher|F
|
|||
;job-planning
|
||||
:collect the complete planning context and determine time frame
|
||||
:*especially add a {{{DataSink}}} specification to the JobFunctor closure
|
||||
:*and evaluate the dependency structure from the //exploration step// to establish Job deadlines
|
||||
:*and evaluate the dependency structure from the //exploration step// to establish Job [[deadlines|JobDeadline]].
|
||||
</pre>
|
||||
</div>
|
||||
<div title="JobTicket" modifier="Ichthyostega" created="201202120018" modified="202305111241" tags="spec Rendering draft" changecount="4">
|
||||
|
|
|
|||
|
|
@ -69960,7 +69960,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="yes"/>
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node CREATED="1685403027730" ID="ID_1618141786" MODIFIED="1685403315041" TEXT="das verwirrt die Konzepte »realTime« und »Deadline«">
|
||||
<linktarget COLOR="#ff292c" DESTINATION="ID_1618141786" ENDARROW="Default" ENDINCLINATION="402;21;" ID="Arrow_ID_97219015" SOURCE="ID_1075266324" STARTARROW="None" STARTINCLINATION="250;-324;"/>
|
||||
<linktarget COLOR="#522b3c" 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ändig sein">
|
||||
|
|
@ -70383,8 +70383,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681741481500" ID="ID_384450703" MODIFIED="1681741489593" TEXT="Dispatcher-Interface neu definieren">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681741493272" ID="ID_1834962194" MODIFIED="1686586841532" TEXT="der Builder wird durch einen Pipeline-Builder ersetzt">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#435e98" CREATED="1681741493272" ID="ID_1834962194" MODIFIED="1687304951551" TEXT="der Builder wird durch einen Pipeline-Builder ersetzt">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681741503343" ID="ID_852301467" MODIFIED="1681741508391" TEXT="Services">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
|
|
@ -70542,9 +70542,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<font NAME="SansSerif" SIZE="13"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1681742255171" ID="ID_1531898349" MODIFIED="1681744077783" TEXT="Draft im Test-Setup">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1978512771" MODIFIED="1686679637400" TEXT="scaffolding and mocking used for this test">
|
||||
<node COLOR="#338800" CREATED="1681742255171" ID="ID_1531898349" MODIFIED="1687304910760" TEXT="Draft im Test-Setup">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1978512771" MODIFIED="1687312278238" TEXT="scaffolding and mocking used for this test">
|
||||
<icon BUILTIN="full-1"/>
|
||||
<node CREATED="1681742863121" ID="ID_101929835" MODIFIED="1684878277170" TEXT="benötigte Mocks">
|
||||
<icon BUILTIN="info"/>
|
||||
|
|
@ -70746,6 +70746,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1687226692385" ID="ID_1322717339" MODIFIED="1687226857990" TEXT="Latenz/Laufzeit testbar machen">
|
||||
<linktarget COLOR="#8593a4" DESTINATION="ID_1322717339" ENDARROW="Default" ENDINCLINATION="-866;77;" ID="Arrow_ID_2406913" SOURCE="ID_1364608777" STARTARROW="None" STARTINCLINATION="443;31;"/>
|
||||
<node CREATED="1687226834096" ID="ID_686916201" MODIFIED="1687226844369" TEXT="runtime=<duration>"/>
|
||||
<node COLOR="#435e98" CREATED="1687307530172" ID="ID_1233686432" MODIFIED="1687307554028" TEXT="sonst: ExitNode DUMMY_JOB_DURATION = 1/50s">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#5b280f" CREATED="1682384817342" ID="ID_1041945883" MODIFIED="1686679760838" TEXT="Channel-Zuordnung nur per Filter/Marker">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -73873,10 +73876,10 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1684878012464" ID="ID_1911013145" LINK="#ID_599701197" MODIFIED="1684878033002" TEXT="verify_MockPrerequisites();"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742836995" ID="ID_456677168" MODIFIED="1684878195489" TEXT="using a frame step as base tick">
|
||||
<node COLOR="#435e98" CREATED="1681742836995" FOLDED="true" ID="ID_456677168" MODIFIED="1687304899402" TEXT="using a frame step as base tick">
|
||||
<icon BUILTIN="full-2"/>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1685063204038" ID="ID_1320162919" MODIFIED="1685631679971" TEXT="Vorarbeit">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1685063204038" FOLDED="true" ID="ID_1320162919" MODIFIED="1687304884053" TEXT="Vorarbeit">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1685396470984" ID="ID_977131570" MODIFIED="1685396475818" TEXT="Grundsätzliches...">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685403171015" ID="ID_1491439076" MODIFIED="1685403230708" TEXT="der Code sieht konfus aus">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -73920,8 +73923,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1685403241929" ID="ID_1075266324" MODIFIED="1685403315041" TEXT="»Deadline« und »realTime« sind vermischt">
|
||||
<arrowlink COLOR="#ff292c" DESTINATION="ID_1618141786" ENDARROW="Default" ENDINCLINATION="402;21;" ID="Arrow_ID_97219015" STARTARROW="None" STARTINCLINATION="250;-324;"/>
|
||||
<node COLOR="#435e98" CREATED="1685403241929" ID="ID_1075266324" MODIFIED="1687304796068" TEXT="»Deadline« und »realTime« sind vermischt">
|
||||
<arrowlink COLOR="#522b3c" 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>
|
||||
|
|
@ -73951,7 +73954,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685403577421" ID="ID_1838234667" MODIFIED="1685403609231">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685403577421" ID="ID_1838234667" MODIFIED="1687304764180">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -73962,11 +73965,13 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1687304767321" ID="ID_1250391579" MODIFIED="1687304780895" TEXT="TimeAnchor verliert seinen Sinn und wird aufgegeben">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1685401871210" ID="ID_1279877312" MODIFIED="1685401884954" TEXT="Timings_test">
|
||||
<node COLOR="#435e98" CREATED="1685401871210" ID="ID_1279877312" MODIFIED="1687304864668" TEXT="Timings_test">
|
||||
<node CREATED="1685063216695" ID="ID_918094283" MODIFIED="1685401873636" TEXT="ich bin immer wieder verwirrt...">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
|
@ -73987,6 +73992,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1687304836705" ID="ID_100230035" MODIFIED="1687304860893" TEXT="auf das Minimum der reienen Grid-Berechnungen reduzieren">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1685585183914" ID="ID_1477861363" MODIFIED="1685631559728" TEXT="einfache Integer-Sequenz iterieren">
|
||||
<arrowlink COLOR="#64a3bc" DESTINATION="ID_1193075176" ENDARROW="Default" ENDINCLINATION="-872;80;" ID="Arrow_ID_49892110" STARTARROW="None" STARTINCLINATION="-1069;-69;"/>
|
||||
|
|
@ -75578,71 +75586,12 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1681742836996" ID="ID_1332543018" MODIFIED="1684878204163" TEXT="integration: generate a complete sequence of (dummy)Jobs">
|
||||
<node COLOR="#435e98" CREATED="1681742836996" FOLDED="true" ID="ID_1332543018" MODIFIED="1687304903527" TEXT="integration: generate a complete sequence of (dummy)Jobs">
|
||||
<arrowlink COLOR="#4d3a6e" DESTINATION="ID_92268538" ENDARROW="Default" ENDINCLINATION="184;0;" ID="Arrow_ID_1841184971" STARTARROW="None" STARTINCLINATION="146;7;"/>
|
||||
<icon BUILTIN="full-5"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685986952878" ID="ID_819115625" MODIFIED="1685986964431" TEXT="Umgang mit der DataSink">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685986971920" ID="ID_1354248617" MODIFIED="1685987005822" TEXT="vorsicht ref-counting ⟹ darf nicht in den Job-Parameter">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685987007275" ID="ID_953619048" MODIFIED="1685987465547" TEXT="daher per Pointer auf den Calc-Stream verweisen">
|
||||
<arrowlink COLOR="#4b3ea5" DESTINATION="ID_87044302" ENDARROW="Default" ENDINCLINATION="248;-35;" ID="Arrow_ID_594271482" STARTARROW="None" STARTINCLINATION="669;36;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1687217341462" ID="ID_877655155" MODIFIED="1687218491894" TEXT="Problem: API-Design und Builder-Operationen">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1687218323318" ID="ID_221977098" MODIFIED="1687218375802" TEXT="eigentlich ist diese Funktion nun überflüssig">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...damit, daß das JobPlanning bereits in der Mitte der Pipeline erzeugt wird...
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1687218376742" ID="ID_1708598294" MODIFIED="1687218463295" TEXT="aber ich möchte eine explizite Terminal-Funktion">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
hier spielt auch mit, daß man das expandPrerequisites() stets weglassen kann (das folgt schon aus den Eigenschaften einer solchen Expander-Funktion — sie muß auch ohne Expansion <i>funktionieren</i>)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1687218467222" ID="ID_234544119" MODIFIED="1687218482227" TEXT="und "sendTo(sink)" ist halt einfach zu schön">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1687218507489" ID="ID_1398426631" MODIFIED="1687219641251">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
<u>Vorläufig</u>: einen Transformer vorsehen, der das JobPlanning noch manipulieren kann
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Wichtig: dieser Transformer muß explizit JobPlanning& als Ergebnistyp deklarieren: damit bekommt man die »Referenz-Variante« vom ItemWrapper — leider aber auch eine zusätzliche Indirektion, die nicht wegoptimiert werden kann (weil sie je nach darunter liegendem Expander woanders hin zeigt)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#c0bdd3" COLOR="#690f14" CREATED="1685986952878" ID="ID_819115625" MODIFIED="1687302695659" TEXT="offen: Umgang mit der DataSink">
|
||||
<arrowlink COLOR="#7d3f56" DESTINATION="ID_519176123" ENDARROW="Default" ENDINCLINATION="-1337;-138;" ID="Arrow_ID_1252848442" STARTARROW="None" STARTINCLINATION="-721;60;"/>
|
||||
<icon BUILTIN="bell"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1686793340860" HGAP="80" ID="ID_121519729" MODIFIED="1687228266870" TEXT="Pipeline abschließen" VSHIFT="-44">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -75828,7 +75777,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1684984896696" HGAP="36" ID="ID_727075583" MODIFIED="1687228182161" VSHIFT="3">
|
||||
<node COLOR="#338800" CREATED="1684984896696" FOLDED="true" HGAP="36" ID="ID_727075583" MODIFIED="1687228182161" VSHIFT="3">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -75906,7 +75855,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1686874330784" ID="ID_1065139085" MODIFIED="1687191647885" TEXT="und dort per Test-Spec aus dem Mock injizieren">
|
||||
<arrowlink COLOR="#c35685" DESTINATION="ID_1364608777" ENDARROW="Default" ENDINCLINATION="1055;-65;" ID="Arrow_ID_167964463" STARTARROW="None" STARTINCLINATION="590;34;"/>
|
||||
<arrowlink COLOR="#566fc3" DESTINATION="ID_1364608777" ENDARROW="Default" ENDINCLINATION="1055;-65;" ID="Arrow_ID_167964463" STARTARROW="None" STARTINCLINATION="590;34;"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -76561,7 +76510,7 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1687226442603" HGAP="-25" ID="ID_1588706779" MODIFIED="1687226478065" TEXT="JobPlanningPIpeline_test::integration()" VSHIFT="17">
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1687226442603" HGAP="-25" ID="ID_1588706779" MODIFIED="1687312226495" TEXT="JobPlanningPIpeline_test::integration()" VSHIFT="17">
|
||||
<icon BUILTIN="pencil"/>
|
||||
<node COLOR="#338800" CREATED="1687226500123" ID="ID_667484740" MODIFIED="1687226507025" TEXT="3-stufige Prerequisites">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
|
|
@ -76572,11 +76521,11 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node COLOR="#338800" CREATED="1687226522249" ID="ID_461341429" MODIFIED="1687226552650" TEXT="visualise() : mark|nomTime|deadline">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687226553736" ID="ID_1364608777" MODIFIED="1687226864861" TEXT="Deadline per Spec steuerbar machen">
|
||||
<node COLOR="#338800" CREATED="1687226553736" ID="ID_1364608777" MODIFIED="1687312226495" TEXT="Deadline per Spec steuerbar machen">
|
||||
<arrowlink COLOR="#8593a4" DESTINATION="ID_1322717339" ENDARROW="Default" ENDINCLINATION="-866;77;" ID="Arrow_ID_2406913" STARTARROW="None" STARTINCLINATION="443;31;"/>
|
||||
<linktarget COLOR="#c35685" DESTINATION="ID_1364608777" ENDARROW="Default" ENDINCLINATION="1055;-65;" ID="Arrow_ID_167964463" SOURCE="ID_1065139085" STARTARROW="None" STARTINCLINATION="590;34;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687228400573" HGAP="35" ID="ID_442962812" MODIFIED="1687228424125" TEXT="auch die Engine-Latency" VSHIFT="19">
|
||||
<linktarget COLOR="#566fc3" DESTINATION="ID_1364608777" ENDARROW="Default" ENDINCLINATION="1055;-65;" ID="Arrow_ID_167964463" SOURCE="ID_1065139085" STARTARROW="None" STARTINCLINATION="590;34;"/>
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1687228400573" HGAP="35" ID="ID_442962812" MODIFIED="1687312226495" TEXT="auch die Engine-Latency" VSHIFT="19">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
|
|
@ -76587,8 +76536,33 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node CREATED="1687306680366" ID="ID_1892396695" MODIFIED="1687312226495" TEXT="schwierig....">
|
||||
<icon BUILTIN="smiley-neutral"/>
|
||||
</node>
|
||||
<node CREATED="1687306685054" ID="ID_1200560410" MODIFIED="1687312226495" TEXT="Start Play-Process not weitgehend ungeklärt">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...aktuell denke ich, die Details der Timings kommen aus der RenderEnvironmentClosure (aber was das heißt sei dahingestellt....)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="stop-sign"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#c12397" CREATED="1687309822442" ID="ID_1786133103" MODIFIED="1687312226495" TEXT="HA! 2 Fehler in der Impl">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
<node COLOR="#435e98" CREATED="1687309867006" HGAP="25" ID="ID_1756952210" MODIFIED="1687312226495" TEXT="Wichtig: OutputLatency nur auf den top-Level-Job" VSHIFT="18">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687312289435" ID="ID_269400382" MODIFIED="1687312303347" TEXT="use multiple Segments with different config">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -77370,6 +77344,77 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1687302599709" ID="ID_1237500630" MODIFIED="1687302620405" TEXT="Render-Node-Invocation">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1687302631000" ID="ID_229742286" MODIFIED="1687302644211" TEXT="erster Enwurf von 2010">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node CREATED="1687302645431" ID="ID_1377069136" MODIFIED="1687302651074" TEXT="Aufruf-Schnittstelle"/>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1687302361438" ID="ID_519176123" MODIFIED="1687302695659" TEXT="Umgang mit der DataSink">
|
||||
<linktarget COLOR="#7d3f56" DESTINATION="ID_519176123" ENDARROW="Default" ENDINCLINATION="-1337;-138;" ID="Arrow_ID_1252848442" SOURCE="ID_819115625" STARTARROW="None" STARTINCLINATION="-721;60;"/>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1685986971920" ID="ID_1354248617" MODIFIED="1685987005822" TEXT="vorsicht ref-counting ⟹ darf nicht in den Job-Parameter">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1685987007275" ID="ID_953619048" MODIFIED="1685987465547" TEXT="daher per Pointer auf den Calc-Stream verweisen">
|
||||
<arrowlink COLOR="#4b3ea5" DESTINATION="ID_87044302" ENDARROW="Default" ENDINCLINATION="248;-35;" ID="Arrow_ID_594271482" STARTARROW="None" STARTINCLINATION="669;36;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1687217341462" ID="ID_877655155" MODIFIED="1687218491894" TEXT="Problem: API-Design und Builder-Operationen">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1687218323318" ID="ID_221977098" MODIFIED="1687218375802" TEXT="eigentlich ist diese Funktion nun überflüssig">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
...damit, daß das JobPlanning bereits in der Mitte der Pipeline erzeugt wird...
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1687218376742" ID="ID_1708598294" MODIFIED="1687218463295" TEXT="aber ich möchte eine explizite Terminal-Funktion">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
hier spielt auch mit, daß man das expandPrerequisites() stets weglassen kann (das folgt schon aus den Eigenschaften einer solchen Expander-Funktion — sie muß auch ohne Expansion <i>funktionieren</i>)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1687218467222" ID="ID_234544119" MODIFIED="1687218482227" TEXT="und "sendTo(sink)" ist halt einfach zu schön">
|
||||
<icon BUILTIN="ksmiletris"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1687218507489" ID="ID_1398426631" MODIFIED="1687219641251">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
<u>Vorläufig</u>: einen Transformer vorsehen, der das JobPlanning noch manipulieren kann
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Wichtig: dieser Transformer muß explizit JobPlanning& als Ergebnistyp deklarieren: damit bekommt man die »Referenz-Variante« vom ItemWrapper — leider aber auch eine zusätzliche Indirektion, die nicht wegoptimiert werden kann (weil sie je nach darunter liegendem Expander woanders hin zeigt)
|
||||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1682611423253" ID="ID_1136070257" MODIFIED="1682611949376" TEXT="Vorschau: Datenstruktur">
|
||||
<linktarget COLOR="#735061" DESTINATION="ID_1136070257" ENDARROW="Default" ENDINCLINATION="-651;-968;" ID="Arrow_ID_1804652676" SOURCE="ID_296140708" STARTARROW="None" STARTINCLINATION="-518;37;"/>
|
||||
<node CREATED="1682611979955" ID="ID_853916933" MODIFIED="1682611992260">
|
||||
|
|
|
|||
Loading…
Reference in a new issue