4号館物語外伝公開間近
2005年12月22日漢字だらけで長いタイトルですが、シナリオ・キタノハツコさんと共同企画の4号館物語外伝が公開間近となりました。
一応、エンディングの曲の使用許可が下りればあとは、サイトと一緒に公開するだけです。
いや、しかし長かったです。そして、募集当初僕が予想していたよりも活動の規模が大きくなりました。
7月の募集の時点ではIlaliartでのプログラム製作活動を手助けしてくれる方数人と一緒に活動してゆくつもりだったのですが、予想以上にレベルの高い方が沢山集まって下さったため、ただの製作活動ではなく、きちっとした枠組みの中でやってゆこうということでサークル新設に至り、多くの方の協力を経てなんとか一作品上げることができました。
まだサークル名、サイト等公にはしていませんが、もう少しで公開できそうです。
少し早いですが、サークルメンバーの皆さん、本当にお疲れ様でした。まだHoneycombやHornetの開発は序盤なためこれからも色々ご迷惑かけるとは思いますが、どうぞよろしくお願いします。
一応、エンディングの曲の使用許可が下りればあとは、サイトと一緒に公開するだけです。
いや、しかし長かったです。そして、募集当初僕が予想していたよりも活動の規模が大きくなりました。
7月の募集の時点ではIlaliartでのプログラム製作活動を手助けしてくれる方数人と一緒に活動してゆくつもりだったのですが、予想以上にレベルの高い方が沢山集まって下さったため、ただの製作活動ではなく、きちっとした枠組みの中でやってゆこうということでサークル新設に至り、多くの方の協力を経てなんとか一作品上げることができました。
まだサークル名、サイト等公にはしていませんが、もう少しで公開できそうです。
少し早いですが、サークルメンバーの皆さん、本当にお疲れ様でした。まだHoneycombやHornetの開発は序盤なためこれからも色々ご迷惑かけるとは思いますが、どうぞよろしくお願いします。
wxGLCanvas
2005年12月17日wxDCを利用した画面描画は遅いので、wxGLCanvasを利用して可能な限り高速に画面描画ができないかどうか試してみた。
とりあえず、テクスチャを生成してgl*PointerとglDrawArraysで頂点配列をストリーム化したものをコンパイルして表示。
他の2D描画のためのコマンド類はディスプレイリストに突っ込んで呼ぶようにすることで、800x600x24の画像は5(ms)程度で画面へ転送できるようになった。
しかし、5(ms)は遅い。
SDLでGLを使った場合は、ダブルバッファ使っているにも関わらず、1(ms)かからなかった。それがwxGLCanvasでは5(ms)、かなり遅い。
何か原因がありそうなので、色々と調べてみたら、テクスチャ生成時に大掛かりなメモリーコピーをやっており(画面切り替えのためのソフトウェアサーフェース確保とそのテクスチャのバッファリング)、このためキャッシュミスが発生して画面への描画が遅くなっていたようだ。
この処理を省くと、1(ms)描画にかからなくなった(これに関連して、当初自分は頂点サブミット等がホットスポットになっていると勘違いしていた。実際はそうではなく、どうもテクスチャ生成に問題があったよう)。
とりあえず、今後はwxGLCanvasがどの程度他の環境で動くかを確かめた上で、テクスチャサイズの分割(大き目のテクスチャサイズがサポートされていない環境への対策)と、テクスチャの動的書き換えの高速化をやってみようと思う。
とりあえず、テクスチャを生成してgl*PointerとglDrawArraysで頂点配列をストリーム化したものをコンパイルして表示。
他の2D描画のためのコマンド類はディスプレイリストに突っ込んで呼ぶようにすることで、800x600x24の画像は5(ms)程度で画面へ転送できるようになった。
しかし、5(ms)は遅い。
SDLでGLを使った場合は、ダブルバッファ使っているにも関わらず、1(ms)かからなかった。それがwxGLCanvasでは5(ms)、かなり遅い。
何か原因がありそうなので、色々と調べてみたら、テクスチャ生成時に大掛かりなメモリーコピーをやっており(画面切り替えのためのソフトウェアサーフェース確保とそのテクスチャのバッファリング)、このためキャッシュミスが発生して画面への描画が遅くなっていたようだ。
この処理を省くと、1(ms)描画にかからなくなった(これに関連して、当初自分は頂点サブミット等がホットスポットになっていると勘違いしていた。実際はそうではなく、どうもテクスチャ生成に問題があったよう)。
とりあえず、今後はwxGLCanvasがどの程度他の環境で動くかを確かめた上で、テクスチャサイズの分割(大き目のテクスチャサイズがサポートされていない環境への対策)と、テクスチャの動的書き換えの高速化をやってみようと思う。
wxImage->wxBitmap変換
2005年12月14日昨日のwxImage->wxBitmapへの変換だが、どうも
wxBitmap(void* data, int type, int width, int height, int depth = -1);
と
wxBitmap(const wxImage& img, int depth = -1);
で処理時間が変わってくるようだ。
マニュアルでは
wxBitmap( const wxImage&img, int depth = -1) Creates bitmap object from the image. This has to be done to actually display an image as you cannot draw an image directly on a window. The resulting bitmap will use the provided colour depth (or that of the current system if depth is -1) which entails that a colour reduction has to take place. When in 8-bit mode (PseudoColour mode), the GTK port will use a color cube created on program start-up to look up colors. This ensures a very fast conversion, but the image quality won’t be perfect (and could be better for photo images using more sophisticated dithering algorithms). On Windows, if there is a palette present (set with SetPalette), it will be used when creating the wxBitmap (most useful in 8-bit display mode). On other platforms, the palette is currently ignored.
と書かれている。このコンストラクタはwxImage->wxBitmapの変換を高速に行ってくれるが、変換のアルゴリズムはあまり良くないらしい。フォトイメージに関してはもっと優れたディザリングアルゴリズムを用いるべきだとも書いてある。
一応、検証してみたが後者は、前者の二倍近い高速化が昨日と同様の環境で確認できた(24(ms)->12(ms))。
画面で見た感じ、イメージの劣化は特に感じられなかった(適当な推論ではあるが)。
で、今頃気付いたのだが、デバッグモードでコンパイルした速度を測定したいたので、とりあえずリリースモードでコンパイルした場合の測定結果も示しておく。
リリースモードでは、平均して8(ms)程度で変換が可能だった。fpsでは125程度。なかなかの数値だと思う。
試しに、少し遅めのマシンでも試してみた。CPUはPentiumIII500MHz、WindowsXPのマシンでは同様のプログラムでの測定結果は20(ms)となった。fpsでは50fpsとなる。うーむ、これくらいならいけるんじゃないだろうか。
wxBitmap(void* data, int type, int width, int height, int depth = -1);
と
wxBitmap(const wxImage& img, int depth = -1);
で処理時間が変わってくるようだ。
マニュアルでは
wxBitmap( const wxImage&img, int depth = -1) Creates bitmap object from the image. This has to be done to actually display an image as you cannot draw an image directly on a window. The resulting bitmap will use the provided colour depth (or that of the current system if depth is -1) which entails that a colour reduction has to take place. When in 8-bit mode (PseudoColour mode), the GTK port will use a color cube created on program start-up to look up colors. This ensures a very fast conversion, but the image quality won’t be perfect (and could be better for photo images using more sophisticated dithering algorithms). On Windows, if there is a palette present (set with SetPalette), it will be used when creating the wxBitmap (most useful in 8-bit display mode). On other platforms, the palette is currently ignored.
と書かれている。このコンストラクタはwxImage->wxBitmapの変換を高速に行ってくれるが、変換のアルゴリズムはあまり良くないらしい。フォトイメージに関してはもっと優れたディザリングアルゴリズムを用いるべきだとも書いてある。
一応、検証してみたが後者は、前者の二倍近い高速化が昨日と同様の環境で確認できた(24(ms)->12(ms))。
画面で見た感じ、イメージの劣化は特に感じられなかった(適当な推論ではあるが)。
で、今頃気付いたのだが、デバッグモードでコンパイルした速度を測定したいたので、とりあえずリリースモードでコンパイルした場合の測定結果も示しておく。
リリースモードでは、平均して8(ms)程度で変換が可能だった。fpsでは125程度。なかなかの数値だと思う。
試しに、少し遅めのマシンでも試してみた。CPUはPentiumIII500MHz、WindowsXPのマシンでは同様のプログラムでの測定結果は20(ms)となった。fpsでは50fpsとなる。うーむ、これくらいならいけるんじゃないだろうか。
wxBufferedPaintDCでのwxBitmap画面描画
2005年12月13日先日のwxSDLに関する話で、wxBufferedPaintDCを利用したwxBitmapの描画に関してどの程度の時間がかかるのかをいくつかのブロックにわけて測定してみた。
まず、そもそもwxBitmapは直接ポインタをもらってきて編集というわけにはいかないので、DeviceIndependentなwxImageからDeviceDependentなwxBitmapへ変換する過程が必要となる。これを考慮した上で画面へのサーフェースの変換は次のような過程を通ることになる。
1.wxImage->wxBitmapへの変換
2.wxBitmap->wxBufferedPaintDC
この二つの変換だが、AthlonXP2000+で画面は800x600x32で1.が20(ms)程度、2.が1(ms)かかるかかからないか程度となった。
つまり、1.2.にかかる処理時間をfpsに直すと50fpsとなる。
実用には程遠い数値…
ネックとなるのは1.の過程で、ここを最低でも5(ms)程度に抑えたい。OS依存出よいのであればいくらでも解決方法はあるんだが…うーん。
まず、そもそもwxBitmapは直接ポインタをもらってきて編集というわけにはいかないので、DeviceIndependentなwxImageからDeviceDependentなwxBitmapへ変換する過程が必要となる。これを考慮した上で画面へのサーフェースの変換は次のような過程を通ることになる。
1.wxImage->wxBitmapへの変換
2.wxBitmap->wxBufferedPaintDC
この二つの変換だが、AthlonXP2000+で画面は800x600x32で1.が20(ms)程度、2.が1(ms)かかるかかからないか程度となった。
つまり、1.2.にかかる処理時間をfpsに直すと50fpsとなる。
実用には程遠い数値…
ネックとなるのは1.の過程で、ここを最低でも5(ms)程度に抑えたい。OS依存出よいのであればいくらでも解決方法はあるんだが…うーん。
wxWidgetsにSDLをポーティング
2005年12月12日吉里吉里3がwxWidgetsを使用するとのことなので、何かの役に立つかもしれないためwxWidgetsのWidgetとしてSDLのラッピングを始めようと思います。下、参考URL。
http://code.technoplaza.net/wx-sdl/
また、SDLのライセンスが変更されるかもしれないのも大きな理由。
http://www.libsdl.org/pipermail/sdl/2005-October/070939.html
Samさんが言うには、開発キット・もしくはOS付近(この定義が曖昧なのでちょっと微妙なんですが)にSDLを利用する場合はLGPLの再リンクの項(多分6-a項のことを言っているのだと思う)を適用せず、代替となるライセンスを提供しようと考えているそうです。
代替となるライセンスは、SDLプロジェクトのクレジットと、ライブラリの変更点を記載すれば基本的に自由に使ってよいというものにしたいと考えているようで、じぶんとしてはかなり期待しています。BSDライセンス・zlibライセンス辺りがいいんじゃないかなと思います。
SDLプロジェクトに参加している人で、これに関して不満がある人は自分にメールくれだそうです。
一応、このスレッドは今読んでいるのですが、結構な数の返信があってまだ読みきれていない状態です。
その他にも移植する理由はいくつかあるのですが
・SDLは標準ではマルチディスプレイ(ウィンドウ)をサポートしていない
・文字列関連、GUI関連が壊滅的に弱い
などが上げられます。
これらの弱点を補う上で、wxWidgetsはかなり良い線行っていると思います。
バイナリサイズは大きくなってしまいますが、デバッグ機能の充実やGUIを用いたSDLだけでは不可能な機能の追加ができ、この欠点を十二分に補うだけの価値があると思います。
ただ、気になるのは上記URLサンプルでSDL_Surfaceを
// create a bitmap from our pixel data
wxBitmap bmp(wxImage(screen->w, screen->h,
static_cast(screen->pixels), true));
このようにしてwxBitmapに変換後
// paint the screen
wxBufferedPaintDC dc(this, bmp);
として画面に反映していますが、これがどの程度の時間がかっているのか気になるところ。
それと、当たり前だがSDLの生成するウィンドウを利用しないためウィンドウ関連のイベントは標準イベント関数では受け取れないため、イベント関連はwxWidgetsのEVT_*でウィジットから受け取る必要があります。
SDLのウィンドウそのものはwxPanelを継承したwxSDLPanelで置き換えられ、ウィンドウを利用したいならwxSDLPanelを内包したフレームであるwxSDLFrameを使ってもらおうと今の所は考えています。
イベント関連は組み込み言語で呼ぶことも考えて、wxのイベントテーブルは用いずに独自のイベントキューをwxSDLPanelに内包、このキューを用いてウィンドウへ送られてくるイベントを管理。
キューの中身はIdle時に処理され、独自定義のハンドラでキャッチ。
ハンドラはwxSDLEventHandlerクラスとしてwxObjectから派生させてこれを継承して使ってもらう。
他、SDL_SurfaceはwxSDLSurfaceとしてwxObjectから派生、管理等々、色々と思いつきますが、とりあえずまずはイベント関連を何とかせねば。
http://code.technoplaza.net/wx-sdl/
また、SDLのライセンスが変更されるかもしれないのも大きな理由。
http://www.libsdl.org/pipermail/sdl/2005-October/070939.html
Samさんが言うには、開発キット・もしくはOS付近(この定義が曖昧なのでちょっと微妙なんですが)にSDLを利用する場合はLGPLの再リンクの項(多分6-a項のことを言っているのだと思う)を適用せず、代替となるライセンスを提供しようと考えているそうです。
代替となるライセンスは、SDLプロジェクトのクレジットと、ライブラリの変更点を記載すれば基本的に自由に使ってよいというものにしたいと考えているようで、じぶんとしてはかなり期待しています。BSDライセンス・zlibライセンス辺りがいいんじゃないかなと思います。
SDLプロジェクトに参加している人で、これに関して不満がある人は自分にメールくれだそうです。
一応、このスレッドは今読んでいるのですが、結構な数の返信があってまだ読みきれていない状態です。
その他にも移植する理由はいくつかあるのですが
・SDLは標準ではマルチディスプレイ(ウィンドウ)をサポートしていない
・文字列関連、GUI関連が壊滅的に弱い
などが上げられます。
これらの弱点を補う上で、wxWidgetsはかなり良い線行っていると思います。
バイナリサイズは大きくなってしまいますが、デバッグ機能の充実やGUIを用いたSDLだけでは不可能な機能の追加ができ、この欠点を十二分に補うだけの価値があると思います。
ただ、気になるのは上記URLサンプルでSDL_Surfaceを
// create a bitmap from our pixel data
wxBitmap bmp(wxImage(screen->w, screen->h,
static_cast(screen->pixels), true));
このようにしてwxBitmapに変換後
// paint the screen
wxBufferedPaintDC dc(this, bmp);
として画面に反映していますが、これがどの程度の時間がかっているのか気になるところ。
それと、当たり前だがSDLの生成するウィンドウを利用しないためウィンドウ関連のイベントは標準イベント関数では受け取れないため、イベント関連はwxWidgetsのEVT_*でウィジットから受け取る必要があります。
SDLのウィンドウそのものはwxPanelを継承したwxSDLPanelで置き換えられ、ウィンドウを利用したいならwxSDLPanelを内包したフレームであるwxSDLFrameを使ってもらおうと今の所は考えています。
イベント関連は組み込み言語で呼ぶことも考えて、wxのイベントテーブルは用いずに独自のイベントキューをwxSDLPanelに内包、このキューを用いてウィンドウへ送られてくるイベントを管理。
キューの中身はIdle時に処理され、独自定義のハンドラでキャッチ。
ハンドラはwxSDLEventHandlerクラスとしてwxObjectから派生させてこれを継承して使ってもらう。
他、SDL_SurfaceはwxSDLSurfaceとしてwxObjectから派生、管理等々、色々と思いつきますが、とりあえずまずはイベント関連を何とかせねば。
SMILをアニメーション定義ファイルに
2005年12月12日一応、Honeycombの方はなんとか上げて(まだまだ未完成だけれども)、次にHornetの改修とSMILとBulletMLの組み込みをやろうと思う。
特に、アニメーション関係を言語に依存しないリソースとして外部に保存できるSMILは使い勝手が良さそうだ。アニメーション関係のカスタマイズができるGUIツールの作成後に、データをSMILとして吐き出すように設定、それをHornet内部のコードに変換して利用できるようにする。
Honeycombもそうだが、言語に依存しないツールとして利用できるように色々とカスタマイズできるよう検討して行くのも面白そうだ。
特に、アニメーション関係を言語に依存しないリソースとして外部に保存できるSMILは使い勝手が良さそうだ。アニメーション関係のカスタマイズができるGUIツールの作成後に、データをSMILとして吐き出すように設定、それをHornet内部のコードに変換して利用できるようにする。
Honeycombもそうだが、言語に依存しないツールとして利用できるように色々とカスタマイズできるよう検討して行くのも面白そうだ。
wxStyledTextCtrlのUnicode化
2005年12月10日
Honeycombのエディタ部であるwxStyledTextCtrlの設定をいろいろといじっていたのだが、どうもUnicode化する際に色々と手間のかかる仕様らしく、あれこれと調べまわる羽目に。
wxStyledTextCtrlをUnicodeに対応させるためにはwxUSE_UNICODEをコンパイル時にdefineしてやらなければならない。これを定義すると、そもそもTextCtrlの方がUnicode化するので後々操作が楽。その後デフォのwxStyledTextCtrl::LoadFileはUTF-16やUTF-32には使えないのでLoadFileをオーバーライドする。
どういうわけかwxUSE_UNICODEを利用しているにも関わらずchar型でテキストを読み込もうとしている。これはUTF-8しか使えませんということなのだろうか…
バッファとして用いているwxStringのコンストラクタでは*wxConvCurrentを指定しているので、ロケールをそもそもUTF-8にしないとUnicodeを利用するのは無理そうだ。
というわけで、ファイルをバッファに読み込むのは独自に実装するとして、
SetText(バッファ);
EmptyUndoBuffer();
SetSavePoint();
でエディタにバッファを投げ、アンドゥ・セーブポイントを初期化。
InitializePrefsでStyleを拡張子に合わせてセットしてスクリーンショットのような状態まで持っていった。
うーん、なかなか。
wxStyledTextCtrlをUnicodeに対応させるためにはwxUSE_UNICODEをコンパイル時にdefineしてやらなければならない。これを定義すると、そもそもTextCtrlの方がUnicode化するので後々操作が楽。その後デフォのwxStyledTextCtrl::LoadFileはUTF-16やUTF-32には使えないのでLoadFileをオーバーライドする。
どういうわけかwxUSE_UNICODEを利用しているにも関わらずchar型でテキストを読み込もうとしている。これはUTF-8しか使えませんということなのだろうか…
バッファとして用いているwxStringのコンストラクタでは*wxConvCurrentを指定しているので、ロケールをそもそもUTF-8にしないとUnicodeを利用するのは無理そうだ。
というわけで、ファイルをバッファに読み込むのは独自に実装するとして、
SetText(バッファ);
EmptyUndoBuffer();
SetSavePoint();
でエディタにバッファを投げ、アンドゥ・セーブポイントを初期化。
InitializePrefsでStyleを拡張子に合わせてセットしてスクリーンショットのような状態まで持っていった。
うーん、なかなか。
wxStaticBoxの枠変更
2005年11月27日
Honeycombの設定ウィンドウを、PreferenceDialogから派生させたToolPreferenceDialogで実装し、基底部分のみを継承させて使い回せるように変更してみた。
ダイアログ右と左のSizerの周りの枠の部分だが、これはSizerのGetSize()とGetPosition()を利用して、EVT_PAINTでOnPaintを捕捉後にwxPaintDCで描画している。
初めは、どうやってSizerの周りに枠を描こうかと悩みに悩んだが、結局この方法が一番楽なのでそうした(多分、これ以上に楽な方法は無いと思う。Bolderの色の変更など、どうやってやったらいいのかわからないし)。
ただ、これだとwxCLIP_CHILDRENをスタイル指定しているにも関わらず、どうしても表示がちらつく。どうやったらこのフリッカを防止できるのかが今後の課題になりそうだ(もし、設計からやり直しだとつらいなぁ)。
ダイアログ右と左のSizerの周りの枠の部分だが、これはSizerのGetSize()とGetPosition()を利用して、EVT_PAINTでOnPaintを捕捉後にwxPaintDCで描画している。
初めは、どうやってSizerの周りに枠を描こうかと悩みに悩んだが、結局この方法が一番楽なのでそうした(多分、これ以上に楽な方法は無いと思う。Bolderの色の変更など、どうやってやったらいいのかわからないし)。
ただ、これだとwxCLIP_CHILDRENをスタイル指定しているにも関わらず、どうしても表示がちらつく。どうやったらこのフリッカを防止できるのかが今後の課題になりそうだ(もし、設計からやり直しだとつらいなぁ)。
Honeycombの日本語化2
2005年11月27日
どうもwxWidgetsをwxUSE_UNICODEでコンパイルかけると、MinGWのgettextでは上手くいかないようなので、とりあえず他にwin32プラットフォームにポーティングされたgettextが無いか調べてみた。
で、発見。
http://sourceforge.net/projects/gettext
koronさんがポーティングしたこのWin32版gettextを利用してpoファイルを作成、テキストはutf-8、charsetもutf-8にして保存し、後は_()でソース内展開してみた。昨日の_GT()は使わない。
そうしたら、すんなりと日本語化できてしまった…原因はgettextだったんだろうか。
むむ、とりあえず結果オーライってことで。
で、発見。
http://sourceforge.net/projects/gettext
koronさんがポーティングしたこのWin32版gettextを利用してpoファイルを作成、テキストはutf-8、charsetもutf-8にして保存し、後は_()でソース内展開してみた。昨日の_GT()は使わない。
そうしたら、すんなりと日本語化できてしまった…原因はgettextだったんだろうか。
むむ、とりあえず結果オーライってことで。
Honeycombの日本語化
2005年11月26日日本語対応化に関してですがDeeさんが成功していたので
http://kikyou.info/diary/?200510#i5_2
を参考にMinGWのlibiconvとgettextを使って
xgettext -k_ ソースファイル名 -o poファイル名
msgfmt -c -o moファイル名 poファイル名
で、ソース内の_()マクロからpoファイル作成後、poファイルのヘッダをcharset=utf-8にしてUTF-8のプレーンテキストで保存。その後、poからmoファイルを作成してwxWidget側でutf-8文字コードを以下の関数で置き換え
inline wxString _GT ( const wxChar* str )
{
wxString str2(str, wxConvUTF8);
wxString str3(wxConvUTF8.cMB2WC(str2.mbc_str().data()), wxConvLocal);
return str3 ;
}
使うときは
_GT(_("string"))
って感じですね。これでやってみたんですが、日本語化できる文字列と日本語化できない文字列が出てきた…
僕がやった限りでは、Fileメニューの&Fileと&Open以外はどうも変換できない。むむむ…
一応、HoneycombAppのコンストラクタで
locale.AddCatalog(wxT("."));
locale.AddCatalogLookupPathPrefix ( wxT("locale")) ;
locale.Init(wxLANGUAGE_DEFAULT);
locale.AddCatalog(wxT("Honeycomb"));
って感じで、./locale/ja/Honeycomb.moが呼び出されるように設定はしているんだけど
少し時間を置いてやってみよう。
http://kikyou.info/diary/?200510#i5_2
を参考にMinGWのlibiconvとgettextを使って
xgettext -k_ ソースファイル名 -o poファイル名
msgfmt -c -o moファイル名 poファイル名
で、ソース内の_()マクロからpoファイル作成後、poファイルのヘッダをcharset=utf-8にしてUTF-8のプレーンテキストで保存。その後、poからmoファイルを作成してwxWidget側でutf-8文字コードを以下の関数で置き換え
inline wxString _GT ( const wxChar* str )
{
wxString str2(str, wxConvUTF8);
wxString str3(wxConvUTF8.cMB2WC(str2.mbc_str().data()), wxConvLocal);
return str3 ;
}
使うときは
_GT(_("string"))
って感じですね。これでやってみたんですが、日本語化できる文字列と日本語化できない文字列が出てきた…
僕がやった限りでは、Fileメニューの&Fileと&Open以外はどうも変換できない。むむむ…
一応、HoneycombAppのコンストラクタで
locale.AddCatalog(wxT("."));
locale.AddCatalogLookupPathPrefix ( wxT("locale")) ;
locale.Init(wxLANGUAGE_DEFAULT);
locale.AddCatalog(wxT("Honeycomb"));
って感じで、./locale/ja/Honeycomb.moが呼び出されるように設定はしているんだけど
少し時間を置いてやってみよう。
Honeycomb更新状況
2005年11月21日
大分と形になって来た。Project関係をもう少し煮詰めた上でHornet.exe、ALink.exeとの連携を上手くやればなかなかのIDEになる。
ただ、エディタ部をどうやって煮詰めて行くかが問題。インテリセンスのようなコード補完機能をどうやって作るか。
wxWindowを枠無しで生成した後でそれにwxComboBoxを付けて、内部にあるオブジェクトリストを表示させる。
リストの表示までは簡単だが、問題はリストをどうやって作り、エディタの編集に同期させてどのように更新するか。
この部分のアルゴリズムを練らなきゃだなぁ。
ただ、エディタ部をどうやって煮詰めて行くかが問題。インテリセンスのようなコード補完機能をどうやって作るか。
wxWindowを枠無しで生成した後でそれにwxComboBoxを付けて、内部にあるオブジェクトリストを表示させる。
リストの表示までは簡単だが、問題はリストをどうやって作り、エディタの編集に同期させてどのように更新するか。
この部分のアルゴリズムを練らなきゃだなぁ。
SDL_kanjiのベンチマーク結果
2005年11月17日
とりあえず、SDL_kanjiのベンチもやってみた(SDL_kanjiのSJIS->JIS変換にバグがあって、回避するのが大変だった)。
今回は、
1.フォントサイズは16
2.N=1000
3.AthlonXP2000+の環境で、SDL_ttfの結果と比較
4.レンダリング先サーフェースは32bpp
とした。
とりあえず、結果からはSDL_kanjiは、SDL_ttfよりもレンダリング済みフォントの生成速度はほとんど同じ(大体5us程度の違いしかない)。
自分は、レンダリング済みフォントの方がサーフェース生成のための速度は速いんじゃないのかと思っていたが、意外とそうでもなかった。
多分、ベクタデータがレンダリング済みフォントのデータよりも容量が小さいため、メモリへの読み取りアクセス数がレンダリング済みフォントデータの時よりも減り、ベクトルデータをラスタライズする処理とレンダリング済みフォントデータを読み込む処理に掛かる時間が相殺した結果、ほぼ等しい処理時間になったんじゃないかと思う。
SDL_kanjiはSJISの変換には問題があることが露呈したので、それが修正されない限りは使うのは控えた方が良いかもしれない(ただ、半角カナ文字や一部のSJISコードを使わなければ通常の文字表示なら実用に耐える)。
個人的には、BDFよりもTTFやOTFの方が扱いが楽だし、安定性やサポートもSDL_ttfの方が良いからSDL_ttfを推すけど、まぁ使いやすい方を使えばそれでよいかと思う。
今回は、
1.フォントサイズは16
2.N=1000
3.AthlonXP2000+の環境で、SDL_ttfの結果と比較
4.レンダリング先サーフェースは32bpp
とした。
とりあえず、結果からはSDL_kanjiは、SDL_ttfよりもレンダリング済みフォントの生成速度はほとんど同じ(大体5us程度の違いしかない)。
自分は、レンダリング済みフォントの方がサーフェース生成のための速度は速いんじゃないのかと思っていたが、意外とそうでもなかった。
多分、ベクタデータがレンダリング済みフォントのデータよりも容量が小さいため、メモリへの読み取りアクセス数がレンダリング済みフォントデータの時よりも減り、ベクトルデータをラスタライズする処理とレンダリング済みフォントデータを読み込む処理に掛かる時間が相殺した結果、ほぼ等しい処理時間になったんじゃないかと思う。
SDL_kanjiはSJISの変換には問題があることが露呈したので、それが修正されない限りは使うのは控えた方が良いかもしれない(ただ、半角カナ文字や一部のSJISコードを使わなければ通常の文字表示なら実用に耐える)。
個人的には、BDFよりもTTFやOTFの方が扱いが楽だし、安定性やサポートもSDL_ttfの方が良いからSDL_ttfを推すけど、まぁ使いやすい方を使えばそれでよいかと思う。
SDL_ttfのベンチマーク結果
2005年11月14日
SDL_ttfに関して、http://diarynote.jp/d/35749/20051112.htmlに書いた通りベンチマークを行って性能テストをしてみた。
条件を以下に示す。
1.テストにはAfter X-TT ProjectのFS-Gothicを利用する。
2.フォントのラスタライズ・ピクセルデータの生成・ピクセルデータの破棄の一連の動作を、「フォントの描画処理」と定義する。
3.今回は、一つのフォントの描画処理にかかる時間を評価対象とする。
4. フォントは24ポイントのものに限る。
5. ラスタライズするのに使う関数はTTF_RenderUNICODE_Blendedを用いる。
6.OSは、手元にあるWindowsに限る。
計測に用いるタイマーの精度が1(ms)であるため、もし1回の描画が1(ms)以下で終わってしまった場合には、描画速度が計測できない。そこで、今回はN回描画と生成を繰り返しすことで、1(ms)以上描画に時間がかかるようにNを設定し、そのデータをNで割ることでタイマーの精度を超えた計測を可能にする。
また、測定データに対してN回同期加算を行い、同期加算回数で正規化することで、測定に影響するような外乱に対して√N倍の精度で測定が行えることが保障されている。そのため、外乱はたいした問題ではない(ただし、変化しない、例えば常駐ソフトなどによるコンスタントな外乱や、真の測定データに対して大きすぎるデータの変化は問題となる)。
7.同期加算回数はN=100とする。
測定データを示したグラフの縦軸はフォントデータのラスタライズとBlendedピクセルデータの生成(アルファチャネルにラスタライズデータの描画)にかかった時間(ms表示)、横軸は文字コードを示している。
結果から考察できることを列挙する。
1.Celeron 733MHzやMobile Duron 900MHzでは常駐ソフトが起動していた。そのため、描画にかかる時間は他の場合に比べて急激に上昇している(常駐ソフトの影響は大きい)。
2.2.以外の場合ではフォントの描画には平均して0.1[ms]程度しかかかっていない(AthlonXP2000+においては30[us]程度でフォントの描画処理は完了してしまう)。
通常、文字生成はリアルタイムで行えることが望ましい。画面のFPS=60の際、1FPSの処理時間に対してフォント描画処理が占める時間的割合を計算すると
0.1/(1/60*1000)=0.006=0.6[%]
従って、たった0.6[%]となる(ただし、これは1FPSに一文字生成する場合に限った結果である。文字間の表示ウェイトは10〜20[ms]であることがほとんどなため、1FPS(16.777...(ms))で1文字表示ちという計算が妥当であると判断した)。1FPSに100文字描画しなければならない場合は、10[ms]かかることになる。この場合
10/(1/60*1000)=60[%]
となり、リアルタイムで100文字生成は難しいことがわかる。
もし常駐ソフトが起動していた場合は、平均して約0.5[ms]フォント描画処理にかかるとすると
0.5/(1/60*1000)=3[%]
となる。経験上、1FPS中の3[%]の処理にかかる割合は大きい(ここにリアルタイムでの画像処理や楽音信号の処理が入ってくるからだ)。従って、常駐ソフトは起動しないことが望ましい。
今回のテストで大体わかったが、SDL_ttfを用いても描画速度的には全然問題無い。一応、次はSDL_kanjiを用いてやってみようと思う。
条件を以下に示す。
1.テストにはAfter X-TT ProjectのFS-Gothicを利用する。
2.フォントのラスタライズ・ピクセルデータの生成・ピクセルデータの破棄の一連の動作を、「フォントの描画処理」と定義する。
3.今回は、一つのフォントの描画処理にかかる時間を評価対象とする。
4. フォントは24ポイントのものに限る。
5. ラスタライズするのに使う関数はTTF_RenderUNICODE_Blendedを用いる。
6.OSは、手元にあるWindowsに限る。
計測に用いるタイマーの精度が1(ms)であるため、もし1回の描画が1(ms)以下で終わってしまった場合には、描画速度が計測できない。そこで、今回はN回描画と生成を繰り返しすことで、1(ms)以上描画に時間がかかるようにNを設定し、そのデータをNで割ることでタイマーの精度を超えた計測を可能にする。
また、測定データに対してN回同期加算を行い、同期加算回数で正規化することで、測定に影響するような外乱に対して√N倍の精度で測定が行えることが保障されている。そのため、外乱はたいした問題ではない(ただし、変化しない、例えば常駐ソフトなどによるコンスタントな外乱や、真の測定データに対して大きすぎるデータの変化は問題となる)。
7.同期加算回数はN=100とする。
測定データを示したグラフの縦軸はフォントデータのラスタライズとBlendedピクセルデータの生成(アルファチャネルにラスタライズデータの描画)にかかった時間(ms表示)、横軸は文字コードを示している。
結果から考察できることを列挙する。
1.Celeron 733MHzやMobile Duron 900MHzでは常駐ソフトが起動していた。そのため、描画にかかる時間は他の場合に比べて急激に上昇している(常駐ソフトの影響は大きい)。
2.2.以外の場合ではフォントの描画には平均して0.1[ms]程度しかかかっていない(AthlonXP2000+においては30[us]程度でフォントの描画処理は完了してしまう)。
通常、文字生成はリアルタイムで行えることが望ましい。画面のFPS=60の際、1FPSの処理時間に対してフォント描画処理が占める時間的割合を計算すると
0.1/(1/60*1000)=0.006=0.6[%]
従って、たった0.6[%]となる(ただし、これは1FPSに一文字生成する場合に限った結果である。文字間の表示ウェイトは10〜20[ms]であることがほとんどなため、1FPS(16.777...(ms))で1文字表示ちという計算が妥当であると判断した)。1FPSに100文字描画しなければならない場合は、10[ms]かかることになる。この場合
10/(1/60*1000)=60[%]
となり、リアルタイムで100文字生成は難しいことがわかる。
もし常駐ソフトが起動していた場合は、平均して約0.5[ms]フォント描画処理にかかるとすると
0.5/(1/60*1000)=3[%]
となる。経験上、1FPS中の3[%]の処理にかかる割合は大きい(ここにリアルタイムでの画像処理や楽音信号の処理が入ってくるからだ)。従って、常駐ソフトは起動しないことが望ましい。
今回のテストで大体わかったが、SDL_ttfを用いても描画速度的には全然問題無い。一応、次はSDL_kanjiを用いてやってみようと思う。
自らへの戒め(一年後の自分へ)
2005年11月13日唐突に、とりあえずタイムカプセル的なことをやってみたくなった。PromisedLandやお狐様といったゲーム製作にいままで携わって、なんとか完成させてきたが、今回は自分が主催でサークルを立ち上げることになった。ということで、一年後にこの日記を読み返すことを前提に今、ゲーム製作に関して言いたいことを書いてみようと思う。
最近、ネット上で自主制作をしたいという方が増えている。そして、とりあえずはメンバーを募集して、みんなでわいわいと楽しくゲームを作りたいと思っているようだ。
そのため、「楽しく」をモットーにゲーム製作をやりたいと考える人がいるが、楽しいのはゲームやっているときだけで、実際の作業はそれはそれは面倒くさい単純作業の繰り返しだ。
良い仕事は日々の単純作業の繰り返しとも言うが、正にそれを具体化したものがゲーム製作だとも言えると思う。先進技術を次々と取り入れ、日々の作業これ勉強。こつこつと、地道に努力する気が無ければ完成なんてしないと自分は考えている。
毎日楽しく作業できるなんていうのは、作業に必要なスキルが全て身に付いている極一部のプロがやる活動くらいで、アマチュアごときが味わえるようなものじゃない。死ぬ気で努力して、汗と涙と鼻水と血と胃液を噛み締めた人だけが得られる御褒美なんだと思う。
その辺がわかっていないのか、最近の人はどうも方法論ばかり重視しすぎていて、自らのスキルを省みない人が多いような気がする。また、論じてばかりで自ら動こうとしない人も多い。
スキルと言うのは、論より証拠。言葉で語るよりも結果で示すべきではないのだろうか。スキルの無さをいくら言葉でカバーしようとしても、結果が出なければそれはただの戯言でしかない。
いくら言葉で弁解しようとも、自らの立場を危うくしていくだけだ。結局、人は欺けても、自らは欺けないのだから。ここがロドスだ、ここで飛んで見せろとまぁ、古い話を持ち出してみる。
というわけで、まぁ、言いたいのは、「うんぬん言う前に行動で示してみ。」という、当たり前っちゃ当たり前のこと。これを1年後の自分は実行できた言えるように頑張らねば。ではでは、頑張れ自分!
最近、ネット上で自主制作をしたいという方が増えている。そして、とりあえずはメンバーを募集して、みんなでわいわいと楽しくゲームを作りたいと思っているようだ。
そのため、「楽しく」をモットーにゲーム製作をやりたいと考える人がいるが、楽しいのはゲームやっているときだけで、実際の作業はそれはそれは面倒くさい単純作業の繰り返しだ。
良い仕事は日々の単純作業の繰り返しとも言うが、正にそれを具体化したものがゲーム製作だとも言えると思う。先進技術を次々と取り入れ、日々の作業これ勉強。こつこつと、地道に努力する気が無ければ完成なんてしないと自分は考えている。
毎日楽しく作業できるなんていうのは、作業に必要なスキルが全て身に付いている極一部のプロがやる活動くらいで、アマチュアごときが味わえるようなものじゃない。死ぬ気で努力して、汗と涙と鼻水と血と胃液を噛み締めた人だけが得られる御褒美なんだと思う。
その辺がわかっていないのか、最近の人はどうも方法論ばかり重視しすぎていて、自らのスキルを省みない人が多いような気がする。また、論じてばかりで自ら動こうとしない人も多い。
スキルと言うのは、論より証拠。言葉で語るよりも結果で示すべきではないのだろうか。スキルの無さをいくら言葉でカバーしようとしても、結果が出なければそれはただの戯言でしかない。
いくら言葉で弁解しようとも、自らの立場を危うくしていくだけだ。結局、人は欺けても、自らは欺けないのだから。ここがロドスだ、ここで飛んで見せろとまぁ、古い話を持ち出してみる。
というわけで、まぁ、言いたいのは、「うんぬん言う前に行動で示してみ。」という、当たり前っちゃ当たり前のこと。これを1年後の自分は実行できた言えるように頑張らねば。ではでは、頑張れ自分!
Hornetの現状の問題点
2005年11月12日元々、Hornetは3Dを標準サポートする開発環境であり、さらにクロスプラットフォームであるというのが前提であるため、OpenGLを描画に使用しなければならない。
しかし、実際にOpenGLをサポートした場合、要求するスペックがビデオカード側に傾き、CPUがそれなりの速度なのにビデオ周りがだめなためにゲームが動かないと言う状況が出てくる。
それを解決するためには、ある程度はCPU側でグラフィックの処理をさせ、不必要にハードウェアアクセラレーターを利用しないことで解決できると考えている(CPUで画像処理させた後で、表示だけGPUに任せるのは、安定性を求めるゲームでは上等手段)。もちろん、高度なエフェクトは使用するかどうかスイッチを設けて切り替えられるようにするのも必要だろう。
また、他のホットスポットとして、ADVなら文字表示が多いので、フォント周り(レンダリング済みフォントを利用するのか、それともベクタフォントをリアルタイムでラスタライズして使用するのか)が問題となってくるし、現在シナリオ言語を直接プレーンテキストから実行している点も問題だろう。
なんで、今後の方針としては
1.フォント周りのベンチマーク(SDL_ttfとSDL_kanjiの比較をやれば十分かなと見ている)
2.OpenGL周りの最適化(ディスプレイリストを使用するのと、コマンド郡を効率よくGPUに流すために、頂点バッファを利用すればある程度改善されるはず)
3.中間バイナリコードによるシナリオの実行(すでにシナリオ言語部分は中間コード作成のための仕組みを持っているため、それを利用)
をまずやろうと思う。
というわけで、SDL_ttfとSDL_kanjiの比較について。
その前に、SDL_kanjiはSJISやEUCしか使えないなど、Hornetで利用するための前提条件を満たしていないのでUnicode対応させる必要がある。
SDL_ttfでは、レンダリングフォント作成時に無駄な処理が入っているのと、UTF-8を使用する際にバグがあるので、その点をメーリングリストで報告して修正してもらわなければならない。
レンダリング済みフォントは、OSを換えた際に起こるフォントドライバによる描画の差異を吸収するためのものであって、描画の速度だとかそういったものはあまり考慮されていないとも考えられる。
ベクタデータの方が、ピクセルデータよりもデータ量としては少ないから、読み込みアクセスが減少することでレンダリング済みフォントよりも高速に描画できるとも考えられるため、速度的に必ずしもレンダリング済みフォントの方が優れているともいえない。
というわけで、なぞがあるならとことん追求。速度的な比較をまずはやってみようと思う。
しかし、実際にOpenGLをサポートした場合、要求するスペックがビデオカード側に傾き、CPUがそれなりの速度なのにビデオ周りがだめなためにゲームが動かないと言う状況が出てくる。
それを解決するためには、ある程度はCPU側でグラフィックの処理をさせ、不必要にハードウェアアクセラレーターを利用しないことで解決できると考えている(CPUで画像処理させた後で、表示だけGPUに任せるのは、安定性を求めるゲームでは上等手段)。もちろん、高度なエフェクトは使用するかどうかスイッチを設けて切り替えられるようにするのも必要だろう。
また、他のホットスポットとして、ADVなら文字表示が多いので、フォント周り(レンダリング済みフォントを利用するのか、それともベクタフォントをリアルタイムでラスタライズして使用するのか)が問題となってくるし、現在シナリオ言語を直接プレーンテキストから実行している点も問題だろう。
なんで、今後の方針としては
1.フォント周りのベンチマーク(SDL_ttfとSDL_kanjiの比較をやれば十分かなと見ている)
2.OpenGL周りの最適化(ディスプレイリストを使用するのと、コマンド郡を効率よくGPUに流すために、頂点バッファを利用すればある程度改善されるはず)
3.中間バイナリコードによるシナリオの実行(すでにシナリオ言語部分は中間コード作成のための仕組みを持っているため、それを利用)
をまずやろうと思う。
というわけで、SDL_ttfとSDL_kanjiの比較について。
その前に、SDL_kanjiはSJISやEUCしか使えないなど、Hornetで利用するための前提条件を満たしていないのでUnicode対応させる必要がある。
SDL_ttfでは、レンダリングフォント作成時に無駄な処理が入っているのと、UTF-8を使用する際にバグがあるので、その点をメーリングリストで報告して修正してもらわなければならない。
レンダリング済みフォントは、OSを換えた際に起こるフォントドライバによる描画の差異を吸収するためのものであって、描画の速度だとかそういったものはあまり考慮されていないとも考えられる。
ベクタデータの方が、ピクセルデータよりもデータ量としては少ないから、読み込みアクセスが減少することでレンダリング済みフォントよりも高速に描画できるとも考えられるため、速度的に必ずしもレンダリング済みフォントの方が優れているともいえない。
というわけで、なぞがあるならとことん追求。速度的な比較をまずはやってみようと思う。
機動戦士Zガンダム -星を継ぐ者-
2005年11月7日 映画
ようやく見ました。長かった。世間では恋人たちが公開されていますが、こっちは、それどころじゃないですね(苦笑
いやー、始めは昔のまんまの絵で出てきたので、昔のフィルムをデジタル処理して補正かけてノイズとったのだとばかり思っていたんですが、新作カットやストーリーの変更などもあるんですねー。
確か、オリジナルでの15話分くらい詰っているんで、時間にして25*15=375分分の内容が90分に詰っているわけで、確かにそりゃストーリーの変更も必要になってくるわな…と思いました。
が、いくらなんでもこれは飛ばしすぎだろと思ったのは、百式がいきなり配備されていたり、MarkIIのカラーが勝手に塗り替えられていたり、エマ中尉に30バンチのG3ガスによる虐殺を見せるのがノートパソコンでの映像だけだったりした点でしょうか。
あと、ライラやシロッコ、ロザミアとの戦闘なんかは新しいカットが沢山入っていて面白かったんですが(MSの戦闘はすごい綺麗になっていますね)、これだけやるんだったら、他の部分も全部書きなおしゃよかっただろうにと、全体としては不満が残るようなできでした。なにせ、オリジナルと、新作のカットの差があまりにもありすぎて、不自然だ!と思うんですけどね。
まぁ、Zは面白いので我慢します。恋人たち、早くDVDで出ないかなぁ。
いやー、始めは昔のまんまの絵で出てきたので、昔のフィルムをデジタル処理して補正かけてノイズとったのだとばかり思っていたんですが、新作カットやストーリーの変更などもあるんですねー。
確か、オリジナルでの15話分くらい詰っているんで、時間にして25*15=375分分の内容が90分に詰っているわけで、確かにそりゃストーリーの変更も必要になってくるわな…と思いました。
が、いくらなんでもこれは飛ばしすぎだろと思ったのは、百式がいきなり配備されていたり、MarkIIのカラーが勝手に塗り替えられていたり、エマ中尉に30バンチのG3ガスによる虐殺を見せるのがノートパソコンでの映像だけだったりした点でしょうか。
あと、ライラやシロッコ、ロザミアとの戦闘なんかは新しいカットが沢山入っていて面白かったんですが(MSの戦闘はすごい綺麗になっていますね)、これだけやるんだったら、他の部分も全部書きなおしゃよかっただろうにと、全体としては不満が残るようなできでした。なにせ、オリジナルと、新作のカットの差があまりにもありすぎて、不自然だ!と思うんですけどね。
まぁ、Zは面白いので我慢します。恋人たち、早くDVDで出ないかなぁ。
Hornet用IDE、Honeycomb(はにかむ)インポート
2005年11月4日
なんか、それっぽく形になってきているので、とりあえずインポートしてみた。
これからディテイルは詰めてゆく。
自分としては、プロジェクト管理と、デバッグ機能がつけばそれでもう十分かもと思っている。それ以外に、何を付けれというのか。ネットを介した他IDEとの同期?そんな馬鹿な(苦笑
というわけで、とりあえず今後のロードマップは
11月中 Honeycomb完成、セットアッププログラムに組み込んで、Hornet使って遊べるように。
12月 4号館物語完成、配布開始
12月 闇色童話製作開始
1月 セネカ製作中盤
2月 セネカ完成、配布開始
4月? 闇色童話完成
ちなみに、前のサークルのお狐様にお願いを、オーバーホールして、こっちのサークルで作成、TEARS.様に還元したい次第(大汗
ごめんなさい、浅葉さん。クロスプラットフォーム対応には、2年かかりました。
ちなみに、セネカは深海喫茶のリョウさんとの共同。かわいい絵を描いてくれる素晴らしい方!うっれしーなーっと。
これからディテイルは詰めてゆく。
自分としては、プロジェクト管理と、デバッグ機能がつけばそれでもう十分かもと思っている。それ以外に、何を付けれというのか。ネットを介した他IDEとの同期?そんな馬鹿な(苦笑
というわけで、とりあえず今後のロードマップは
11月中 Honeycomb完成、セットアッププログラムに組み込んで、Hornet使って遊べるように。
12月 4号館物語完成、配布開始
12月 闇色童話製作開始
1月 セネカ製作中盤
2月 セネカ完成、配布開始
4月? 闇色童話完成
ちなみに、前のサークルのお狐様にお願いを、オーバーホールして、こっちのサークルで作成、TEARS.様に還元したい次第(大汗
ごめんなさい、浅葉さん。クロスプラットフォーム対応には、2年かかりました。
ちなみに、セネカは深海喫茶のリョウさんとの共同。かわいい絵を描いてくれる素晴らしい方!うっれしーなーっと。
wxStEdit
2005年10月30日Hornet用IDEを開発中に、wxStEditというサンプルアプリケーションを見つけた。Scintilla text editorウィジットをラッピングしたwxStyledTextCtrlは結構使いにくかったのだが、それをさらにラッピングして使いやすくしたエディタとのこと。
内部でStyledTextEditor等のラッピングクラスによって構成されているらしいが、なるほど、欲しい機能は大体搭載されているし、使いやすそうだ。
というわけで、明日からはこいつをなんとか使い倒せるようにしらべてみようと思う。
内部でStyledTextEditor等のラッピングクラスによって構成されているらしいが、なるほど、欲しい機能は大体搭載されているし、使いやすそうだ。
というわけで、明日からはこいつをなんとか使い倒せるようにしらべてみようと思う。
HornetソースをCVSにアップ
2005年10月26日
HornetのソースをCVS管理するためにリポジトリにインポートした。結構遅くなったが、これならまぁ、出しても良いだろうということで、とりあえずインポート。
しかし、総ファイル数が117と、やっていることはそれほどでもないにも関わらず、やはり多い。実際にいじるのはScenarioLoader.*ppとスクリプトシステムフォルダ内程度だけれども、やっぱりもう少し短くしたいと思うのは自分だけなんだろうか。
一応、今日は文字コードがどのようにアプリケーション内で流れるかをまとめてみた。
とりあえず、Hornet用テキストエディタではwxStringがwchar_tに依存するのでUTF-32かUTF-16をUTF-8として保存。これはバイトコードを見ればすぐに変換可能。
その後、UTF-8として保存されたものを、Hornetで再度wchar_tへ変換。SDL_ttfでは入力はUTF-16限定なので、もしかするとこの辺は柔軟性を考えてFreeTypeを直接叩くようにするかもしれない。そうすれば、wchar_tのサイズによってFreeType側で調整できる。
スクリプト側には、wchar_tのデータを送り(もしLuaならばUTF-8に変換して送る)ファイルパス指定の場合のみローカル文字列、もしくはUTF-8をそのまま使用する。
そうすると、何回もHornet内で文字コード変換しないとだめなんだよなぁ。まぁ、今の処理速度から考えると文字コード変換なんか全体の処理に対しては微々たるものだろう。
しかし、総ファイル数が117と、やっていることはそれほどでもないにも関わらず、やはり多い。実際にいじるのはScenarioLoader.*ppとスクリプトシステムフォルダ内程度だけれども、やっぱりもう少し短くしたいと思うのは自分だけなんだろうか。
一応、今日は文字コードがどのようにアプリケーション内で流れるかをまとめてみた。
とりあえず、Hornet用テキストエディタではwxStringがwchar_tに依存するのでUTF-32かUTF-16をUTF-8として保存。これはバイトコードを見ればすぐに変換可能。
その後、UTF-8として保存されたものを、Hornetで再度wchar_tへ変換。SDL_ttfでは入力はUTF-16限定なので、もしかするとこの辺は柔軟性を考えてFreeTypeを直接叩くようにするかもしれない。そうすれば、wchar_tのサイズによってFreeType側で調整できる。
スクリプト側には、wchar_tのデータを送り(もしLuaならばUTF-8に変換して送る)ファイルパス指定の場合のみローカル文字列、もしくはUTF-8をそのまま使用する。
そうすると、何回もHornet内で文字コード変換しないとだめなんだよなぁ。まぁ、今の処理速度から考えると文字コード変換なんか全体の処理に対しては微々たるものだろう。
Kikyo.infoで開発者向けサイトの運営開始
2005年10月25日最近、TJSを組み込みたくてもなかなか踏み出せないでいるHornetの開発が停滞中。Hornet用エディタの開発の方は結構トントン拍子に進んでいる感があるが、Hornetの方もはやくCVSで開発協力得たいなぁと思いながら、はやり現在のコードではそもそもメンテが頼めない状態なので、そこらへんをなんとかするつもり。
結構、シナリオローダー以外は綺麗なもんなんだけどさ。
ってことで、TJS2つながりでKikyo.infoが開発者用サイトの運営を開始していたので、早速メーリングリストに登録、サイトのほうもざっと見てみた。今までおおっぴらにされていなかった開発中のソースなども綺麗に見れるようになっていて、なかなか良い。
さすがDeeさんだと思った。
それと、吉里吉里3は UTF-32 ベースになるとのことだが、ということはHornetとは別路線を行くのかと思うと、ちょっと残念な気が。多分、かなりの下調べの上での決定だとは思うけれども、自分としてはSDL_ttfを利用しているため、UTF-16固定で十分なんだよなー。でも、wchar_tがLinuxとMacOSXで4byteというのは今更ながらに驚いた(前にも聞いていたが、よくよく考えると大変なことだった)。ということは、Hornetのソースコードは大部分が改修しなければならないことに…特に、シナリオローダー部分は全部wchar_tが2byteであることを前提としているし、文字コード変換部分もそうだな。やばいなー
結構、シナリオローダー以外は綺麗なもんなんだけどさ。
ってことで、TJS2つながりでKikyo.infoが開発者用サイトの運営を開始していたので、早速メーリングリストに登録、サイトのほうもざっと見てみた。今までおおっぴらにされていなかった開発中のソースなども綺麗に見れるようになっていて、なかなか良い。
さすがDeeさんだと思った。
それと、吉里吉里3は UTF-32 ベースになるとのことだが、ということはHornetとは別路線を行くのかと思うと、ちょっと残念な気が。多分、かなりの下調べの上での決定だとは思うけれども、自分としてはSDL_ttfを利用しているため、UTF-16固定で十分なんだよなー。でも、wchar_tがLinuxとMacOSXで4byteというのは今更ながらに驚いた(前にも聞いていたが、よくよく考えると大変なことだった)。ということは、Hornetのソースコードは大部分が改修しなければならないことに…特に、シナリオローダー部分は全部wchar_tが2byteであることを前提としているし、文字コード変換部分もそうだな。やばいなー