Parallel force - パラレル・フォース
えーと。IME 無効化も基本中の基本機能なんですが、また複数の API が出てきました。 ImmDisableIME WINNLSEnableIME んー。どっちを使うのが望ましいんだろう。ゲーム プログラム起動中に IME を無効化したいだけなんですけれど。…ちょっと考えます。
先日の日記の続き。 ChangeDisplaySettings を使用して解像度設定とフルスクリーン化に対応しました。WM_SETFOCUS, WM_KILLFOCUS に応答することで、DirectX 版と遜色ない動作になりました、…と思います。あとは実装をまとめれば対応完了! なのですが…ただ…
ゲーム エンジンとしてすごく基本的な機能の実装をずいぶんと後回しにしてきました。フルスクリーン表示用のディスプレイ解像度の変更機能を検討しています。 アリスの街 147(リメイク版)では Win32API の ChangeDisplaySettings API を使用していました。…
パラレル・フォースではスプライト関連処理として下記のクラスを用意しています。 (多分そのうちまた増えますが、現状はこんな感じ。 外部公開クラス ISprite: スプライトの基底クラス(インタフェース) FillSprite: 単一色の塗りつぶしスプライト ImageSp…
そろそろゲームらしいものを作ろうと、色々弄っていたらぼちぼちバグが出てきました。出てきたバグをぷちぷちつぶしました。 コードを編集していると、相方から「またグレーの画面出してる。グレーの画面そんなに楽しいの?」と言われてます。折角なのでその…
もー、バックバッファ コピーの設計が気持ち悪くて気持ち悪くて再設計しました。詳細はこちら。 結局フリップに対応しました。多分、これでバックバッファの扱いは完成形です。前よりちょっと速くなっているはず。SSE2 使ってキャッシュ制御して、やっと落ち…
現状のコードをまとめました。詳細はこちら。 裏画面合成処理における分割描画についても、ちょこちょこ最適化しました。SSSE3 を使用したグレースケール画素データのロードと、描画タスクのクリッピングが対象です。Intel Atom だと 1 割くらい速くなってい…
バックバッファのコピー回避でーきたっと。ベスト エフォート型の回避だけど、パフォーマンス上がりました。よかったよかったー。 とりあえず今日はここまで。
先の日記の日付を 2 度にわたって間違える始末。眠いとミスも増えますね。気をつけよう。 さて、バックバッファの扱いをちょっと再考しています。 昨日の日記のとおり、現在、描画処理に『裏画面の合成』と『表画面への転送』という 2 つのステージを設けて…
ティアリング回避に際して、描画の並列度が低下して速度が落ちる件ですが、表画面への転送処理を非同期化することで解消しました。詳細はこちら。 これで、タスク処理、裏画面合成、表画面転送が非同期になりました。単純な fork, join でないので、タスク管…
画面更新時のティアリングが見るに耐えないので、バックバッファを実装しました。詳細はこちら。 表画面への転送を一回の StretchDIBits で処理するようにしたため、以前よりも並列度が低下しますが、ティアリングは軽減しています。裏画面は相変わらず分割…
パラレル・フォースの過負荷時の処理について、処理落ちかコマ落ちのいずれにしようか迷いましたが、コマ落ちにしました。詳細はこちら。 昨日までの実装では、描画処理後にタスク処理を逐次実行していたのですが、これだとコマ落ちの際にタスクの処理間隔が…
とりあえず効果音用のものだけまとめました。 今時、サウンド機能がない環境があるのかどうか分かりませんが、NullDevice パターンで XAudio2 の初期化に失敗する環境でも、実行だけはできるようにしました。まぁ、保険的な意味合いで。
サウンド周りの設計に入りました。グラフィックスはとりあえず、ちょっと置いておきます。ゲームのエンジンだといっているのにグラフィックス実装ばかり進んで行くのはあまりにもアレだと感じましたので。 過去の経験から、効果音には DirectSound で、BGM …
現在公開中のデモの文字描画は結構やっつけ実装でしたが、先ほど、ちゃんとまとめて、まともな実装に修正しました。描画対象のテキストも、イメージ同様にテキストとしてスプライト管理するようにしました。あと、やっつけ実装では加算合成で白文字を描画し…
昨日アップしたイメージ中の『WAITING FOR I-SU-CHI』の上方が少しズレています。これは画面を分割描画及び分割更新していることにより、前フレームと現フレームが混在してしまったものです。もしかすると遅い PC の場合、画面更新が垂直同期に追いつかない…
すっかり忘れていて、さっくり実装しました。文字列描画です。下図の『これはスクリーン 2 です。(MS Pゴシック で表示中)』が描画した文字列です。 GDI の GetGlyphOutline API でアンチエイリアス付きグリフデータを取得して、イメージ スプライトとし…
Win64 対応とか書いておきながら公開バイナリは Win32 版のみという、ちょっと寂しい状況でしたので、開発環境を整備して x64 ビルドしてみました。 型の不一致で 4-5 箇所くらい修正しましたが、それ以外はすんなりコンパイルが通りました。修正内容は、デ…
αマスクによるトランジションにステップ数指定機能を実装しました。デモにも反映しました。以前のデモよりもスクリーン切り替えの境界線がくっきりしていると思います。詳細はこちら。 次はイメージの回転か、或いは、ちょっとやってみたいトランジションが…
デモにトランジション処理を追加しました。αマスクは適当に用意したものですので、エフェクトには当たり外れがあるかも。詳細はこちら。凡ミスもいくつか修正してあります。んー。画素の合成処理が増えてきたので、だんだん SIMD の効果が顕著になってきまし…
昼過ぎから四苦八苦しながら実装してました。αブレンディングによるエフェクトなので SIMD が良く効きます。例によって SSSE3 まで対応しています。今日はもう夜遅いので、デモをまとめるのは明日にしようと思います。
体調不良で今日は会社を休みました。肺炎やってからなかなか復調しません。半日くらい寝てました。 とりあえず、先ほどアフィン変換の線形補間のα値保持バージョンを実装しました。デモに反映しても絵的な変化がないので、公開は次の機会に。
イメージの拡大縮小処理の実装をとりあえず完了しました。線形補間の処理負荷が思っていたよりも高く、慌てて SSE2, SSSE3 に対応させました。むー。アフィン変換の線形補間は SSE2 には荷が重いですね。SSSE3 が使えないと、パック、アンパックの嵐であまり…
今日は私と相方と子供二人で、名古屋の東山動物園に行ってきました。 最近、絵本やテレビで動物に興味を持ち始めた上の子供に、本物の動物を見せてあげたいと思って出かけました。が、なかなか計画通りとは行かず。まず昨夜、子供がなかなか寝付かず、その日…
実装したらうまくいったようです。偶数版は SSE2 よりも 2 割くらい速い、かな。奇数版は SSE2 とどっこいです。デモのスプライトの重ね合わせのフェード値が奇数に偏っていたため、効果確認用に、Z オーダー順に奇数偶数と交互に設定するようにしました。微…
_mm_maddubs_epi16 を使用したαブレンディングですが、再考察したところ、0-256 は無理ですが、0-128 ならいけますね。α値が 0 のケースはそもそも上流で描画をカットしていますし、またα値が 128 (=256) の場合は上流で単純転送に振り分けています。つまり…
次はアフィン変換かなー。よく使いそうですし。 ところで SSSE3 の _mm_maddubs_epi16 がいまいち使えませんでした。αブレンディングに組み込めないか検討したのですが、乗数が符号付バイトということで、-128 〜 127 の範囲しか使えません。これが符号無な…
高速化の効果が大きかったので SSSE3 を導入しました。動的切り替えにより、非サポート CPU では SSE2 で動きます。また、機能面では複数スクリーン処理を追加しました。デモには、2 つのスクリーンをクロス フェードするようにしました。一方はこれまでのデ…
公開中のデモについて、Atom や Core i7 では SSE2 適用でとても高速化するのですが、Core 2 であまり速くならず、何故だろうとインテル最適化マニュアルを紐解いてみると、あらなんと。Core 2 では XMM レジスタを使用した演算が、それ以前のアーキテクチャ…
これまでの実装実績のまとめとして、デモを公開しました。詳細はこちら。んー。時間見つけてさっさとゲーム作りに移行したいです。がんばろ。できる範囲で。