JavaScript は WeakRef を持っていて凄いと感動したけど、調べたら結構いろんなメジャー言語に既に実装されているのか・・・
JavaScript は WeakRef を持っていて凄いと感動したけど、調べたら結構いろんなメジャー言語に既に実装されているのか・・・
既に持っているアセットの多重ロードが走らないように、ローディングのプロミスをキャッシュするようにした。
https://github.com/kt3k/bw/commit/d5959e25be58db586b876ff1bd2a7f8a488b4caf
単純にキャッシュしてしまうと、全てメモリ上に乗ってしまって良くない。オープンワールドを想定しているので、フィールドは無限に広くて、すべてのオブジェクトがメモリには乗らない想定なので。
不要なロードは避けつつ今必要なアセット以外は適切に回収されるように、アセットを WeakRef としてキャッシュする仕組みを入れた。これによって「今使われているアセット」は全てキャッシュに乗っていて「誰も使わなくなったアセット」が自然に回収されるようになった。
bw、アセットの GC を考えた時に、自分で GC を実装するのは不毛なので、言語自体に GC させたいため、AssetManager がアセットの管理をするのではなくて、アセットを使うクラス自体に自分で自分のアセットを管理させる仕組みに変えた。
https://github.com/kt3k/bw/commit/773db5ef68ff4c09f64430543517f79b3743bb7a
この実装にしたことで、使っているアセットをメモリ解放したい場合は、その親のクラス自体を破棄すれば使ってるアセットも自動的に破棄される。あとは LoadScope の範囲パラメーターの調整で運用できる範囲をうまく見つければ良い
Rust って異なる trait が同じ名前のメソッドを定義していても問題なく両方実装できるらしい。なるほど
cell の on
ヘルパーのインターフェースを
on.click = (e: Event) => {}
から
on("click", (e: Event) => {})
に変えた。こちらの方が、素直で分かりやすい気がするのと、まだやっていないけど、この signature だとイベント名からイベントオブジェクトの型を推論させられる (touchmove
イベントだったら e
が TouchEvent
に出来る、等) ので、より便利に出来そうというのが主なモチベーション。
icfpc で 3d 言語というのが出題され(?)て、2次元配置型言語 (befunge 的なものと思って良いのかな・・?) で時間遡行概念が取り入れられていたらしい・・・気になる
スクラップボックス、芋蔓式にいろんな事を思い出せるのは良いのだけど、そのせいでいつも同じところに考えが収束してしまいがちになる問題があると思う。
ある程度過去の情報と切り離して考えたい時でも、過去の情報が強制的に目に入ってくるので、そのせいで気が散ってしまうと感じることが多くなってきた。
実際ギリシャ人が直接コミュニケーションが取れたのはペルシア戦争で戦ったペルシア人たちだろうから、きっとヘロドトスはメディア側から見た情報にアクセス出来ていないのではないか?
メディア人たちは、メディア王国滅亡の影響で、殺されたり、奴隷に身分を落とされたりで、ペルシア帝国内では、ほとんど発言権がなかったであろうから、ヘロドトスがアクセス出来たのはあくまでペルシア人から見たペルシアの歴史の話であって、メディア側の見解は含まれていないのではないか?
そう考えると、アステュアゲスの暴虐さは少し差し引いて考えないといけないかもしれないし、キュロスがあっさりメディアを征服している事はむしろ、思い出したくない辛い出来事があったことの裏返しなのではないか?
最近ヘロドトス歴史を読み直してる。キュロスがアステュアゲスに捨てられてから、叛逆してメディアを征服するあたりから。
キュロスが捨てられる過程の話はとても詳細に語られるけれど、キュロスが挙兵して最終的にメディアを征服するまでの過程がほとんどまるっきり省略されているのがとても気になる。本来なら、この間にも膨大な量のストーリーがあったはず。
この辺の詳細はギリシアまではあまり伝わらなかったのだろうか・・・?