技術

PNaClでプログレッシブフォトンマッピング

expanded smallppmをベースとして、理解を深めるためかなりリファクタリングしながらPNaCl向けに移植しました。
PNaCl PPM
PNaCl使ってるので多分PCのGoogle Chrome専用になります。

そのうちソースも公開したいと思っていますが、誰からも反応がなかったら忘れてしまうかもしれません。

実はこれのEmscriptenバージョンや手書きのJavaScriptバージョンもあるのですが、Emscriptenバージョンはともかく手書きのJavaScriptバージョンは最近のPCでもスペックによってはGCが発生しまくったり仮想メモリを使いまくったりして昔のブラクラみたいな感じになってしまうので、お蔵入りとなりました。
2GBほどメモリが空いてれば大丈夫なんですけど、最近のPCでも特に安価なタブレット等では結構厳しい条件になるので…

Emscriptenバージョンは流石にヒープをJavaScriptのArrayBufferに構築するだけあってGCの問題がかなり減る感じではあるんですが、std::threadやpthreadが使えないらしく、まぁ使えたとしても現状のJavaScriptで似た機構というとWorkerになりますが、JavaScriptのWorkerとpthreadでは仕組みが違いすぎてて透過的な変換は出来ないはずです。
書くならなるべく素に近いC, C++を書きたいので…

その意味ではPNaClもPepper APIを使う必要があったりして、ローカルのマシンで動くコードをそのままリコンパイルしたらPNaCl対応になる、というわけでは全然なくて、この辺Emscriptenのほうが楽でさえあるんですが、やはり最終的にNativeなコードに変換されて実行されるという仕組みには利点が多いです。
例えばstd::threadやpthreadが普通に動きますし。
まぁ今回のはマルチスレッド対応じゃないんですけどw

EmscriptenとPNaClはよく比較される技術だと思うんですが、最終的に実行されるのは何か?という視点だとEmscripten(JavaScript(asm.js))よりPNaCl(Native)のほうが私は好きです。
JavaScriptで実行されるとなるとJavaScriptの制限、マルチスレッドが微妙とか、プリミティブ型の数値がdouble, int32_t, uint32_t相当の精度に限定されるとか、を受ける事になりますので。

ただ、ローカルのマシンで動く簡単なコマンドラインのプログラム等はたいていEmscriptenだとリコンパイルだけで動いたりするんですが、PNaClの場合は出力をブラウザに送るためにPepper APIを使い、ブラウザ側でもJavaScriptを使って出力を表示するコードを書く必要があります。
といっても、とりあえずで良ければPPAPI_SIMPLE_REGISTER_MAINを使えばC,C++側のコードは結構簡単に対応できそうではありますし、実はコマンドラインからChromeを起動すればPNaClプロセスのstdout, stderrが見れたりもしますし、コントローラブルなほうが良いという見方もあるでしょうけど、Emscriptenのほうが最初の一歩が楽なのは間違いないでしょう。

あと、Emscriptenだとasm.js対応のブラウザなら自動的にasm.jsとして高速に実行され、非対応ブラウザなら普通のJavaScriptとして実行される一方、現状PNaClはGoogle Chrome(しかもWin, Mac, Linux版のみ?)専用ですので、実行環境の多さという点ではEmscriptenの圧勝といって良いでしょう。
それに今はGoogleに囲い込まれたくない人も多いでしょうし。

PNaCl非対応環境対策としてpepper.jsという手もありますが、今pepper.jsのGitHubをチラ見した感じだと普通にEmscripten使ってるみたいなので、それなら最初からEmscriptenを使ったほうが…w

あと、インターネットのあらゆる検索結果から推測するにPNaClに興味を示している開発者の数はかなり少ないです。
それを言うとEmscriptenもガチで使ってるような人の情報は少ないんですけど、PNaClよりはまだ多い感があります。

とまぁこんな風に、色んな意味で結構厳しい感があるPNaClですが、やはり最終的にネイティブコードを実行するという仕組みは好きです。
なので、対応環境が広まってくれると良いなぁ。
もしくはJavaScriptの微妙な点が解消されて(ES7あたりになるんでしょうか…)Emscripten的な仕組みでも問題ないと思えるようになると良いなぁ。
もっと言うと手書きでも大規模開発や実行時の最適化がされやすい言語仕様にJavaScriptが生まれ変わってくれると良いんですけど、もうそれ別言語よね…
別言語でも個人的には全然構わないですけどね。あとは対応環境次第…

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください