<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Renderer on Codigrowa Docs</title><link>https://codigrowa.batako.net/docs/rendering/</link><description>Recent content in Renderer on Codigrowa Docs</description><generator>Hugo</generator><language>ja-jp</language><atom:link href="https://codigrowa.batako.net/docs/rendering/index.xml" rel="self" type="application/rss+xml"/><item><title>GameCanvas / Renderer</title><link>https://codigrowa.batako.net/docs/rendering/game-canvas/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://codigrowa.batako.net/docs/rendering/game-canvas/</guid><description>&lt;p>&lt;code>components/game-canvas.tsx&lt;/code> は Game からのスナップショットを &lt;code>@shopify/react-native-skia&lt;/code> で描画するデモ実装です。エンジンの状態を UI に届ける際のベストプラクティスをまとめます。&lt;/p>
&lt;h2 id="初期化フロー">初期化フロー&lt;a class="anchor" href="#%e5%88%9d%e6%9c%9f%e5%8c%96%e3%83%95%e3%83%ad%e3%83%bc">#&lt;/a>&lt;/h2>
&lt;ol>
&lt;li>&lt;code>startGame({ reset: true })&lt;/code> を &lt;code>useEffect&lt;/code> で 1 度だけ呼び、GameLoop を開始。&lt;/li>
&lt;li>&lt;code>LinearMover&lt;/code> のような Entity をインスタンス化して &lt;code>game.addEntity()&lt;/code> で登録。&lt;/li>
&lt;li>クリーンアップ時に &lt;code>game.removeEntity(entity.id)&lt;/code> を忘れない。&lt;/li>
&lt;/ol>
&lt;h2 id="レンダリング購読">レンダリング購読&lt;a class="anchor" href="#%e3%83%ac%e3%83%b3%e3%83%80%e3%83%aa%e3%83%b3%e3%82%b0%e8%b3%bc%e8%aa%ad">#&lt;/a>&lt;/h2>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-ts" data-lang="ts">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">useEffect&lt;/span>(() &lt;span style="color:#f92672">=&amp;gt;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">const&lt;/span> &lt;span style="color:#a6e22e">unsubscribe&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">game&lt;/span>.&lt;span style="color:#a6e22e">onRender&lt;/span>((&lt;span style="color:#a6e22e">payload&lt;/span>) &lt;span style="color:#f92672">=&amp;gt;&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">renderPayloadRef&lt;/span>.&lt;span style="color:#a6e22e">current&lt;/span> &lt;span style="color:#f92672">=&lt;/span> &lt;span style="color:#a6e22e">payload&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">setRenderPayload&lt;/span>(&lt;span style="color:#a6e22e">payload&lt;/span>); &lt;span style="color:#75715e">// HUD 用に tick / elapsed / entityCount だけ更新
&lt;/span>&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">&lt;/span> });
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#66d9ef">return&lt;/span> &lt;span style="color:#a6e22e">unsubscribe&lt;/span>;
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}, [&lt;span style="color:#a6e22e">game&lt;/span>, &lt;span style="color:#a6e22e">setRenderPayload&lt;/span>]);&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>&lt;code>GameCanvas&lt;/code> は &lt;code>renderPayloadRef&lt;/code> に最新スナップショットを保持しつつ、Zustand には HUD で必要な &lt;code>tick/elapsed/entityCount&lt;/code> だけを流します。Skia の描画ノードは React ではなく「Entity ID → SharedValue ハンドル」へ直接書き込むため、Game の内部構造を UI から mutate する必要がありません。&lt;/p>
&lt;h2 id="scheduler-を使った-hud">Scheduler を使った HUD&lt;a class="anchor" href="#scheduler-%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f-hud">#&lt;/a>&lt;/h2>
&lt;p>&lt;code>GameCanvas&lt;/code> では &lt;code>game.schedule()&lt;/code> と &lt;code>game.wait()&lt;/code> を使い、定期ログと遅延ログを生成しています。&lt;code>setFunctionLogs&lt;/code> で最新 4 件だけ表示する仕組みは、Scheduler の動作確認に最適です。&lt;/p></description></item></channel></rss>