2012/10/16

SDLを用いたC++ソースをEmscriptenでHTML+JavaScriptに変換する

以前の記事「Emscriptenを用いてC++ソースをJavaScriptに変換する」ではCで書かれたHello worldをコンパイルさせただけでしたが、EmscriptenではSDLを使ったソースをコンパイルしてHTML/Canvas+JavaScriptに変換することができます。

そこで、今回は昔作ったSDLのCプログラムを変換させてみました。そのときの注意点をいくつか挙げます。

SDLを含んだソースはemscriptenのコマンドラインオプションになにか追加する必要もなく普通にコンパイルできます。

ただし、次の点に注意しないと、実行時にエラーになったりします。

ループの書き変え

まず、SDL_Delayを使うのが禁止されています。利用した場合は実行時に次のようなエラーを出力します。

Uncaught SDL_Delay called! Potential infinite loop, quitting. Error

Emscripten browser environmentによると、emscripten_set_main_loopを使って次のように書き変えてくれとのこと。 第2引数はfpsを指定します。

int main() {
  ...
#ifdef EMSCRIPTEN
  emscripten_set_main_loop(one_iter, 16);
#else
  while (1) {
    one_iter();
    SDL_Delay(time_to_next_frame());
  }
#endif
}

void one_iter() {
  // process input
  // render to screen
}

サーフェスのロック

サーフェスによっては不要なので、個人的には結構省いてしまっていたのですが、 surface->pixels あたりを触るときには、SDL_LockSurface, SDL_UnlockSurfaceは必須のようです。

変換後サンプル

というわけで、昔作ったライフゲーム のファジィ版を変換してみました。Cでの高速化のために固定小数点数を利用したせいか、-O1 でさえも正常実行できないので -O0 での変換結果です。

初期状態とフィールドサイズが違うだけで実行内容は同じです。

Emscriptenのは16fpsに指定していますが、6fpsくらいしか出ていない気がします。

おわりに

SDLを利用したCソースをコンパイルするときの注意点を挙げました。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。