<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="1.8.15">
  <compounddef id="fibers_8md" kind="file" language="Markdown">
    <compoundname>fibers.md</compoundname>
    <briefdescription>
    </briefdescription>
    <detaileddescription>
    </detaileddescription>
    <programlisting>
<codeline><highlight class="normal">Fibers</highlight></codeline>
<codeline><highlight class="normal">======</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">A<sp/>[Fiber](@ref<sp/>SpicyPixel.Threading.Fiber)<sp/>is<sp/>a<sp/>lightweight<sp/>means<sp/>of<sp/>scheduling<sp/>work<sp/>that<sp/>enables<sp/>multiple<sp/>units<sp/>of<sp/>processing<sp/>to<sp/>execute<sp/>concurrently<sp/>by<sp/>co-operatively<sp/>sharing<sp/>execution<sp/>time<sp/>on<sp/>a<sp/>single<sp/>thread.<sp/>Fibers<sp/>are<sp/>also<sp/>known<sp/>as<sp/>&quot;micro-threads&quot;<sp/>and<sp/>can<sp/>be<sp/>implemented<sp/>using<sp/>programming<sp/>language<sp/>facilities<sp/>such<sp/>as<sp/>&quot;coroutines&quot;.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Fibers<sp/>simplify<sp/>many<sp/>concurrency<sp/>issues<sp/>generally<sp/>associated<sp/>with<sp/>multithreading<sp/>because<sp/>a<sp/>given<sp/>fiber<sp/>has<sp/>complete<sp/>control<sp/>over<sp/>when<sp/>it<sp/>yields<sp/>execution<sp/>to<sp/>another<sp/>fiber.<sp/>A<sp/>fiber<sp/>does<sp/>not<sp/>need<sp/>to<sp/>manage<sp/>resource<sp/>locking<sp/>or<sp/>handle<sp/>changing<sp/>data<sp/>in<sp/>the<sp/>same<sp/>way<sp/>as<sp/>a<sp/>thread<sp/>does<sp/>because<sp/>access<sp/>to<sp/>a<sp/>resource<sp/>is<sp/>never<sp/>preempted<sp/>by<sp/>another<sp/>fiber<sp/>without<sp/>co-operation.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Fibers<sp/>can<sp/>improve<sp/>performance<sp/>in<sp/>certain<sp/>applications<sp/>with<sp/>concurrency<sp/>requirements.<sp/>Because<sp/>many<sp/>fibers<sp/>can<sp/>run<sp/>on<sp/>a<sp/>thread,<sp/>this<sp/>can<sp/>relieve<sp/>pressure<sp/>on<sp/>precious<sp/>resources<sp/>in<sp/>the<sp/>thread<sp/>pool<sp/>and<sp/>reduce<sp/>latency.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Additionally,<sp/>some<sp/>applications<sp/>have<sp/>concurrent,<sp/>interdependent<sp/>processes<sp/>that<sp/>naturally<sp/>lend<sp/>themselves<sp/>to<sp/>co-operative<sp/>scheduling<sp/>which<sp/>can<sp/>result<sp/>in<sp/>greater<sp/>efficiency<sp/>when<sp/>the<sp/>application<sp/>manages<sp/>the<sp/>context<sp/>switch<sp/>instead<sp/>of<sp/>a<sp/>pre-emptive<sp/>scheduler.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Fibers<sp/>can<sp/>also<sp/>be<sp/>a<sp/>convenient<sp/>way<sp/>to<sp/>express<sp/>a<sp/>state<sp/>machine.<sp/>The<sp/>master<sp/>fiber<sp/>implementing<sp/>the<sp/>machine<sp/>can<sp/>test<sp/>state<sp/>conditions,<sp/>start<sp/>new<sp/>fibers<sp/>for<sp/>state<sp/>actions,<sp/>yield<sp/>to<sp/>an<sp/>action<sp/>fiber<sp/>until<sp/>it<sp/>completes,<sp/>and<sp/>then<sp/>handle<sp/>the<sp/>transition<sp/>out<sp/>of<sp/>the<sp/>state<sp/>and<sp/>into<sp/>a<sp/>new<sp/>state.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Starting<sp/>a<sp/>fiber</highlight></codeline>
<codeline><highlight class="normal">----------------</highlight></codeline>
<codeline><highlight class="normal">A<sp/>fiber<sp/>can<sp/>be<sp/>created<sp/>and<sp/>started<sp/>on<sp/>the<sp/>default<sp/>scheduler<sp/>for<sp/>the<sp/>thread<sp/>as<sp/>follows.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">Fiber.StartNew(()<sp/>=&gt;<sp/>DoTask());</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">It<sp/>is<sp/>also<sp/>possible<sp/>to<sp/>more<sp/>precisely<sp/>control<sp/>startup<sp/>and<sp/>scheduler<sp/>options.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">var<sp/>fiber<sp/>=<sp/>new<sp/>Fiber(()<sp/>=&gt;<sp/>DoTask());<sp/>//<sp/>create<sp/>the<sp/>fiber</highlight></codeline>
<codeline><highlight class="normal">fiber.Start(myCustomScheduler);<sp/>//<sp/>queue<sp/>for<sp/>execution<sp/>by<sp/>a<sp/>custom<sp/>scheduler</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline><highlight class="normal">Using<sp/>coroutines</highlight></codeline>
<codeline><highlight class="normal">----------------</highlight></codeline>
<codeline><highlight class="normal">A<sp/>coroutine<sp/>is<sp/>a<sp/>function<sp/>that<sp/>can<sp/>yield<sp/>execution<sp/>to<sp/>another<sp/>function<sp/>and<sp/>this<sp/>allows<sp/>multiple<sp/>functions<sp/>to<sp/>execute<sp/>concurrently<sp/>on<sp/>the<sp/>same<sp/>thread<sp/>by<sp/>co-operatively<sp/>yielding<sp/>execution<sp/>time.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Coroutines<sp/>must<sp/>return<sp/>an<sp/>IEnumerator<sp/>type<sp/>and<sp/>have<sp/>one<sp/>or<sp/>more<sp/>yield<sp/>statements<sp/>that<sp/>passes<sp/>a<sp/>yield<sp/>instruction<sp/>back<sp/>to<sp/>the<sp/>fiber<sp/>scheduler.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">void<sp/>Main()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>Fiber.StartNew(FadeOutCoroutine());</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>FadeOutCoroutine()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>totalTime<sp/>=<sp/>4f;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>currentTime<sp/>=<sp/>totalTime;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>while(currentTime<sp/>&gt;<sp/>0f)</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>setAlpha(currentTime<sp/>/<sp/>totalTime);<sp/>//<sp/>fade<sp/>out</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>currentTime<sp/>-=<sp/>Time.deltaTime;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>yield<sp/>return<sp/>FiberInstruction.YieldToAnyFiber;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Waiting<sp/>for<sp/>completion</highlight></codeline>
<codeline><highlight class="normal">----------------------</highlight></codeline>
<codeline><highlight class="normal">One<sp/>fiber<sp/>can<sp/>wait<sp/>for<sp/>completion<sp/>of<sp/>another<sp/>by<sp/>yielding<sp/>the<sp/>[YieldUntilComplete](@ref<sp/>SpicyPixel.Threading.YieldUntilComplete)<sp/>instruction<sp/>returned<sp/>by<sp/>[Start](@ref<sp/>SpicyPixel.Threading.Fiber.Start).</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">void<sp/>Main()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>Fiber.StartNew(Fiber1());</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>Fiber1()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>Console.Out.WriteLine(“Beginning<sp/>Fiber<sp/>1<sp/>and<sp/>waiting<sp/>for<sp/>Fiber<sp/>2<sp/>to<sp/>complete”);</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>yield<sp/>return<sp/>Fiber.StartNew(Fiber2());</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>Console.Out.WriteLine(“Fiber<sp/>2<sp/>has<sp/>completed.);</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>Fiber2()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>//<sp/>Do<sp/>work</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>while(!workDone)</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>Process();</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/><sp/><sp/><sp/><sp/>yield<sp/>return<sp/>FiberInstruction.YieldToAnyFiber;</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>}</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Starting<sp/>a<sp/>fiber<sp/>scheduler</highlight></codeline>
<codeline><highlight class="normal">--------------------------</highlight></codeline>
<codeline><highlight class="normal">Fiber<sp/>coordination<sp/>and<sp/>execution<sp/>is<sp/>handled<sp/>by<sp/>a<sp/>[FiberScheduler](@ref<sp/>SpicyPixel.Threading.FiberScheduler).<sp/>The<sp/>default<sp/>system<sp/>scheduler<sp/>can<sp/>be<sp/>started<sp/>on<sp/>the<sp/>running<sp/>thread<sp/>as<sp/>follows.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">void<sp/>Main()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>FiberScheduler.Current.Run(new<sp/>Fiber(MainFiber()));</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>MainFiber()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>//<sp/>do<sp/>work</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">Starting<sp/>a<sp/>fiber<sp/>scheduler<sp/>on<sp/>a<sp/>new<sp/>thread</highlight></codeline>
<codeline><highlight class="normal">------------------------------------------</highlight></codeline>
<codeline><highlight class="normal">It<sp/>is<sp/>often<sp/>more<sp/>convenient<sp/>to<sp/>start<sp/>a<sp/>fiber<sp/>scheduler<sp/>on<sp/>a<sp/>new<sp/>thread.<sp/>The<sp/>[SystemFiberScheduler](@ref<sp/>SpicyPixel.Threading.SystemFiberScheduler)<sp/>has<sp/>convenience<sp/>methods<sp/>to<sp/>create<sp/>the<sp/>scheduler<sp/>on<sp/>a<sp/>new<sp/>thread<sp/>and<sp/>return<sp/>a<sp/>reference.</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">```{.cs}</highlight></codeline>
<codeline><highlight class="normal">void<sp/>Main()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/><sp/><sp/>var<sp/>scheduler<sp/>=<sp/>SystemFiberScheduler.StartNew(new<sp/>Fiber(MainFiber()));</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline></codeline>
<codeline><highlight class="normal">IEnumerator<sp/>MainFiber()</highlight></codeline>
<codeline><highlight class="normal">{</highlight></codeline>
<codeline><highlight class="normal"><sp/><sp/>//<sp/>do<sp/>work</highlight></codeline>
<codeline><highlight class="normal">}</highlight></codeline>
<codeline><highlight class="normal">```</highlight></codeline>
    </programlisting>
    <location file="Docs/fibers.md"/>
  </compounddef>
</doxygen>
