Chiharu の日記

絵描き C/C++ プログラマーの日記です。

Parallel force - パラレル・フォース

イメージ トラッカー 〜イメージの非同期ロード(実装)

先日の日記の続き。 イメージの非同期ロードの相互作用概要図を書いてみました。 んー。相互作用概要図は初めて書きました。書式は多分合ってると思います。たぶん。たぶんね。 とりあえず正常系の実装は完了しました。ImageTracker::prepare もぼちぼち動作…

イメージ トラッカー 〜イメージの非同期ロード(準備)

こちらのサイトに触発されてイメージの非同期ロードの実装に取り掛かりました。 さしあたって、これまで上流で直に呼び出していた PNG ローダーやファイル ストリーム リーダー等をアブストラクト ファクトリー パターンで抽象化してみました。とりあえずリ…

Rendering Stage 〜描画処理から転送まで

先の日記の続き。 Rendering Stage のシーケンス図を書いてみました。 Rendering Stage では名称通りに描画処理を実施します。キャッシュ サイズに合わせて描画対象領域を分割し、論理コア数に合わせて起動された複数のワーカー スレッドで次々と分割領域を…

描画ベンチマーク 〜Excel 2010 のグラフは綺麗

先日の日記の続き。 これまで計測した『Parallel force - パラレル・フォース』の描画ベンチマークをグラフ*1にしてみました。 60 FPS のウェイトで Core i7 のパフォーマンスは頭打ちですが、Atom は SIMD とマルチスレッドでなかなかいい具合にパフォーマ…

Gaming Stage 〜ゲーム ループと描画処理

先日の日記の続き。 Gaming Stage のシーケンス図を書いてみました。 Gaming Stage ではスクリプト処理とポーリングによる UI 処理、それに伴うスプライト操作を実施します。一般にいうゲーム ループですが、大きな相違が 1 点あります。それは自ループ内に…

Office 2010 購入 〜Visio 2010 もあわせて

あけましておめでとうございます。今年もよろしくお願いします。 表題の通りですので、早速『Parallel force - パラレル・フォース』のパッケージ図とアクティビティ図のスケッチなど。 パッケージ図はこちら。先日の日記のブラッシュアップ版です。Sprite …

UTF-8 から UCS-4 を取り出す 〜エンコーディングから文字コードへ

UTF-8 から UCS-4 を取り出す処理が必要になりました。ということで、書いてみました。下記。 const std::uint32_t toUcs4(const char* iString, const std::size_t iLength, const char** oEnd) { assert(iString); assert(oEnd); const char* aCur = iStri…

astah* 〜ライセンス

先ほど『Parallel force - パラレル・フォース』の設計メモとして astah* を使おうと思ったところ、評価ライセンスの期限が切れていることに気づきました。しまったなぁ。会社に個人ライセンスがあるので、それを使い始めるまでのつなぎにしていたら、ライセ…

PandaBoard 環境にポーティング完了 〜スクリーンショット

先日の日記の続き。 Ubuntu 11.04 on PandaBoard 上で自作ゲーム エンジン『Parallel force - パラレル・フォース』が動作しました。 とりあえず OMAP4 の ARM Cortex-A9 を 2 コアちゃんと叩いてくれているみたい。んー。純粋な C++ コードだと Intel Atom …

パッケージ図 〜AICS4 で描いてみました

先日の日記の続き。 『Parallel force - パラレル・フォース』のパッケージ図を Adobe Illustrator CS4 で描いてみました。 ドキュメントとしてまとめる分には astah* のカラーでぜんぜん問題ないのですが、PowerPoint やウェブ上で提示する資料としては、こ…

パッケージ図 〜astah* で描いてみました

『Parallel force - パラレル・フォース』のパッケージ図を astah* で描いてみました。 んー。職場で Visio で描く UML スケッチほどにはキレイに描けないなぁという印象です。もうちょっとフォントとか枠線の色がカスタマイズできるとか、グラデーションに 2…

条件変数 〜Win32API の場合

POSIX スレッド API には pthread_cond_t 型で提供される条件変数という機能があるのですが、Win32API では Vista になるまで当該機能が存在しなかったという話です。 条件変数は、他のスレッド ライブラリには以前から含まれていましたが、残念ながら Windo…

Linux 環境にポーティング完了 〜スクリーンショット

先日の日記の続き。 Ubuntu 11.04 (x86) (VMWare) 上で自作ゲーム エンジン『Parallel force - パラレル・フォース』が動作しました。 感無量です。ポーティング元の環境依存 API は Win32API(一部に XAudio)だけでしたが、ポーティング先は xlib、FreeTyp…

Linux 環境にポーティング 〜プログラミングメモ

先日の日記の続き。 『Parallel force - パラレル・フォース』を X-Window 環境へ移植しています。子供の相手をしながらなので休日の割に歩みが遅いですが、ぼちぼちやってます。 タイマー処理 やりたいことは ms 精度のスリープと、ms 精度の時間カウンタ取…

X-Window でマルチスレッド 〜X11 API (xlib) プログラミング メモ

『Parallel force - パラレル・フォース』のウィンドウ処理とバックバッファの転送処理を X-Window 環境に移植したのですが、X11 API (xlib) のマルチスレッドでどハマリして、解決に結構時間を使いました。以下、解決メモです。 X11 API (xlib) のスレッド…

アフィン行列 〜イメージの変形

先日の日記の続き。 イメージの変形用にアフィン行列を定義しました。速度優先で固定小数(16.16)で実装してみました。演算子のオーバーロードで四則演算も可能。x64 のおかげで乗算時の 64bit 乗算も C/C++ で記述できるようになり、結構気軽な感じです。x…

ポーティング 〜GCC 対応の続き

先日の日記の続き。 GCC 対応をさらに進めるために VMWare Player で Ubuntu 11 をセットアップ。それぞれのソフトウェアのダウンロードから、セットアップ完了まで 1h 未満。光回線、11n の無線 LAN、論理 8 コアの CPU、8GB のメモリ、良い時代になったも…

マルチ プラットフォーム対応 〜Win32 から Linux まで

先日の日記の続き。 パラレル・フォースをマルチ プラットフォーム (主に PandaBoard) 対応すべく、Windows 固有 API 利用箇所を徐々に修正していっています。 機能 Windows Linux 補足 Sound XAudio2 ??? 検討がついてません。というか Windows 版の実装を…

ファイル I/O 〜Win32 から C++ 標準ライブラリへ

先日の日記の続き。 GCC ビルド環境のファイル I/O を Win32 から C++ 標準ライブラリの ifstream 等に変更しました。この辺は標準ライブラリだけあって、つつがなく移行が完了しました。 ただ、相変わらず getFileSize 的な API がなかったり、エラーハンド…

WaitForMuitipleObjects 〜POSIX スレッドでは?

先日の日記の続き。 Win32API のイベント処理に対応する POSIX スレッドの API は下記のようです。 Win32API POSIX 概要 CreateEvent pthread_cond_init 同期オブジェクトの初期化 CloseHandle pthread_cond_destroy 同期オブジェクトの解放 SetEvent pthrea…

Parallel force - パラレル・フォース 〜GCC4 対応を完了

先日の日記の続き。 PandaBoard が届くまで、まだしばらくかかるので、パラレル・フォースの GCC4 向けの移植作業を進めていました。もともと Windows 向けに作っていたので、まず手始めに Cygwin 環境でのビルドに対応しました。C++0x 万歳的なコードですの…

Parallel force - パラレル・フォース 〜CPU 占有率

先日の日記の続き。 改めて Core i7 で CPU 占有率を見ると、高負荷時にまんべんなくコアを使う…ということはなく、結構まばらに CPU リソースを消費しているなぁと感じます。フレーム同期のためにウェイトが入っているので 100% まで上昇しないのは理解でき…

Parallel force - パラレル・フォース 〜デモ更新

前回更新時から随分と期間が経ってしまいましたので、現時点でのコードをまとめてデモを更新しました。今回から x64 ビルド バイナリを追加しました。マルチコア エンジンなので効果がそれと分かるように、デモ画面に CPU 使用率を表示するバーを追加しまし…

描画処理のまとめ 〜アセンブラとの戦い

先ほどまで Parallel force - パラレル・フォースの描画処理をまとめてました。具体的にはコンパイラの出力するアセンブラ コードとにらめっこしてました。見直していると、画素あたりの処理が複雑なようで、下記の問題が発生していました。 画素あたりの処…

Parallel force - パラレル・フォース 〜XMM レジスタによるメモリアクセス

Paralell force - パラレル・フォースのレンダラの画素アクセスは下記の方針で対応しています。 可能な限り XMM レジスタを使用する 可能な限り movdqa 命令でロードおよびストアする 前者はともかくとして、後者がなかなか曲者なのです。 movdqa の使用条件…

Parallel force - パラレル・フォース 〜ドキュメンテーション (2)

先日の日記の続き。 Office 2010 が機能的に素敵なことは良く分かっているので、派生バージョンの Office Web Apps など試してみました。が、サインインして開始 10 秒でログアウトしました。相互参照が使えないとか、アウトラインモードがないとか、ありえ…

Parallel force - パラレル・フォース 〜ドキュメンテーション

仕事では、仕様書を作るときは Office (Word (本文と表) + Visio (UML 図)) で作成したドキュメントを Acrobat (PDFMaker) で PDF 化しているんですけれど、さて。パラレル・フォースも何かドキュメンテーションしたいなぁとか思い始めてます。というのも、…

Parallel force - パラレル・フォース 〜アフィン変換の修正

先日の日記の続き。 凡ミスでした。右端処理自体は実装してあったのですが、右端処理にきちんと移行できていなかったようです。次回のデモから修正が適用されます。あと、回転は未実装です。相方から「そろそろ何か見たい」と言われていて、デモの趣旨を徐々…

Parallel force - パラレル・フォース 〜ディスプレイ解像度 (4)

先日の日記の続き。 現状のコードをまとめました。詳細はこちら。 最新ビルドでは、解像度 1360 x 768 未満の環境は非サポートとなりました。起動時にチェッカを入れたので該当する環境では起動時エラーとなります。 前回デモを公開してから 1 ヶ月以上、空…

Parallel force - パラレル・フォース 〜ディスプレイ解像度 (3)

先日の日記の続き。 実装を進めてフルスクリーンとウィンドウ表示を切り替えられるようにしました。フルスクリーン時のメニューのオン・オフも基本的な動作として実装しました。また、フルスクリーン時の解像度は 1366 x 768 か 1360 x 768 のいずれかで対応…