Chiharu の日記

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

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

Parallel force - パラレル・フォース 〜スリープ調整

忙しくてなかなか手をつけられていないパラレル・フォースですが、ワーカー スレッドのスリープ時間を調整したら、Core i7 で 195fps までいきました。 ボトルネックは表画面への転送じゃなくてスリープだったみたい。これまで毎フレーム必ずスリープしてい…

Parallel force - パラレル・フォース 〜計測まとめ

これまでの高速化の軌跡を、Core i7 870 と Atom D330 とでまとめてみました。 項目i7 860 (fps)D330 (fps)概要 オリジナル152.3単一スレッド処理 並列化627.1複数スレッド処理 並列化 (2)707.6複数スレッド処理 + ループ展開 並列化 (3)818.5複数スレッド処…

Parallel force - パラレル・フォース 〜SSE2 終わり

これ以上の高速化はあんまし思いつかないや、というところまで描画処理をまとめました。一例としてαブレンディングの最適化結果など。 1 画素ずつ処理する場合は、下記の非 SIMD 処理で... inline const PixPacked32 operator()(const PixPacked32 iDst, con…

Parallel force - パラレル・フォース 〜SSE2 苦戦

まさかの凡ミス。SSE2 用の組み込み関数の意味をとり間違えていました。テストしてたらα値付きイメージのフェードで色化け。調べてみると、驚愕の事実。_mm_mul_epu32 がまさか 32bit x 32bit = 64bit だったなんて!普通に乗算結果の下位 32bit を期待して…

Parallel force - パラレル・フォース 〜ちょっと高速化。その 4 (SSE2)

ふとコードを見返したら、イメージの転送元フォーマットが BGR 時、読み込みと BGR / BGRX 変換にて、SSE2 が使えることに気づきました。対応したサンプルをアップしました。 pforce_1.exe … 単一スレッド処理。(15fps) pforce.exe … 複数スレッド処理。(62f…

Parallel force - パラレル・フォース 〜ちょっと高速化。その 3 (SSE2)

結局、SIMD 対応しました。描画処理全般で SSE2 を使ってみました。先週から、いろいろ書き換えて効果が出てきたので、サンプルを公開します。実行ファイルの内訳は下記のとおりです。Intel Core 2 / i3 / i5 / i7 シリーズを使用している場合は、特に SSE2 …

Parallel force - パラレル・フォース 〜ちょっと高速化。その 2

新しい PC はあれから安定して動作しているようです。SE-90PCI のアナログ出力は音がいいですね。デジタル出力のような音の硬さ (多分硬いほうが正確な波形なんでしょう) がなく、柔らかな音の広がりを感じます。その割りに解像感が落ちるわけでもなく。好み…

Parallel force - パラレル・フォース 〜ちょっと高速化

Intel Core i7 の PC を購入しました。相方の要望で、省スペースかつ静かなマシンということで、EPSON DIRECT の Endeavor MR4000 をセレクトしました。CPU は i7-870、メモリは 8GB。グラボは静かな GT220。BD ドライブをつけました。音源が貧弱だったので…

Parallel force - パラレル・フォース 〜FPS 表示など

サンプルにて、マルチコア動作におけるパフォーマンス向上効果が分かるよう、FPS (実効値) をタイトルバーに表示してみました。pforce_1.exe が 1 スレッドで描画、 pforce.exe が論理コア数のスレッドで描画です。環境に依存するのでしょうが、結構効果が出…

Parallel force - パラレル・フォース 〜ビルド オプション変更など

Intel Atom D330 で動作させてみました。ちゃんと 2 コア (4 仮想コア) 動きました。良かったよかった。よくないっ!先ほど確認したら、サンプルのビルド オプションで、ランタイム DLL を参照する設定になっていて、VC10 入れてない環境で動きませんでした…

Parallel force - パラレル・フォース 〜タスク システム、画面エフェクトなど

それとなくタスク システムを実装しました。タイマーを実装していないため、FPS 管理がありませんが、タスク システムのサンプルとして雪など降らせてみました。いつも表現に困ると雪を降らせてる気がします。レパートリーがあまりないようです。 雪スプライ…

Parallel force - パラレル・フォース 〜スプライト管理、並列描画のコードなど (2)

昨日寝る前に、お酒など飲みながら、なんとなく、先ほどの関数を分離してみました。 // // スレッド プロシージャ // void Screen::threadProc(ThreadNotifier& iNotifier) { // コア数取得 const auto aProcessors = SystemInfoHelper::getProcessors(); //…

Parallel force - パラレル・フォース 〜スプライト管理、並列描画のコードなど

なんとなく、並列描画のコードなど公開してみます。 // // 描画スレッド プロシージャ // void Screen::drawerThreadProc(ThreadNotifier& iNotifier) { // コア数取得 const auto aProcessors = SystemInfoHelper::getProcessors(); // 描画スレッド構築 st…

Parallel force - パラレル・フォース 〜スプライト管理、まずはパイプライン 1 段

とりあえず合成先スクリーン 1 枚の描画ルーチンが完成。表画面への転送も含めて、動作確認が取れるところまできました。 スクリーンサイズは 800x600 pix (BGRX)、50 枚のスプライトをαブレンディングしてみました。Intel Core 2 Duo (1.86 GHz) でスレッド…

Parallel force - パラレル・フォース 〜スプライト管理、実装そろそろまとまるかも

結局、スプライト管理と分割描画ルーチンを 1 つのクラスとしてまとめました。1 画面分のスプライトの管理と描画をまとめてあります。描画ルーチンはスレッド用の分割単位でメソッド コールできるようにしてあります。これをスクリーン管理クラスに、単数ま…

Parallel force - パラレル・フォース 〜スプライト管理、実装中

グラフィックス パッケージで矩形フィルとイメージの dot by dot 転送の実装を完了。描画先は RGBX-8bit 固定で、すべての描画ルーチンで下記の組み合わせが利用できるようになっています。 合成モード (通常・加算・減算・乗算・スクリーン合成) 入力カラー…

Parallel force - パラレル・フォース 〜スレッド周り、ひとまず実装終わりです

ロック機構の実装に手間取りました。 これまでロック機構というと、クライアント コードは下記のように実装してきていたのですが…、 CriticalSection aCs; { Lock<CriticalSection> aLock(aCs); // このブロック中はロックされる } このうち、 Lock<CriticalSection> aLock(aCs); のように毎度</criticalsection></criticalsection>…

Parallel force - パラレル・フォース 〜まずは 2D ゲーム用描画エンジン、スレッド周り作ってます

MSVC10 で C++0x をがりがり使ってます。待ちに待ったラムダ式と左辺値の型推論が便利すぎて涙腺が緩みます。無名名前空間にファンクタ定義する必要もなくなりましたし、自動変数宣言時の型も auto か decltype でほとんど伝播可能なので、すっごく便利。コ…

Parallel force - パラレル・フォース 〜並列処理、はじめました

名前だけ宣言しておきます。徐々に進めていきます。内容は近々。プログラム系の話題が多くなると思います。 サークルとして、というよりも齢 30 の節目に Chiharu 個人として、はじめます。