onitama / OpenHSP

Hot Soup Processor (HSP3)
https://hsp.tv
BSD 3-Clause "New" or "Revised" License
177 stars 21 forks source link

JS版でのユーザー定義関数内wait/await #21

Open zakki opened 3 years ago

zakki commented 3 years ago

現状はユーザー定義関数の実行が無限ループ内で行われるので動作が止まってしまいます。 具体的にはこういったコードで、ユーザー定義関数内で有効な操作があるまで画面更新を行わずawaitループを回すようなプログラムが動きません。 https://github.com/AmefuriTell/amayadori/blob/a5ff39165aac7b11b731e3dd37e5da49ecab1ab9/reversi/Reversi.hsp

解決案の一つとしてはasyncifyを使うと大きな変更なく上のようなプログラムも動くようになりました。 ただし、出力されるhsp3dish.jsのサイズが元の1.9Mから2.4MBに増えました。 これは、asyncifyを適用する関数をコンパイル時に指定すれば軽減できるそうです。 https://github.com/onitama/OpenHSP/compare/master...zakki:em-asyncify

他の対応として素直にはcode_callfunc()内で実行せずに親側で実行することも考えられますが、手を入れる必要のある個所が多そうです。

onitama commented 3 years ago

ご提案ありがとうございます。参考にさせて頂きます。

zakki commented 2 years ago

Asyncify版を更新しました。

  1. メインループをAsyncify+emscripten_sleep()
    • ユーザー定義関数やイベント処理の挙動や実装がWindowsやLinuxに近くなる
    • requestAnimationFrame は使えなくなり独自にフレームレートの管理が必要
    • Asyncifyのオーバーヘッド分、hsp3dish.jsが大きくなる
  2. ファイル読み込み時にファイルがなければサーバーから同期的にファイル取得
    • 必要な分だけファイルをダウンロードされる
    • htmlやdataファイルの生成なしでもサーバーに必要なファイルを置くだけ
    • 個別ファイルを取得するのでhttpのリクエスト数が増える

全体的にWindows向けとWeb向けを共通で開発するにはメリットが多いと思いますが、Web特化だとデメリットもあります。