function GLoop(id) {
// 1. 世界の時間軸を更新(ID:0の責任)
if (id === 0) {
data = data.merge({ prop: { time: data.property.prop.time + 1 } });
// 描画準備
context.fillStyle = 'rgb(0,0,0)';
context.fillRect(0,0,600,600);
}
// 2. 共通データから現在の状態を読み取る
const p = data.property.prop;
const as = p.ArcStates;
const currentTime = p.time;
// 3. 自分の座標を計算
const x = Math.sin(currentTime * p.ArcSpeeds[id] * 2 * Math.PI / 180) * 150 + 300;
as[id].pos = [x, as[id].pos[1]];
// 4. 新しい状態を不変データとしてマージ
data = data.merge({ prop: { ArcStates: as }});
// 5. 描画と次フレームの予約
DrawArc(id);
TMan.timer[id].setalerm(function() { GLoop(id); }, 50);
}
「WinMainとスレッドの関係を、JSの不変データ管理(ManagedClass)で再構築する。 排他制御(Mutex)に悩まされた日々への、2026年なりの回答です。」
今回のマルチスレッド風テストでは、「タイマー(実行体)」と「ManagedClass(データ)」を完全に分離しました。
merge のたびに新しいインスタンスを生成します。
もしタイマーをその中に入れると、マージの瞬間に「実行中の関数接続」が切れ、命が止まってしまうからです。
N6LVector のような複雑なクラスでもメソッドを保持したままマージ可能であることが分かりました。
これは将来、ポリゴン人形のような膨大なパラメータ管理にも応用可能です。
ManagedClassを使用する際は、まず「デフォルトのプロパティ」を定義し、その後にインスタンスを生成します。
// 1. プロパティの器(テンプレート)を用意
MyManagedClassDefaultProperty = {
variablename: "CharacterData",
prop: { hp: 100, position: new N6LVector([0,0,0]) }
};
// 2. インスタンス化
var data = new MyManagedClass();
データを更新する際は merge メソッドを使用します。第一引数に「変更したい差分」を渡し、第二引数(任意)でディープマージの可否を選択します。
// 基本:HPだけを更新(他の値は維持される)
data = data.merge({ prop: { hp: 90 } });
// 応用:ネストされたオブジェクトの特定階層だけを上書き
data = data.merge({ prop: { position: newPos } }, true);
clone() メソッドが実装されていないと、マージの際にプロトタイプが剥がれ、ただの Object になり計算メソッドが消滅します。merge は「変更のない枝」の参照をそのままコピーします。配列などを直接破壊的に操作(as[id].pos = ...)すると、不変性が崩れる可能性があるため、厳密に扱う場合は一度スライス等でコピーしてからマージすることを推奨します。data.merge(...) は元の data を書き換えません。必ず data = data.merge(...) と戻り値を再代入してください。
ManagedClassは不変性を守るため、内部的に配列を「インデックス付きオブジェクト」として保持します。これを標準的な配列として取り出し、forEachなどの配列メソッドを使用したい場合は、toArrayIfIndexedを使用します。
// 内部では {0: "ball", 1: "glove"} という構造
const itemsObj = data.property.profile.items;
// 配列に変換(force=true を推奨)
const itemsArray = toArrayIfIndexed(itemsObj, true);
// 配列操作が可能になる
itemsArray.forEach(item => console.log("所持品:", item));
【教訓】 命(タイマー)をコピーしてはいけない。器(データ)だけを新しく作り替え続けるのが、モダンな不変データ管理の鉄則です。
以下のフレーム内で、実際に ManagedClass がどのようにデータを複製し、
不変性を保ちながらマージ(成長)していくかをリアルタイムで確認できます。






