Chiharu の日記

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

C++

Parallel force - パラレル・フォース 〜表画面への転送 (2)

先の日記の日付を 2 度にわたって間違える始末。眠いとミスも増えますね。気をつけよう。 さて、バックバッファの扱いをちょっと再考しています。 昨日の日記のとおり、現在、描画処理に『裏画面の合成』と『表画面への転送』という 2 つのステージを設けて…

Parallel force - パラレル・フォース 〜表画面への転送

ティアリング回避に際して、描画の並列度が低下して速度が落ちる件ですが、表画面への転送処理を非同期化することで解消しました。詳細はこちら。 これで、タスク処理、裏画面合成、表画面転送が非同期になりました。単純な fork, join でないので、タスク管…

Parallel force - パラレル・フォース 〜ティアリング改善

画面更新時のティアリングが見るに耐えないので、バックバッファを実装しました。詳細はこちら。 表画面への転送を一回の StretchDIBits で処理するようにしたため、以前よりも並列度が低下しますが、ティアリングは軽減しています。裏画面は相変わらず分割…

Parallel force - パラレル・フォース 〜FPS とティアリング

パラレル・フォースの過負荷時の処理について、処理落ちかコマ落ちのいずれにしようか迷いましたが、コマ落ちにしました。詳細はこちら。 昨日までの実装では、描画処理後にタスク処理を逐次実行していたのですが、これだとコマ落ちの際にタスクの処理間隔が…

Parallel force - パラレル・フォース 〜サウンド周り (2)

とりあえず効果音用のものだけまとめました。 今時、サウンド機能がない環境があるのかどうか分かりませんが、NullDevice パターンで XAudio2 の初期化に失敗する環境でも、実行だけはできるようにしました。まぁ、保険的な意味合いで。

Parallel force - パラレル・フォース 〜サウンド周り

サウンド周りの設計に入りました。グラフィックスはとりあえず、ちょっと置いておきます。ゲームのエンジンだといっているのにグラフィックス実装ばかり進んで行くのはあまりにもアレだと感じましたので。 過去の経験から、効果音には DirectSound で、BGM …

Parallel force - パラレル・フォース 〜文字の描画でけた

現在公開中のデモの文字描画は結構やっつけ実装でしたが、先ほど、ちゃんとまとめて、まともな実装に修正しました。描画対象のテキストも、イメージ同様にテキストとしてスプライト管理するようにしました。あと、やっつけ実装では加算合成で白文字を描画し…

Parallel force - パラレル・フォース 〜画面の更新について

昨日アップしたイメージ中の『WAITING FOR I-SU-CHI』の上方が少しズレています。これは画面を分割描画及び分割更新していることにより、前フレームと現フレームが混在してしまったものです。もしかすると遅い PC の場合、画面更新が垂直同期に追いつかない…

Parallel force - パラレル・フォース 〜文字列描画に対応しました

すっかり忘れていて、さっくり実装しました。文字列描画です。下図の『これはスクリーン 2 です。(MS Pゴシック で表示中)』が描画した文字列です。 GDI の GetGlyphOutline API でアンチエイリアス付きグリフデータを取得して、イメージ スプライトとし…

Parallel force - パラレル・フォース 〜x64 対応しました

Win64 対応とか書いておきながら公開バイナリは Win32 版のみという、ちょっと寂しい状況でしたので、開発環境を整備して x64 ビルドしてみました。 型の不一致で 4-5 箇所くらい修正しましたが、それ以外はすんなりコンパイルが通りました。修正内容は、デ…

Parallel force - パラレル・フォース 〜トランジションくっきりはっきり

αマスクによるトランジションにステップ数指定機能を実装しました。デモにも反映しました。以前のデモよりもスクリーン切り替えの境界線がくっきりしていると思います。詳細はこちら。 次はイメージの回転か、或いは、ちょっとやってみたいトランジションが…

Parallel force - パラレル・フォース 〜トランジションのデモ追加

デモにトランジション処理を追加しました。αマスクは適当に用意したものですので、エフェクトには当たり外れがあるかも。詳細はこちら。凡ミスもいくつか修正してあります。んー。画素の合成処理が増えてきたので、だんだん SIMD の効果が顕著になってきまし…

Parallel force - パラレル・フォース 〜αマスク トランジションでけたー

昼過ぎから四苦八苦しながら実装してました。αブレンディングによるエフェクトなので SIMD が良く効きます。例によって SSSE3 まで対応しています。今日はもう夜遅いので、デモをまとめるのは明日にしようと思います。

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

体調不良で今日は会社を休みました。肺炎やってからなかなか復調しません。半日くらい寝てました。 とりあえず、先ほどアフィン変換の線形補間のα値保持バージョンを実装しました。デモに反映しても絵的な変化がないので、公開は次の機会に。

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

イメージの拡大縮小処理の実装をとりあえず完了しました。線形補間の処理負荷が思っていたよりも高く、慌てて SSE2, SSSE3 に対応させました。むー。アフィン変換の線形補間は SSE2 には荷が重いですね。SSSE3 が使えないと、パック、アンパックの嵐であまり…

Parallel force - パラレル・フォース 〜動物園とアフィン変換

今日は私と相方と子供二人で、名古屋の東山動物園に行ってきました。 最近、絵本やテレビで動物に興味を持ち始めた上の子供に、本物の動物を見せてあげたいと思って出かけました。が、なかなか計画通りとは行かず。まず昨夜、子供がなかなか寝付かず、その日…

Parallel force - パラレル・フォース 〜SSSE3 でフェード完了

実装したらうまくいったようです。偶数版は SSE2 よりも 2 割くらい速い、かな。奇数版は SSE2 とどっこいです。デモのスプライトの重ね合わせのフェード値が奇数に偏っていたため、効果確認用に、Z オーダー順に奇数偶数と交互に設定するようにしました。微…

Parallel force - パラレル・フォース 〜SSSE3 乗加算、惜しい!

_mm_maddubs_epi16 を使用したαブレンディングですが、再考察したところ、0-256 は無理ですが、0-128 ならいけますね。α値が 0 のケースはそもそも上流で描画をカットしていますし、またα値が 128 (=256) の場合は上流で単純転送に振り分けています。つまり…

Parallel force - パラレル・フォース 〜次はアフィン変換?

次はアフィン変換かなー。よく使いそうですし。 ところで SSSE3 の _mm_maddubs_epi16 がいまいち使えませんでした。αブレンディングに組み込めないか検討したのですが、乗数が符号付バイトということで、-128 〜 127 の範囲しか使えません。これが符号無な…

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

高速化の効果が大きかったので SSSE3 を導入しました。動的切り替えにより、非サポート CPU では SSE2 で動きます。また、機能面では複数スクリーン処理を追加しました。デモには、2 つのスクリーンをクロス フェードするようにしました。一方はこれまでのデ…

Parallel force - パラレル・フォース 〜SIMD まだまだ

公開中のデモについて、Atom や Core i7 では SSE2 適用でとても高速化するのですが、Core 2 であまり速くならず、何故だろうとインテル最適化マニュアルを紐解いてみると、あらなんと。Core 2 では XMM レジスタを使用した演算が、それ以前のアーキテクチャ…

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複数スレッド処…

プログラミングお遊戯 〜std::minmax_element を使用したソート

C++

επιστημηさんの『わすれもので(ちょびっと)高速化』に挑戦! 掲載のサンプルをビルドして Core i7 で実行すると... 359 (min_selection) 421 (minmax_selection) んー。ご本人の環境では高速化が確認されたようですが、私の環境だと minmax_element が速くな…

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 のアナログ出力は音がいいですね。デジタル出力のような音の硬さ (多分硬いほうが正確な波形なんでしょう) がなく、柔らかな音の広がりを感じます。その割りに解像感が落ちるわけでもなく。好み…