DOCS: New Timing and Latency section (DOCF-1179) (#1994)

* Timing and latency section

* removed stray escape characters in code samples

* Small edits and formatting fixes

* Formatting pass

* fix broken link

* minor edits

* ongoing corrections from peer review WIP

* renamed file link fixes

* Completed landing page links section

* fixed broken link (xref not working)

* Update Packages/com.unity.inputsystem/Documentation~/timing-input-events-queue.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-select-mode.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-select-mode.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-optimize-dynamic-update.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-optimize-dynamic-update.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-mixed-scenarios.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-mixed-scenarios.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-select-mode.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

* Update Packages/com.unity.inputsystem/Documentation~/timing-select-mode.md

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>

---------

Co-authored-by: Jo Dawes <49957016+jo-unity@users.noreply.github.com>
Co-authored-by: Alex Tyrer <AlexTyrer@users.noreply.github.com>
This commit is contained in:
Ben Pitt 2024-10-18 13:45:04 +01:00 коммит произвёл GitHub
Родитель 40dc911fc2
Коммит 94c260e2a2
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: B5690EEEBB952194
17 изменённых файлов: 4052 добавлений и 0 удалений

Просмотреть файл

@ -0,0 +1,623 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="199.63948mm"
height="111.62632mm"
viewBox="0 0 199.63948 111.62632"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
sodipodi:docname="TimingEventGrouping.svg"
inkscape:export-filename="TimingInputsPerFrame.svg"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
showguides="true"
inkscape:zoom="1.5833333"
inkscape:cx="471.78947"
inkscape:cy="311.05263"
inkscape:window-width="2258"
inkscape:window-height="1321"
inkscape:window-x="1484"
inkscape:window-y="1072"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<sodipodi:guide
position="26.166316,103.17285"
orientation="0,-1"
id="guide3307"
inkscape:locked="false" />
<sodipodi:guide
position="66.799497,61.63125"
orientation="0,-1"
id="guide4312"
inkscape:locked="false" />
<sodipodi:guide
position="51.556304,61.63126"
orientation="1,0"
id="guide5766"
inkscape:locked="false" />
<sodipodi:guide
position="108.56884,61.63125"
orientation="1,0"
id="guide5768"
inkscape:locked="false" />
<sodipodi:guide
position="151.89018,34.70334"
orientation="1,0"
id="guide5770"
inkscape:locked="false" />
<sodipodi:guide
position="49.588486,20.08966"
orientation="0,-1"
id="guide7279"
inkscape:locked="false" />
<sodipodi:guide
position="34.13125,14.497768"
orientation="0,-1"
id="guide11776"
inkscape:locked="false" />
<sodipodi:guide
position="192.00336,21.25881"
orientation="1,0"
id="guide11836"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs2">
<marker
style="overflow:visible"
id="marker26094"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="TriangleStart"
markerWidth="5.3244081"
markerHeight="6.155385"
viewBox="0 0 5.3244081 6.1553851"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path26092" />
</marker>
<linearGradient
id="linearGradient19782"
inkscape:swatch="solid">
<stop
style="stop-color:#e1f4fd;stop-opacity:1;"
offset="0"
id="stop19780" />
</linearGradient>
<marker
style="overflow:visible"
id="TriangleStart"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="TriangleStart"
markerWidth="5.3244081"
markerHeight="6.155385"
viewBox="0 0 5.3244081 6.1553851"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135" />
</marker>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient19782"
id="linearGradient20536"
gradientUnits="userSpaceOnUse"
x1="20.592558"
y1="116.86988"
x2="34.717692"
y2="116.86988"
gradientTransform="translate(-144.525,-89.214755)" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-10.360526)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5434;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect14390"
width="199.63948"
height="131.84605"
x="10.360526"
y="1.110223e-16" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.579138;stroke-linecap:round;stroke-dasharray:none"
id="rect292"
width="169.57275"
height="111.50591"
x="32.759834"
y="8.4847698" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.728543,14.274313 -4.273367,-6e-6"
id="path3305"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="26.207373"
y="15.563694"
id="text3459"><tspan
sodipodi:role="line"
id="tspan3457"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="26.207373"
y="15.563694">1</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.728542,97.357504 -4.273367,-6e-6"
id="path4298"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="26.207371"
y="98.646896"
id="text4302"><tspan
sodipodi:role="line"
id="tspan4300"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="26.207371"
y="98.646896">0</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.728542,55.815912 -4.273367,-6e-6"
id="path4304"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="27.46414"
y="57.105305"
id="text4308"><tspan
sodipodi:role="line"
id="tspan4306"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="27.46414"
y="57.105305">0.5</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 61.916829,8.4534708 0,111.5372092"
id="path7228"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 118.92936,8.4534755 0,111.5372045"
id="path8007"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 162.2507,8.4534754 0,111.5372046"
id="path8009"
sodipodi:nodetypes="cc" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="path11021"
cx="37.26965"
cy="93.02578"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11758"
cx="46.470467"
cy="91.061996"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11760"
cx="57.624741"
cy="86.806793"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11762"
cx="71.115395"
cy="77.061676"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11764"
cx="83.049683"
cy="55.815907"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11766"
cx="97.701675"
cy="39.250072"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11768"
cx="111.99919"
cy="29.560848"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11770"
cx="129.25073"
cy="24.007269"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11772"
cx="148.39285"
cy="19.280815"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11774"
cx="168.71658"
cy="15.813694"
r="0.82984304" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.440525,14.278285 169.923355,-6e-6"
id="path11834"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="37.906174"
y="12.787863"
id="text11840"><tspan
sodipodi:role="line"
id="tspan11838"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="37.906174"
y="12.787863">Frame 1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="67.260902"
y="12.787863"
id="text12699"><tspan
sodipodi:role="line"
id="tspan12697"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="67.260902"
y="12.787863">Frame 2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="124.19448"
y="12.787863"
id="text12703"><tspan
sodipodi:role="line"
id="tspan12701"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="124.19448"
y="12.787863">Frame 3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="167.36929"
y="12.787863"
id="text12707"><tspan
sodipodi:role="line"
id="tspan12705"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="167.36929"
y="12.787863">Frame 4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Consolas;-inkscape-font-specification:Consolas;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="-67.307686"
y="17.074659"
id="text14165"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan14163"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';stroke-width:0.5"
x="-67.307686"
y="17.074659">Input Value</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="32.978542"
y="127.94108"
id="text14169"><tspan
sodipodi:role="line"
id="tspan14167"
style="stroke-width:0.5"
x="32.978542"
y="127.94108">Time</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;marker-end:url(#TriangleStart)"
d="m 45.08378,126.62763 156.92562,-0.25"
id="path14171"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.761403,97.128553 169.602477,-6e-6"
id="path18874"
sodipodi:nodetypes="cc" />
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.496862;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect18882"
width="5.4658761"
height="22.862137"
x="32.759834"
y="97.128548" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="36.809071"
id="text19728"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan19726"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="36.809071">Update</tspan></text>
<rect
style="fill:#2196f3;fill-opacity:1;stroke:#000000;stroke-width:0.49703;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect20544"
width="5.4688454"
height="22.865108"
x="61.915344"
y="97.12706" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-118.9452"
y="65.75621"
id="text20548"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan20546"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-118.9452"
y="65.75621">Input</tspan></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.49703;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect20550"
width="5.4688454"
height="22.86511"
x="67.381226"
y="97.12706" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="71.347427"
id="text20554"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan20552"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="71.347427">Update</tspan></text>
<rect
style="fill:#fce5ec;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect24246"
width="12.403841"
height="22.614576"
x="38.349491"
y="97.252327" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="42.274948"
id="text24250"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan24248"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="42.274948">Rendering</tspan></text>
<rect
style="fill:#fce5ec;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25144"
width="12.403841"
height="22.614576"
x="72.850067"
y="97.252327" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="76.775528"
id="text25148"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan25146"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="76.775528">Rendering</tspan></text>
<rect
style="fill:#2196f3;fill-opacity:1;stroke:#000000;stroke-width:0.49703;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25156"
width="5.4688454"
height="22.865108"
x="118.98212"
y="97.12706" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-118.9452"
y="122.82298"
id="text25160"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan25158"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-118.9452"
y="122.82298">Input</tspan></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.49703;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25162"
width="5.4688454"
height="22.86511"
x="124.448"
y="97.12706" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="128.4142"
id="text25166"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan25164"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="128.4142">Update</tspan></text>
<rect
style="fill:#fce5ec;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25168"
width="12.403841"
height="22.614576"
x="129.91684"
y="97.252327" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="133.8423"
id="text25172"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan25170"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="133.8423">Rendering</tspan></text>
<rect
style="fill:#2196f3;fill-opacity:1;stroke:#000000;stroke-width:0.49703;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25174"
width="5.4688454"
height="22.865108"
x="162.22914"
y="97.12706" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-118.9452"
y="166.07001"
id="text25178"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan25176"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-118.9452"
y="166.07001">Input</tspan></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.49703;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25180"
width="5.4688454"
height="22.86511"
x="167.69502"
y="97.12706" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="171.66122"
id="text25184"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan25182"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="171.66122">Update</tspan></text>
<rect
style="fill:#fce5ec;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25186"
width="12.403841"
height="22.614576"
x="173.16386"
y="97.252327" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="177.08932"
id="text25190"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan25188"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="177.08932">Rendering</tspan></text>
<rect
style="fill:none;fill-opacity:1;stroke:#a2ddf9;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect25244"
width="24.648027"
height="11.028948"
x="35.008553"
y="83.942551" />
<path
style="fill:none;fill-opacity:1;stroke:#a2ddf9;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker26094)"
d="m 59.656578,88.927849 4.993188,3e-6 V 100.1796"
id="path26090"
sodipodi:nodetypes="ccc" />
<rect
style="fill:none;fill-opacity:1;stroke:#a2ddf9;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect26192"
width="46.865982"
height="54.436966"
x="67.906487"
y="25.602985" />
<path
style="fill:none;fill-opacity:1;stroke:#a2ddf9;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker26094)"
d="m 115.27247,75.187235 6.11572,3e-6 0.32835,25.199892"
id="path26194"
sodipodi:nodetypes="ccc" />
<rect
style="fill:none;fill-opacity:1;stroke:#a2ddf9;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect26968"
width="27.25457"
height="10.006927"
x="124.94948"
y="16.36437" />
<path
style="fill:none;fill-opacity:1;stroke:#a2ddf9;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker26094)"
d="m 152.20405,21.367838 h 12.75951 l -0.0477,79.019292"
id="path26983"
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Consolas;-inkscape-font-specification:Consolas;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="-122.34101"
y="17.074659"
id="text27799"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan27797"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';stroke-width:0.5"
x="-122.34101"
y="17.074659">Player Loop</tspan></text>
</g>
</svg>

После

Ширина:  |  Высота:  |  Размер: 28 KiB

Разница между файлами не показана из-за своего большого размера Загрузить разницу

После

Ширина:  |  Высота:  |  Размер: 73 KiB

Просмотреть файл

@ -0,0 +1,962 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="380.87305mm"
height="85.766785mm"
viewBox="0 0 380.87305 85.766782"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
sodipodi:docname="TimingFixedUpdateSlowFPS.svg"
inkscape:export-filename="TimingFixedUpdateFastFPS"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
showguides="false"
inkscape:zoom="1"
inkscape:cx="723.49998"
inkscape:cy="188.49999"
inkscape:window-width="2258"
inkscape:window-height="1321"
inkscape:window-x="1484"
inkscape:window-y="1072"
inkscape:window-maximized="1"
inkscape:current-layer="layer1" />
<defs
id="defs2">
<linearGradient
id="linearGradient10162"
inkscape:swatch="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop10160" />
</linearGradient>
<linearGradient
id="linearGradient10030"
inkscape:swatch="solid">
<stop
style="stop-color:#a2ddf9;stop-opacity:1;"
offset="0"
id="stop10028" />
</linearGradient>
<linearGradient
id="linearGradient10000"
inkscape:swatch="solid">
<stop
style="stop-color:#67bc6b;stop-opacity:1;"
offset="0"
id="stop9998" />
</linearGradient>
<linearGradient
id="linearGradient5928"
inkscape:swatch="solid">
<stop
style="stop-color:#c7e5ca;stop-opacity:1;"
offset="0"
id="stop5926" />
</linearGradient>
<linearGradient
id="linearGradient5898"
inkscape:swatch="solid">
<stop
style="stop-color:#cc0000;stop-opacity:1;"
offset="0"
id="stop5896" />
</linearGradient>
<linearGradient
id="linearGradient2694"
inkscape:swatch="solid">
<stop
style="stop-color:#67bc6b;stop-opacity:1;"
offset="0"
id="stop2692" />
</linearGradient>
<linearGradient
id="linearGradient38298"
inkscape:swatch="solid">
<stop
style="stop-color:#a2ddf9;stop-opacity:1;"
offset="0"
id="stop38296" />
</linearGradient>
<linearGradient
id="linearGradient38178"
inkscape:swatch="solid">
<stop
style="stop-color:#2196f3;stop-opacity:1;"
offset="0"
id="stop38176" />
</linearGradient>
<linearGradient
id="linearGradient38136"
inkscape:swatch="solid">
<stop
style="stop-color:#2196f3;stop-opacity:1;"
offset="0"
id="stop38134" />
</linearGradient>
<linearGradient
id="linearGradient38106"
inkscape:swatch="solid">
<stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop38104" />
</linearGradient>
<linearGradient
id="linearGradient38022"
inkscape:swatch="solid">
<stop
style="stop-color:#fce5ec;stop-opacity:1;"
offset="0"
id="stop38020" />
</linearGradient>
<linearGradient
id="linearGradient37992"
inkscape:swatch="solid">
<stop
style="stop-color:#2196f3;stop-opacity:1;"
offset="0"
id="stop37990" />
</linearGradient>
<linearGradient
id="linearGradient37962"
inkscape:swatch="solid">
<stop
style="stop-color:#ffcb27;stop-opacity:1;"
offset="0"
id="stop37960" />
</linearGradient>
<linearGradient
id="linearGradient37906"
inkscape:swatch="solid">
<stop
style="stop-color:#2196f3;stop-opacity:1;"
offset="0"
id="stop37904" />
</linearGradient>
<linearGradient
id="linearGradient19782"
inkscape:swatch="solid">
<stop
style="stop-color:#e1f4fd;stop-opacity:1;"
offset="0"
id="stop19780" />
</linearGradient>
<marker
style="overflow:visible"
id="TriangleStart"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="TriangleStart"
markerWidth="5.3244081"
markerHeight="6.155385"
viewBox="0 0 5.3244081 6.1553851"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135" />
</marker>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2694"
id="linearGradient2696"
x1="119.6345"
y1="103.26795"
x2="125.60037"
y2="103.26795"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5928"
id="linearGradient5930"
x1="32.552292"
y1="71.903534"
x2="107.90296"
y2="71.903534"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5928"
id="linearGradient6078"
gradientUnits="userSpaceOnUse"
x1="32.552292"
y1="71.903534"
x2="107.90296"
y2="71.903534"
gradientTransform="matrix(0.99796486,0,0,1,74.917427,0)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5928"
id="linearGradient6866"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.99128495,0,0,1,149.83489,0)"
x1="32.552292"
y1="71.903534"
x2="107.90296"
y2="71.903534" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5928"
id="linearGradient6894"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.99462508,0,0,1,223.92369,0)"
x1="32.552292"
y1="71.903534"
x2="107.90296"
y2="71.903534" />
<marker
style="overflow:visible"
id="marker26094"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="TriangleStart"
markerWidth="5.3244081"
markerHeight="6.155385"
viewBox="0 0 5.3244081 6.1553851"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path26092" />
</marker>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10000"
id="linearGradient10032"
x1="105.56524"
y1="90.761604"
x2="112.34727"
y2="90.761604"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(17.17113,-67.262303)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10000"
id="linearGradient10164"
x1="67.632706"
y1="72.231247"
x2="74.374382"
y2="72.231247"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10000"
id="linearGradient10232"
gradientUnits="userSpaceOnUse"
x1="67.632706"
y1="72.231247"
x2="74.374382"
y2="72.231247"
gradientTransform="translate(74.763406)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10000"
id="linearGradient10264"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(148.84186)"
x1="67.632706"
y1="72.231247"
x2="74.374382"
y2="72.231247" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient10000"
id="linearGradient10349"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(223.7915)"
x1="67.632706"
y1="72.231247"
x2="74.374382"
y2="72.231247" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12402"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(8.9802561,71.367624)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12404"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(37.964088,71.367624)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12406"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(66.947928,71.185865)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12408"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(95.931768,71.185866)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12410"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(124.91561,71.185867)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12412"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(153.89945,71.004106)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12426"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(31.470396,60.894766)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12428"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(106.36351,60.894766)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12430"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(180.36708,60.894766)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient38106"
id="linearGradient12432"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(255.26021,60.894766)"
x1="38.278996"
y1="11.27553"
x2="53.065582"
y2="11.27553" />
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-10.360526,-52.178616)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.543401;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect14390"
width="380.87305"
height="85.766785"
x="10.360526"
y="52.178616"
sodipodi:insensitive="true" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
id="rect292"
width="348.06744"
height="54.394943"
x="32.802292"
y="65.553291" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499998;stroke-linecap:round;stroke-dasharray:none"
d="M 61.916829,78.702083 V 120.17244"
id="path7228"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.759834,78.253779 348.152376,-6e-6"
id="path11834"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12402);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="46.886429"
y="84.155487"
id="text11840"><tspan
sodipodi:role="line"
id="tspan11838"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12402);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="46.886429"
y="84.155487">1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="31.391041"
y="132.70352"
id="text14169"><tspan
sodipodi:role="line"
id="tspan14167"
style="stroke-width:0.5"
x="31.391041"
y="132.70352">Time (in Seconds)</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;marker-end:url(#TriangleStart)"
d="m 70.511962,131.39016 310.141058,-0.25"
id="path14171"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.761403,86.545219 72.021487,-10e-7 276.12932,-5e-6"
id="path18874"
sodipodi:nodetypes="ccc" />
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect18882"
width="5.4658761"
height="33.445469"
x="32.759834"
y="86.545219" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="36.809071"
id="text19728"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan19726"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="36.809071">Update</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.759834,66.032679 v -3.16489"
id="path31298"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="32.759834"
y="61.584347"
id="text31302"><tspan
sodipodi:role="line"
id="tspan31300"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="32.759834"
y="61.584347">0</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499998;stroke-linecap:round;stroke-dasharray:none"
d="M 90.90066,78.702083 V 120.17244"
id="path40630"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12404);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="75.870262"
y="84.155487"
id="text40634"><tspan
sodipodi:role="line"
id="tspan40632"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12404);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="75.870262"
y="84.155487">2</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499998;stroke-linecap:round;stroke-dasharray:none"
d="M 119.8845,78.477931 V 119.94829"
id="path40646"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12406);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="104.8541"
y="83.973724"
id="text40650"><tspan
sodipodi:role="line"
id="tspan40648"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12406);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="104.8541"
y="83.973724">3</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499998;stroke-linecap:round;stroke-dasharray:none"
d="M 148.86834,78.477932 V 119.94829"
id="path40662"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12408);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="133.83794"
y="83.973724"
id="text40666"><tspan
sodipodi:role="line"
id="tspan40664"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12408);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="133.83794"
y="83.973724">4</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499998;stroke-linecap:round;stroke-dasharray:none"
d="M 177.85218,78.477934 V 119.94829"
id="path40678"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12410);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="162.82178"
y="83.973724"
id="text40682"><tspan
sodipodi:role="line"
id="tspan40680"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12410);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="162.82178"
y="83.973724">5</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499998;stroke-linecap:round;stroke-dasharray:none"
d="M 206.83602,78.253779 V 119.72414"
id="path40700"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12412);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="191.80562"
y="83.791962"
id="text40704"><tspan
sodipodi:role="line"
id="tspan40702"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12412);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="191.80562"
y="83.791962">6</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499997;stroke-linecap:round;stroke-dasharray:none"
d="M 107.65296,66.032679 V 78.253778"
id="path40820"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499997;stroke-linecap:round;stroke-dasharray:none"
d="M 182.1013,66.167873 V 78.253778"
id="path40826"
sodipodi:nodetypes="cc" />
<rect
style="fill:url(#linearGradient6078);fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
id="rect6076"
width="74.698341"
height="12.700486"
x="107.65296"
y="65.553291" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499997;stroke-linecap:round;stroke-dasharray:none"
d="M 256.54965,66.094242 V 78.180147"
id="path40832"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499997;stroke-linecap:round;stroke-dasharray:none"
d="M 330.99801,66.094242 V 78.180147"
id="path40838"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499997;stroke-linecap:round;stroke-dasharray:none"
d="M 32.759834,66.167873 V 78.686966"
id="path41004"
sodipodi:nodetypes="cc" />
<rect
style="fill:url(#linearGradient6894);fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
id="rect6892"
width="74.448357"
height="12.700486"
x="256.54965"
y="65.553291" />
<rect
style="fill:url(#linearGradient10232);fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-opacity:1"
id="rect10226"
width="6.2416797"
height="5.9322309"
x="142.64612"
y="69.265129" />
<rect
style="fill:url(#linearGradient6866);fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
id="rect6864"
width="74.198349"
height="12.700486"
x="182.3513"
y="65.553291" />
<rect
style="fill:url(#linearGradient10264);fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-opacity:1"
id="rect10258"
width="6.2416797"
height="5.9322309"
x="216.72458"
y="69.265129" />
<rect
style="fill:url(#linearGradient5930);fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
id="rect5156"
width="74.85067"
height="12.700486"
x="32.802292"
y="65.553291" />
<rect
style="fill:url(#linearGradient10164);fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-opacity:1"
id="rect10158"
width="6.2416797"
height="5.9322309"
x="67.882706"
y="69.265129" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12426);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="69.376572"
y="73.682625"
id="text41424"><tspan
sodipodi:role="line"
id="tspan41422"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12426);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="69.376572"
y="73.682625">A</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12428);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="144.26968"
y="73.682625"
id="text41448"><tspan
sodipodi:role="line"
id="tspan41446"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12428);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="144.26968"
y="73.682625">B</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12430);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="218.27325"
y="73.682625"
id="text41462"><tspan
sodipodi:role="line"
id="tspan41460"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12430);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="218.27325"
y="73.682625">C</tspan></text>
<rect
style="fill:url(#linearGradient10349);fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-opacity:1"
id="rect10278"
width="6.2416797"
height="5.9322309"
x="291.67419"
y="69.265129" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:url(#linearGradient12432);fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="293.16638"
y="73.682625"
id="text41476"><tspan
sodipodi:role="line"
id="tspan41474"
style="text-align:start;text-anchor:start;fill:url(#linearGradient12432);fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="293.16638"
y="73.682625">D</tspan></text>
<text
xml:space="preserve"
style="font-size:3.52777px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#2196f3;fill-opacity:1;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="218.27325"
y="84.265953"
id="text41504"><tspan
sodipodi:role="line"
id="tspan41502"
style="stroke-width:0.5"
x="218.27325"
y="84.265953" /></text>
<text
xml:space="preserve"
style="font-size:3.52777px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#2196f3;fill-opacity:1;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="355.87265"
y="84.265953"
id="text41508"><tspan
sodipodi:role="line"
id="tspan41506"
style="stroke-width:0.5"
x="355.87265"
y="84.265953" /></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 107.65296,66.032679 v -3.16489"
id="path41510"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="107.65296"
y="61.584347"
id="text41514"><tspan
sodipodi:role="line"
id="tspan41512"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="107.65296"
y="61.584347">0.02</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 182.3513,65.837144 v -3.16489"
id="path41516"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="182.1013"
y="61.71954"
id="text41520"><tspan
sodipodi:role="line"
id="tspan41518"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="182.1013"
y="61.71954">0.04</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 256.54965,66.094242 v -3.16489"
id="path41522"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="256.54965"
y="61.645908"
id="text41526"><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="256.54965"
y="61.645908"
id="tspan623">0.06</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 330.99801,66.094242 v -3.16489"
id="path41528"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="330.99802"
y="61.645908"
id="text41532"><tspan
sodipodi:role="line"
id="tspan41530"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="330.99802"
y="61.645908">0.08</tspan></text>
<text
xml:space="preserve"
style="font-size:0.705556px;font-family:Consolas, monospace;-inkscape-font-specification:'Consolas, monospace';text-align:center;text-anchor:middle;fill:#cc0000;stroke:#000000;stroke-width:0.0264583;stroke-linecap:round"
x="333.46265"
y="104.17537"
id="text551"><tspan
sodipodi:role="line"
id="tspan549"
style="stroke-width:0.0264583"
x="333.46265"
y="104.17537" /></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect627"
width="5.4658761"
height="33.445469"
x="62.166828"
y="86.545219" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="66.216072"
id="text631"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan629"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="66.216072">Update</tspan></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect633"
width="5.4658761"
height="33.383453"
x="90.900658"
y="86.545227" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="94.949905"
id="text637"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan635"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="94.949905">Update</tspan></text>
<rect
style="fill:url(#linearGradient2696);fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect639"
width="5.4658761"
height="33.445469"
x="119.8845"
y="86.545219" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="123.93375"
id="text643"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan641"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="123.93375">Fixed Update</tspan></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect645"
width="5.4658761"
height="33.445469"
x="148.86835"
y="86.545219" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="152.9176"
id="text649"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan647"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="152.9176">Update</tspan></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect657"
width="5.4658761"
height="33.445469"
x="177.85219"
y="86.545219" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="181.90144"
id="text661"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan659"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="181.90144">Update</tspan></text>
<rect
style="fill:#ffcb27;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect2680"
width="5.4658761"
height="33.445469"
x="125.35037"
y="86.545219" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
x="-119.23476"
y="129.39963"
id="text2684"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan2682"
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5"
x="-119.23476"
y="129.39963">Update</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:url(#linearGradient10032);stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#marker26094)"
d="m 90.900661,18.022714 48.336599,3e-6 0.0682,12.163805"
id="path26090"
sodipodi:nodetypes="ccc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Consolas;-inkscape-font-specification:Consolas;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="18.105536"
y="83.946663"
id="text10459"><tspan
sodipodi:role="line"
id="tspan10457"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';stroke-width:0.5"
x="18.105536"
y="83.946663">Frame</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Consolas;-inkscape-font-specification:Consolas;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="31.100166"
y="68.990227"
id="text10513"><tspan
sodipodi:role="line"
id="tspan10511"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;stroke-width:0.5"
x="31.100166"
y="68.990227"
dy="1">Fixed</tspan><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;stroke-width:0.5"
x="31.100166"
y="74.52655"
id="tspan10515">Timestep</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Consolas;-inkscape-font-specification:Consolas;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="31.100166"
y="101.61226"
id="text10521"><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;stroke-width:0.5"
x="31.100166"
y="101.61226"
id="tspan10519">Player</tspan><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;stroke-width:0.5"
x="31.100166"
y="107.14858"
id="tspan10525">Loop</tspan></text>
</g>
</svg>

После

Ширина:  |  Высота:  |  Размер: 41 KiB

Просмотреть файл

@ -0,0 +1,336 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="199.63948mm"
height="111.62632mm"
viewBox="0 0 199.63948 111.62632"
version="1.1"
id="svg5"
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
sodipodi:docname="TimingInputsPerFrame.svg"
inkscape:export-filename="..\..\Packages\com.unity.inputsystem\Documentation~\Images\TimingInputPerFrame.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#111111"
borderopacity="1"
inkscape:showpageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="1"
inkscape:deskcolor="#d1d1d1"
inkscape:document-units="mm"
showgrid="false"
showguides="true"
inkscape:zoom="1.5833333"
inkscape:cx="416.21052"
inkscape:cy="292.73684"
inkscape:window-width="2258"
inkscape:window-height="1321"
inkscape:window-x="1484"
inkscape:window-y="1072"
inkscape:window-maximized="1"
inkscape:current-layer="layer1">
<sodipodi:guide
position="26.166316,103.17285"
orientation="0,-1"
id="guide3307"
inkscape:locked="false" />
<sodipodi:guide
position="66.799497,61.63125"
orientation="0,-1"
id="guide4312"
inkscape:locked="false" />
<sodipodi:guide
position="51.556304,3.8434259"
orientation="1,0"
id="guide5766"
inkscape:locked="false" />
<sodipodi:guide
position="108.56884,61.63125"
orientation="1,0"
id="guide5768"
inkscape:locked="false" />
<sodipodi:guide
position="151.89018,34.70334"
orientation="1,0"
id="guide5770"
inkscape:locked="false" />
<sodipodi:guide
position="49.588486,20.08966"
orientation="0,-1"
id="guide7279"
inkscape:locked="false" />
<sodipodi:guide
position="34.13125,14.497768"
orientation="0,-1"
id="guide11776"
inkscape:locked="false" />
<sodipodi:guide
position="192.00336,21.25881"
orientation="1,0"
id="guide11836"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs2">
<linearGradient
id="linearGradient19782"
inkscape:swatch="solid">
<stop
style="stop-color:#e1f4fd;stop-opacity:1;"
offset="0"
id="stop19780" />
</linearGradient>
<marker
style="overflow:visible"
id="TriangleStart"
refX="0"
refY="0"
orient="auto-start-reverse"
inkscape:stockid="TriangleStart"
markerWidth="5.3244081"
markerHeight="6.155385"
viewBox="0 0 5.3244081 6.1553851"
inkscape:isstock="true"
inkscape:collect="always"
preserveAspectRatio="xMidYMid">
<path
transform="scale(0.5)"
style="fill:context-stroke;fill-rule:evenodd;stroke:context-stroke;stroke-width:1pt"
d="M 5.77,0 -2.88,5 V -5 Z"
id="path135" />
</marker>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(-10.360526)">
<rect
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.5434;stroke-linecap:round;stroke-dasharray:none;stroke-opacity:1"
id="rect14390"
width="199.63948"
height="110.45658"
x="10.360526"
y="0.58486843" />
<rect
style="fill:none;stroke:#000000;stroke-width:0.579138;stroke-linecap:round;stroke-dasharray:none"
id="rect292"
width="169.57275"
height="88.643776"
x="32.759834"
y="8.4847698" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.728543,14.274313 -4.273367,-6e-6"
id="path3305"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="26.207373"
y="15.563694"
id="text3459"><tspan
sodipodi:role="line"
id="tspan3457"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="26.207373"
y="15.563694">1</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.728542,97.357504 -4.273367,-6e-6"
id="path4298"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="26.207371"
y="98.646896"
id="text4302"><tspan
sodipodi:role="line"
id="tspan4300"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="26.207371"
y="98.646896">0</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.728542,55.815912 -4.273367,-6e-6"
id="path4304"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none"
x="27.46414"
y="57.105305"
id="text4308"><tspan
sodipodi:role="line"
id="tspan4306"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.5;stroke-dasharray:none"
x="27.46414"
y="57.105305">0.5</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 61.916829,8.4534708 0,88.6750752"
id="path7228"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 118.92936,8.4534755 0,88.6750705"
id="path8007"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 162.2507,8.4534754 0,88.6750706"
id="path8009"
sodipodi:nodetypes="cc" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="path11021"
cx="37.26965"
cy="93.02578"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11758"
cx="46.470467"
cy="91.061996"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11760"
cx="57.624741"
cy="86.806793"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11762"
cx="71.115395"
cy="77.061676"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11764"
cx="83.049683"
cy="55.815907"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11766"
cx="97.701675"
cy="39.250072"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11768"
cx="111.99919"
cy="29.560848"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11770"
cx="129.25073"
cy="25.59477"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11772"
cx="148.03081"
cy="21.926651"
r="0.82984304" />
<circle
style="fill:#2196f3;fill-opacity:1;stroke:none;stroke-width:0.735701;stroke-linecap:round;stroke-dasharray:none"
id="circle11774"
cx="168.71658"
cy="15.813694"
r="0.82984304" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.440525,14.278285 169.923355,-6e-6"
id="path11834"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="37.906174"
y="12.787863"
id="text11840"><tspan
sodipodi:role="line"
id="tspan11838"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="37.906174"
y="12.787863">Frame 1</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="67.260902"
y="12.787863"
id="text12699"><tspan
sodipodi:role="line"
id="tspan12697"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="67.260902"
y="12.787863">Frame 2</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="124.19448"
y="12.787863"
id="text12703"><tspan
sodipodi:role="line"
id="tspan12701"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="124.19448"
y="12.787863">Frame 3</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:end;text-anchor:end;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-linecap:round;stroke-dasharray:none"
x="167.36929"
y="12.787863"
id="text12707"><tspan
sodipodi:role="line"
id="tspan12705"
style="text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0;stroke-dasharray:none"
x="167.36929"
y="12.787863">Frame 4</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Consolas;-inkscape-font-specification:Consolas;text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="-67.307686"
y="17.074659"
id="text14165"
transform="rotate(-90)"><tspan
sodipodi:role="line"
id="tspan14163"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';stroke-width:0.5"
x="-67.307686"
y="17.074659">Input Value</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.23333px;font-family:Inter, 'sans serif';-inkscape-font-specification:'Inter, sans serif';text-align:start;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
x="32.978542"
y="105.66901"
id="text14169"><tspan
sodipodi:role="line"
id="tspan14167"
style="stroke-width:0.5"
x="32.978542"
y="105.66901">Time</tspan></text>
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.5;stroke-linecap:round;stroke-dasharray:none;marker-end:url(#TriangleStart)"
d="m 45.08378,104.35554 156.92562,-0.25"
id="path14171"
sodipodi:nodetypes="cc" />
<path
style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.499999;stroke-linecap:round;stroke-dasharray:none"
d="m 32.761403,97.128553 169.602477,-6e-6"
id="path18874"
sodipodi:nodetypes="cc" />
</g>
</svg>

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 52 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 48 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 60 KiB

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 42 KiB

Просмотреть файл

@ -25,6 +25,13 @@
* [Events](Events.md)
* [Layouts](Layouts.md)
* [User Management](UserManagement.md)
* [Timing and latency](timing-and-latency.md)
* [Input events queue](timing-input-events-queue.md)
* [Select an input processing mode](timing-select-mode.md)
* [Optimize for dynamic update](timing-optimize-dynamic-update.md)
* [Optimize for fixed update](timing-optimize-fixed-update.md)
* [Avoid missed or duplicate events](timing-missed-duplicate-events.md)
* [Mixed timing scenarios](timing-mixed-scenarios.md)
* [Supported Input Devices](SupportedDevices.md)
* [Pointers](Pointers.md)
* [Touch support](Touch.md)

Просмотреть файл

@ -0,0 +1,21 @@
---
uid: timing-latency
---
# Timing and Latency
Input Timing refers to the topic of exactly when the Input System receives and processes input from devices.
Latency is the amount of time between the user providing some input, and the user receiving a response to that input. For example, the time between a button press and your games character moving on-screen. In fast-paced input scenarios such as action games, even tiny delays between the user's input and your game responding can be noticeable and affect the feel of your gameplay.
In addition to the effects of latency, timing can affect one-off discrete events such as when a button press starts or finishes. Checking for these at the wrong time can result in missed or duplicate events.
To minimize input latency, and to avoid missed or duplicate events, it helps to understand how the Input System processes events in relation to Unity's frame updates, physics updates, and fixed updates. This will help you make decisions about how to read and respond to input in your game or app.
| **Topic** | **Description** |
| :------------------------------ | :------------------------------- |
| **[Input events queue](timing-input-events-queue.md)** | Understand how and when the Input System receives and processes input from devices. |
| **[Select an input processing mode](timing-select-mode.md)** | How to select an appropriate **Update Mode** which controls when the Input System processes queued input events. |
| **[Optimize for dynamic update](timing-optimize-dynamic-update.md)** | How to optimize input for use in `Update` calls. |
| **[Optimize for fixed update](timing-optimize-fixed-update.md)** | How to optimize input for use in `FixedUpdate` calls. |
| **[Avoid missed or duplicate events](timing-missed-duplicate-events.md)** | How to avoid missing or duplicated discrete input events like when a button was pressed or released. |
| **[Mixed timing scenarios](timing-mixed-scenarios.md)** | How to optimize and avoid problems when using input in both `Update` and `FixedUpdate` calls. |

Просмотреть файл

@ -0,0 +1,29 @@
# The input events queue
The Input System receives information from hardware input devices as a stream of events. These events represent either system events received from the input device, or snapshots in time based on frequent samples from the device.
The incoming events are stored in a queue, and by default are processed each frame. Input controls which have discrete (on/off) states, such as a button on a gamepad or mouse, generate corresponding single discrete events when they change state. Input controls with a range of motion, for example a stick or trigger on a gamepad that can be gradually moved over a period of time, generate a stream of individual events in rapid succession that approximates the smooth change in value.
![image alt text](./Images/TimingEventGrouping.png)
*A diagram showing an example of events coming from a smoothly changing analog input such as a gamepad stick over a period of four frames. In this example, the events are occurring faster than the games frame rate, which means multiple events are received each frame.*
Because a device can cause events at times when the input system can't process them (for example, during the rendering phase of the player loop), these events are placed in an incoming queue, and the input system processes them in batches at frequent intervals.
## Input Event Queue Processing
Unitys player loop repeats at frequent intervals depending on how fast your game or app is running. The player loop repeats once per frame, and performs the Update and FixedUpdate calls. However, the player loop in your game or app usually runs at a rate that's different to the rate of incoming events from input controls, which tend to have their own rate of operation.
This means that each time an Update cycle occurs while a user is moving an input control, there's likely to be a queue of events representing the gradual change in values that occurred between the last frame and the current frame. This queue is processed at the beginning of the next Update or FixedUpdate, depending on which [**Input Update Mode**](timing-select-mode.md) you're using.
## Event grouping and processing
To pass through these incoming input events to your code, the Input System groups and processes them at a specific time within the [Player Loop](https://docs.unity3d.com/Manual/ExecutionOrder.html). This is either just before the next `Update` if the Input Update Mode is set to **Process Events In Dynamic Update**, or just before the next `FixedUpdate` if the Input Mode is set to **Process Events in Fixed Update**.
The following diagram shows how each batch of events (labeled with letters) is processed at the start of the subsequent frame, when the Input Update mode is set to **Process Events in Dynamic Update**. Events (**a**), (**b**) & (**c**) occurred during frame 1, and so are processed at the start of frame 2, before frame 2s Update() call. Events (**d**), (**e**), (**f**) & (**g**) occurred during frame 2, and so are processed at the start of frame 3. Events (**h**) & (**i**) occur during frame 3, and so are processed at the start of frame 4.
![image alt text](./Images/TimingInputsPerFrame.png)
This means that the exact time that your code receives the events isn't the same as the time the event was received by the input system in Unity. For this reason, when you're using event callbacks (as opposed to polling), the Input System includes time stamps for each event so that you can know when each event was generated.
For example, event (**d**) in the diagram is received from the device by the input system at time 0.012 s, but the time at which your code receives the event callback is at the start of the next frame, at about 0.03 s. It retains its timestamp of 0.012 s, but it, along with events (**e**), (**f**), and (**g**), are all processed by your code at almost exactly the same time, each marked with their own time stamps.

Просмотреть файл

@ -0,0 +1,9 @@
# Avoid missed or duplicate discrete events
Discrete events are simple on/off events that occur when a user presses or releases a control such as a gamepad button, key, mouse, or touch press. This is in contrast to continuously changing values like those from gamepad stick movement. You can poll for these types of discrete event by using [`WasPressedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame_) or [`WasReleasedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame_). However, you can get incorrect results such as missing an event or appearing to receive multiple, if you check for them at the wrong time.
If your Update Mode is set to **Process in FixedUpdate**, you must ensure that you only use [`WasPressedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame_) or [`WasReleasedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame_) in **FixedUpdate** calls. Using them in Update might either miss events, or returns true across multiple consecutive frames depending on whether the frame rate is running slower or faster than the fixed time step.
Conversely, if your Update Mode is set to **process in Dynamic Update**, you must ensure that you only use [`WasPressedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame_) or [`WasReleasedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame_) in `Update` calls. Using them in `FixedUpdate` might either miss events, or return true across multiple consecutive frames depending on whether the fixed time step is running slower or faster than your games frame rate.
If you find that you're missing events that should have been detected, or are receiving multiple events for what should have been a single press or release of a control, the reason is probably that you either have your Input Update Mode set to the wrong setting, or that you're reading the state of these events in the wrong `Update` or `FixedUpdate` call.

Просмотреть файл

@ -0,0 +1,92 @@
# Mixed timing scenarios with fixed and dynamic input
There are some situations where you might set the Update Mode **process in Dynamic Update** even when using input code in `FixedUpdate`, to minimize input latency, as described in the [previous section](./timing-optimize-fixed-update.md).
In this situation, for discrete events you must ensure that you use [`WasPressedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame_) or [`WasReleasedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasReleasedThisFrame_) in `Update`, and pass through a variable to your `FixedUpdate` code to indicate the event happened. There may still be some latency between the frame in which the event occurred, and the next `FixedUpdate` call.
For example:
```c#
using UnityEngine;
using UnityEngine.InputSystem;
public class ExampleScript : MonoBehaviour
{
InputAction jumpAction;
bool jumpPressed;
private void Start()
{
jumpAction = InputSystem.actions.FindAction("Jump");
}
private void Update()
{
// read discrete jump pressed event here:
if (jumpAction.WasPressedThisFrame())
{
// set this variable to true, for use in FixedUpdate
jumpPressed = true;
}
}
void FixedUpdate()
{
if (jumpPressed)
{
// apply jump physics here
// set the variable to false so that the jump pressed physics are only applied once
jumpPressed = false;
}
}
}
```
## Minimum latency in mixed timing scenarios
A technique to give the user the feel of absolute minimum latency while still using `FixedUpdate` is to respond as fast as possible in `Update` giving some visual feedback, but also respond to that same input in `FixedUpdate` for your physics system code. For example, you could display the start of a "jump" animation immediately in `Update`, while applying physics to correspond with the "jump" animation in the next available `FixedUpdate` which might come slightly later.
In this scenario, set your Update Mode **Process events in Dynamic Update** which gives you the fastest response in your `Update` call. However for the reasons mentioned in the previous section, this might mean you miss discrete events if you use methods like [`WasPressedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame_) in your `FixedUpdate` call. To avoid this problem, use a variable to pass through the pressed/released state of the discrete event from the event handler to your FixedUpdate call, and then clear it once your FixedUpdate code has acted on it. For example:
```c#
using UnityEngine;
using UnityEngine.InputSystem;
public class ExampleScript : MonoBehaviour
{
InputAction jumpAction;
bool jumpPressed;
private void Start()
{
jumpAction = InputSystem.actions.FindAction("Jump");
}
private void Update()
{
// at high FPS, its fastest to read actions here:
// read discrete jump pressed event here:
if (jumpAction.WasPressedThisFrame())
{
// start jump animation here
// set this variable to true, for use in FixedUpdate
jumpPressed = true;
}
}
void FixedUpdate()
{
if (jumpPressed)
{
// apply jump physics here
// set the variable to false so that the jump pressed physics are only applied once
jumpPressed = false;
}
}
}
```

Просмотреть файл

@ -0,0 +1,24 @@
# Optimize for dynamic update (non-physics) scenarios
If you're not working with the physics system or using `FixedUpdate`, always set the input system to process input in sync with the frame rate and `Update()` calls. This is the default setting, but to check or set this, go to **Project Settings** \> **Input System Package** \> **Input Settings**, and set **Update Mode** to **Process Events in Dynamic Update**.
You can use either a Polling or Event-driven approach to read and process input each frame. You can find out more about Polling or Event-driven approaches in [Responding To Actions](RespondingToActions.html). Whether you choose polling or event-driven, as long as you have your Update Mode set to **Process Events in Dynamic Update**, you receive the latest events and values at the start of each frame.
## Polling technique
Poll input in `Update` and use those values to control your game in `Update`. If there were multiple events after the last frame completed (for example, multiple changing position values of a continuously moving gamepad stick), polling gives you the most recently processed value which is often fine for most scenarios. This approach is often called **sample-and-hold** and is a form of down-sampling, because individual subframe information is discarded. For example, in the scenario shown in the diagram below, polling the input on frame 3 gives the value for event (**g**), while the values for events (**d**) (**e**) and (**f**) are discarded.
![image alt text](./Images/TimingInputsPerFrame.png)
Also use `Update` to poll for discrete on/off state changes using API such as [`WasPressedThisFrame`](../api/UnityEngine.InputSystem.InputAction.html#UnityEngine_InputSystem_InputAction_WasPressedThisFrame_) and **WasReleasedThisFrame**.
> [!NOTE]
> The input system doesn't detect multiple discrete on/off events that happen in a single frame when you use the poll driven approach. Multiple discrete on/off events might happen if your game is running at a low frame rate and a user repeatedly presses a button very rapidly, or if the user is using a type of game controller with a rapid "auto fire" mode. The polling technique also can't detect the order of multiple buttons were pressed on the same frame. Use event-driven input if you require this information.
### Event-driven technique
All events that occurred since the last frame are immediately processed before the current frame's `Update`, in the order that they were received. For continuously changing values (for example, multiple changing position values of a continuously moving gamepad stick), you might receive multiple events per frame with backdated timestamps indicating when they occurred between the last frame and the start of the current frame.
You can read and store input values from the input events in your event handler methods, and use those values to control your game in `Update`.
For example, in the scenario shown in the previous diagram, at the start of frame 3, you receive events for (**d**), (**e**), (**f**), and (**g**) and can process all of them in your game code.

Просмотреть файл

@ -0,0 +1,112 @@
# Optimize for fixed-timestep or physics-based scenarios
If you are working with the physics system or using `FixedUpdate` to control your game in a scenario where a small amount of input latency is acceptable (for example, a few frames), the simplest approach is to set the [input system update mode](./timing-select-mode.md) to **Process Events in Fixed Update**. This means your input code in `FixedUpdate` will operate as expected.
To get the minimum possible latency from the Input System and minimize lag, set the input system update mode to **Process Events in Dynamic Update**. However in doing this, you must understand how to avoid the problems which can arise when using this strategy. Although it might seem incorrect if you have code in `FixedUpdate`, for most cases, this approach minimizes lag compared with processing events in Fixed Update. The reasons for this are explained in detail on this page. Having a good understanding of how input is processed in each mode allows you to make your own decision about how best to process input for your particular project.
## Input in Fixed Update mode
When you set the input system update mode to **Process Events in Fixed Update**, input events are processed in groups according to whether their timestamp falls within the current fixed time step. There might be none, one, or multiple `FixedUpdate` calls processed per frame depending on how fast the game's frame rate is updating compared with the fixed update time step period.
If your games frame rate is running faster than the fixed time step period, you will have either zero or one `FixedUpdate` call per frame, depending whether the previous fixed time step has completed or not. If your games frame rate is running slower than the fixed time step period, you will have one or more `FixedUpdate` calls per frame \- as many as are required to catch up with the number of completed fixed time step periods that have elapsed.
You can learn more about how the player loop processes fixed update time steps in [Time and Framerate Management](https://docs.unity3d.com/Manual/TimeFrameManagement.html).
Its important to understand that Fixed Update provides a simulation of code running at fixed time deltas (the fixed time step), however it does not actually run at regular time intervals. Instead, at the start of each frame loop, Unity will run as many Fixed Update steps as is needed to catch-up to the current frames time. If a whole fixed time step hasn't completed yet, no Fixed Update steps occur. If more than one whole fixed time step has elapsed, more than one Fixed Update step occurs. This means that on each frame, the `FixedUpdate` method can be called a variable number of times (or even not at all) depending on how much time has elapsed since the last frame and the value set for the Fixed Update time step.
### When the frame rate runs faster than fixed time step duration
![image alt text](./Images/TimingFastFPS.png)
This diagram shows the frame rate running faster than the fixed update time step rate. Time progresses to the right, each frame is numbered, and shows its `Update` call at the start of the frame in orange. The fixed time step here is 0.02 seconds (50 times per second), and the game is running faster, at about 80 frames per second. In this situation there are some frames with one fixed update call, and some frames with none, depending on whether a full fixed update time step has completed by the time the frame starts. The fixed time step periods are marked with letters A, B, C, D, E, and the frames in which their corresponding fixed update calls occur are marked in green. The fixed update call for time step A occurs at the start of frame 4, the FixedUpdate call for time step B occurs at the start of frame 7, and so on.
### When the frame rate runs slower than the fixed time step duration
![image alt text](./Images/TimingSlowFPS.png)
This diagram shows the opposite scenario, when the fixed update cycle is running faster than the frame rate. The fixed time step here is 0.01 seconds (100 times per second), and the game frame rate is running slower, at about 40 frames per second. In this situation most frames have multiple fixed update calls before each update call, the number depending on how many whole update time steps have elapsed since the previous frame. The fixed update time step periods are marked with letters A, B, C, and so on, and frames in which their corresponding fixed update calls occur are marked in green. The fixed update call for time step A and B occurs at the start of frame 2, the fixed update call for frames C, D & E occur at the start of frame 3, and so on.
In both types of situation, whether the frame rate is running either faster or slower than the fixed time step, the start of the frame usually occurs somewhere part-way through a fixed time step interval. This means a portion of the most recent fixed time step period occurs before the frame, and some during the frame. Partially elapsed fixed time step periods like this aren't processed until the frame after they have fully elapsed.
## Implications for input lag in fixed time step mode
Because input that occurs during partially elapsed time steps isn't processed until the frame after the time step has fully completed, this has implications for increased input lag in fixed time step mode. There's almost always some amount of unprocessed time left between the end of the last fixed time step, and the start of the next frame. This means it's possible for input events to occur within that unprocessed time.
An example of an input event occurring during such unprocessed time is shown in this diagram:
![image alt text](./Images/TimingUnprocessedTime.png)
This diagram shows the frame rate running faster than the fixed update time step rate. Each frame is numbered (1 to 7), and shows its `Update` call at the start of the frame in orange. The fixed time step here is 0.02s (50 steps per second), and the game is running faster, at about 80 frames per second. In this situation there are some frames with one fixed update call, and some frames with none.
The diagram shows an input event (shown as a blue dot) that occurs during some unprocessed time during frame 3. Although the event occurs during frame 3, it's not processed in the fixed update input processing step at the start of frame 4 because it didn't occur during fixed time step (**A**). Instead, it occurred during fixed time step (**B**), which is processed at the start of frame 7 \- the first frame to occur after fixed time step (**B**) has completely elapsed.
This has the counterintuitive effect that the processing of input on frame 4 actually ignores some input that has already occurred on frame 3, because it's only processing events that occurred in the last complete fixed time step: (**A**).
## Minimize latency when using fixed update code
To minimize input latency in input code in `FixedUpdate` calls, set the input system update mode to **Process Events in Dynamic Update**, which eliminates the problem of unprocessed time described previously. You can then use an event-driven or polling technique to read your input without missing events that occurred after the last fixed timestep but before the current frame.
However, the **Process Events in Dynamic Update** mode might introduce the problem of missed or duplicate discrete events, such as attempting to read whether a button was pressed in a given frame. If you use this strategy, you must understand how to [avoid missed or duplicate events](./timing-missed-duplicate-events.md) in mixed timing scenarios requiring fixed and dynamic input.
### Event-driven input with fixed update code
For event-driven input, where the [Player Input component](./PlayerInput.md) calls events in your code, you should store the input values in variables which you can then read in your `FixedUpdate` call. For example:
```
using UnityEngine;
using UnityEngine.InputSystem;
public class ExampleScript : MonoBehaviour
{
Vector2 moveInputValue;
Rigidbody rigidBody;
public float moveForce = 10;
private void Start()
{
rigidBody = GetComponent<Rigidbody>();
}
public void OnMove(InputAction.CallbackContext context)
{
// in the event callback, we store the input value
moveInputValue = context.ReadValue<Vector2>();
}
private void FixedUpdate()
{
// in fixed update, we use the stored value for
// applying physics forces
rigidBody.AddForce(moveInputValue * moveForce);
}
}
```
### Polling input with fixed update code
For code where you're polling input action values, you can read the values directly from `FixedUpdate`:
```
using UnityEngine;
using UnityEngine.InputSystem;
public class ExampleScript : MonoBehaviour
{
InputAction moveAction;
Rigidbody rigidBody;
public float moveForce = 10;
private void Start()
{
moveAction = InputSystem.actions.FindAction("move");
}
private void FixedUpdate()
{
Vector2 moveInputValue = moveAction.ReadValue<Vector2>();
rigidBody.AddForce(moveInputValue * moveForce);
}
}
```

Просмотреть файл

@ -0,0 +1,15 @@
# Select an appropriate input processing mode
The Input System **Update Mode** controls when the input system processes queued input events.
You can find and change the Update Mode by going to **Project Settings** \> **Input System Package** \> **Input Settings** \> **Update Mode**.
The choice of Update Mode that best suits your project relates to whether you're using Update or FixedUpdate to respond to input events. You should choose this based on the specifics of the game you're making. You can read more about Update and FixedUpdate in [Time and Framerate Management](https://docs.unity3d.com/Manual/TimeFrameManagement.html).
## When a small amount of latency is not an issue
In cases where a small amount of input latency (a few frames) isn't an issue, set the update mode to match where you read your input. If your input code is in `Update` (usually non-physics-based scenarios), use **Process Events in Dynamic Update**. If your input code is in `FixedUpdate` (usually physics-based scenarios), use **Process Events in Fixed Update**.
## When minimum latency is a necessity
In cases where minimum latency is a necessity, set the update mode to **Process Events in Dynamic Update**, even if you're using code in FixedUpdate to apply physics forces based on input. This strategy comes with some additional issues that you must be aware of. Refer to the section [Optimizing for fixed-timestep scenarios](timing-optimize-fixed-update.md) for more information.