atwiki-logo
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このウィキの更新情報RSS
    • このウィキ新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡(不具合、障害など)
ページ検索 メニュー
FPSを作ってみる@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
FPSを作ってみる@wiki
  • ウィキ募集バナー
  • 目安箱バナー
  • 操作ガイド
  • 新規作成
  • 編集する
  • 全ページ一覧
  • 登録/ログイン
ページ一覧
FPSを作ってみる@wiki
ページ検索 メニュー
  • 新規作成
  • 編集する
  • 登録/ログイン
  • 管理メニュー
管理メニュー
  • 新規作成
    • 新規ページ作成
    • 新規ページ作成(その他)
      • このページをコピーして新規ページ作成
      • このウィキ内の別ページをコピーして新規ページ作成
      • このページの子ページを作成
    • 新規ウィキ作成
  • 編集
    • ページ編集
    • ページ編集(簡易版)
    • ページ名変更
    • メニュー非表示でページ編集
    • ページの閲覧/編集権限変更
    • ページの編集モード変更
    • このページにファイルをアップロード
    • メニューを編集
    • 右メニューを編集
  • バージョン管理
    • 最新版変更点(差分)
    • 編集履歴(バックアップ)
    • アップロードファイル履歴
    • ページ操作履歴
  • ページ一覧
    • このウィキの全ページ一覧
    • このウィキのタグ一覧
    • このウィキのタグ一覧(更新順)
    • このページの全コメント一覧
    • このウィキの全コメント一覧
    • おまかせページ移動
  • RSS
    • このwikiの更新情報RSS
    • このwikiの新着ページRSS
  • ヘルプ
    • ご利用ガイド
    • Wiki初心者向けガイド(基本操作)
    • このウィキの管理者に連絡
    • 運営会社に連絡する(不具合、障害など)
  • atwiki
  • FPSを作ってみる@wiki
  • 進捗状況(2011
  • 09)

FPSを作ってみる@wiki

09)

最終更新:2011年09月30日 23:49

slice

- view
管理者のみ編集可

(2011/09/30)

放置

例によって例の如く記録を放置してしまった.思い出せる範囲で書く.
前回書いた描画ソートはもちろん既に終わった.
エディットボックスのような内容が変化する文字列など予め頂点バッファに転送せずに描画する物は
すぐに描画命令を呼ばずにある程度メモリに溜めてから一気に処理するようにした.
と,これだけなら簡単そうに思えるが実際には頂点形式や使用するテクスチャが違ったりすると
バッファを結合できないのでその辺の判別方法とかが要る.
具体的には最初にオブジェクトから「描画タグ」と言う物を収集する.
描画タグには先程書いたような使用テクスチャ,頂点形式,(HLSLの)Techniqueやαブレンドの有無といったオブジェクトの描画ソートの材料になる変数が記載されていて,
これらとユーザーの提示した「ソート手順」を用いオブジェクトのソートを行う.
そしてソートの結果「一括描画出来る」と判断した範囲については一括描画,そうでない所は個別にD3DのDrawAPIを呼ぶ.

1つのオブジェクトからは複数の描画タグを出力でき,またタグを取得する際に文字列の「キー」を指定する仕組みで
例えば"low"を渡せば遠距離用のローディティールモデル,"high"なら高精度なモデルを描画するよう
仕向ける事も出来る.
(というか別にオブジェクトと1対1にする必要性も無かったからそうなってるだけ)

毎フレームタグを収集,ソートしてたら重いのではないか?
これについては感覚だがオブジェクトの数が50くらいまでなら問題ないだろうという判断.
大量のパーティクルや2Dシューティングなんかの弾幕を描画したいのなら
それ専用のクラスを作って纏めて管理するとか.
まぁ実際に速度で問題が出たらおいおい改良していくとして・・・
ここまでが上旬の話.

中旬はSVNの履歴を見るにカメラクラスの移植,
キー入力クラス,行列クラス,ベクトルクラス,テキストフォントキャッシュ周辺のリファクタリング
それと3D空間内でのテキスト描画などなど.
実を言うと自作エンジンをLuaメインに据えて作り直してから
まともに3D空間を扱ってなかったからちゃんとしました,という.

下旬に入ってからは「Debugビルドとはいえ,な~んか重いなあ・・・」という訳で
前々から気になっていたコリジョンの判定ルーチンを作り直し.
逐一コリジョンタグ(※1)を見て内部リストの展開の有無や衝突判定関数の呼び分けをする関係上
分岐を多用していて,これは計算時間もそうだがキャッシュに悪い.
そもそも双方のコリジョンタグを見た段階で手順は決まる物だから前処理で手順をリスト化するか
初回だけ計算で求めて以降は使い回すのが普通だろう.
前計算すると組み合わせが膨大になるのでここでは後者を選択した.

さてパフォーマンスは・・・と思ったら期待した程ではなかったのでここに来てプロファイラを導入(※2).
するとどうだろうか.当たり判定自体よりもLuaからのデータ転送に処理を食っているという・・
よく調べてみるとLuaのAPIを呼ぶ分には速いものの自作のLuaValue互換クラス(※3)が重い.
更に調べるとマルチスレッドに対応するためのリソースロック,アンロックを何かする度にしているので
これがネックという事がわかった.
かといってLua-APIを直接呼ぶのでは本末転倒,改善策を考える.

思案の末「マルチスレッド対応は必要な部分だけする」という至極真っ当な結果に.
単にラッパークラスとして使いたい場合にリソース管理だなんだの同期は無駄な訳で.
要するに「シングルスレッド動作で構わないクラスはロック・アンロックしないバージョンを使う」という事.
言葉にすりゃ簡単だが既にマルチスレッド対応で作ってしまった物を
じゃあ一部だけ速度重視のシングルスレッド動作させようかと思ってもなかなか面倒ではある.(が,やるしかない)
悪あがきとしてテンプレートを使ったポリシーで速度とコード量の両立化を計ってみたりとか.

今月はパフォーマンスアップのためのアレコレが多かった.
しかしあと2箇所程修正,改良すれば速度が懸念される部分は無くなるので一安心といったとこか.

※1 ポリゴン,円柱等の物体の形状やリスト構造を表すID
※2 Game Programming Gems 1に記載されている簡素なアルゴリズムを,ちょこっとアレンジしたバージョン
※3 スタックベースのLua-APIをラップしてテーブルのアクセスを["item"]等C++風に記述できるようにしたクラスを
  更にリソースハンドル管理,マルチスレッド対応にした物

(2011/09/05)

描画ソート

最近なんだかwikiが重いから更新する気も起きない・・・
更新の間が空くと何したかを忘れるからそれ用の時間を決めたい所だな.

さて.現在描画の最適化をしている.
この前はフォント描画をまとめてやる話をしたけど今度は本腰を入れた大がかりなエンジン改修.
実にエンジン本体クラス8割のコードを書き換え.
というのもTwitterAPIで試しに最大20件の呟きを取得し,その数だけ自前GUIのウィンドウに表示させたら思いの外重かったからだ.
Debugビルドとはいえこの程度で処理落ちとは情けない話ではないか.
原因はというと,描画にはすべてUP系の関数(つまり1つ矩形を描く度に頂点バッファをその都度確保,破棄している)を使う関係上
多大なオーバーヘッドが生じているのは想像に難くない.
丼勘定でウィンドウ1つにつき矩形3つ,枠が2つ,テキスト1つを要し
これが20個だと60, 40, 20回のDrawPrimitiveUP()が呼ばれている計算になる.

恐らく今時のプロセッサなら1フレームに120回の呼び出しなんぞ余裕だろう.
が,UPなのでバッファの生成・破棄も120回ずつのおまけ付き.途端に厳しい.
そもそも何故UPかと言えば単に自分が勉強不足なだけで動的な頂点バッファ,インデックスバッファを利用したことがなかった為だ.
というわけでいつも通りMSDNを参照しつつ動的バッファの使い方やD3Dのパフォーマンスを引き出す方法を学んだ.

パフォーマンスを引き出すと言えば大げさだが特に小難しい話ではない.ざっくりと説明するなら大まかに3つ.
  • 「DrawPrimitive関数の呼び出し回数を抑える」
GPUはCPUと独立して動いているという事を念頭に置いた設計(D3DLOCK_DISCARDなどのロックのフラグを適切に選択)
  • 「リソースの切り替えを最小限に」
GPUのキャッシュに影響
  • 「不透明ポリゴンは手前から描画(Zクリップを期待)」
Zクリップされれば以降のピクセル処理が不要になる

基本的にオブジェクトの描画順を工夫するのだなという事は察しがつくと思う.
エンジンはオブジェクトの描画要求を受け取ったらすぐには描画せずにキューに貯めておき
描画の必要性が生じたらテクスチャやカメラからの距離をキーとしてソートし,まとめてD3Dにコマンドを送る.
ソート対象のキー,優先順位は予め定義されたソートアルゴリズムのインタフェースを配列として表現.
例えばまず距離でソートして,その内距離が10.0以内のオブジェクトを同位置として扱い更にテクスチャでソートをかけたいなら
SetSortAlg(new IFSortDistance(true, 10.0f), new IFSortTexture());
とする.ちなみにこの関数は可変引数としてあり,任意の数のソートをかけられる寸法.
IFSortDistanceの第一引数は降順か昇順かのフラグである.
テクスチャのソートは同じ種類が隣に来るという点が大事なのであって降順だろうが何だろうが関係ないので引数無し.
頂点バッファとインデックスバッファについても以下同文.

後はソートしたオブジェクトを普通に描画すれば冗長なステート変更はD3D内部で自動的に省略される(※1)ので処理の効率化が望める.
ううむ,言葉にするとそれだけだな.実装は仕様が二転三転して難航したのだが.

※1 ドキュメントに書いてあった.http://207.46.16.248/ja-jp/library/bb219721%28VS.85%29.aspx 「D3DCREATE_PUREDEVICE フラグの目的は何ですか」の項を参照.
「09)」をウィキ内検索
LINE
シェア
Tweet
FPSを作ってみる@wiki
記事メニュー
  • トップページ
  • 参考資料ブックマーク等
  • Tips

Media

  • 頂き物
Screen shot
  • FPS_page1
  • FPS_page2
  • FPS_page3
  • Other_page1
Drawing
  • Drawing(analog)
  • Drawing(digital)
  • Drawing(digital) 2
  • Drawing(digital) 3
  • Drawing(digital) 4
  • Drawing(digital) 5
  • Drawing(digital) 6
  • Drawing(digital) 7
  • Drawing(digital) 8
  • Drawing(digital) 9
  • Drawing(digital) 10
  • Drawing(digital) 11
  • Drawing(digital) 12
  • Drawing(digital) 13
Movie
  • movies-list

Old Contents

  • トップページ(old)
  • メモ書き
  • 力仕事UP場
  • ゲームシステムとか
  • バグ・動作報告
  • program(twilve)

Progress log

  • (2018/03)
  • (2017/04)
  • (2017/03)
  • (2016/10)
  • (2016/09)
  • (2016/08)
  • (2016/07)
  • (2016/06)
  • (2016/05)
  • (2016/04)
  • (2016/03)
  • (2016/02)
  • (2016/01)
  • (2015/12)
  • (2015/11)
  • (2015/10)
  • (2015/09)
  • (2015/08)
  • (2015/07)
  • (2015/06)
  • (2015/05)
  • (2015/04)
  • (2015/03)
  • (2015/02)
  • (2015/01)
  • (2014/12)
  • (2014/11)
  • (2014/10)
  • (2014/09)
  • (2014/08)
  • (2014/07)
  • (2014/06)
  • (2014/05)
  • (2014/04)
  • (2014/03)
  • (2014/02)
  • (2014/01)
  • (2013/12)
  • (2013/11)
  • (2013/10)
  • (2013/09)
  • (2013/08)
  • (2013/07)
  • (2013/06)
  • (2013/05)
  • (2013/04)
  • (2013/03)
  • (2013/02)
  • (2013/01)
  • (2012/12)
  • (2012/11)
  • (2012/10)
  • (2012/09)
  • (2012/08)
  • (2012/07)
  • (2012/06)
  • (2012/05)
  • (2012/04)
  • (2012/03)
  • (2012/02)
  • (2012/01)
  • (2011/12)
  • (2011/11)
  • (2011/10)
  • (2011/09)
  • (2011/08)
  • (2011/07)
  • (2011/06)
  • (2011/05)
  • (2011/04)
  • (2011/03)
  • (2011/02)
  • (2011/01)
  • (2010/12)
  • (2010/11)
  • (2010/10)
  • (2010/09)
  • (2010/08)
  • (2010/07)
  • (2010/06)
  • (2010/05)
  • (2010/04)
  • (2010/03)
  • (2010/02)
  • (2010/01)
  • (2009/12)
  • (2009/11)
  • (2009/10)
  • (2009/09)
  • (2009/08)
  • (2009/07)
  • (2009/06)
  • (2009/05)
  • (2009/04)
  • (2009/03)
  • (2009/02)
  • (2009/01)
  • (2008/12)
  • (2008/11)
  • (2008/10)
  • (2008/09)
  • (2008/08)
  • (2008/07)
  • (2008/06)
  • (2008/05)
  • (2008/04)



記事メニュー2

Update Log

取得中です。
人気記事ランキング
  1. Drawing_analog
もっと見る
最近更新されたページ
  • 2686日前

    menu_L
  • 2686日前

    進捗状況(2018/03)
  • 2686日前

    Drawing_digital_13
  • 2686日前

    Drawing_digital_12
  • 2686日前

    トップページ
  • 2892日前

    Drawing_digital_11
  • 2973日前

    Drawing_digital_10
  • 3005日前

    進捗状況(2017/04)
  • 3046日前

    進捗状況(2017/03)
  • 3097日前

    頂き物
もっと見る
人気記事ランキング
  1. Drawing_analog
もっと見る
最近更新されたページ
  • 2686日前

    menu_L
  • 2686日前

    進捗状況(2018/03)
  • 2686日前

    Drawing_digital_13
  • 2686日前

    Drawing_digital_12
  • 2686日前

    トップページ
  • 2892日前

    Drawing_digital_11
  • 2973日前

    Drawing_digital_10
  • 3005日前

    進捗状況(2017/04)
  • 3046日前

    進捗状況(2017/03)
  • 3097日前

    頂き物
もっと見る
ウィキ募集バナー
新規Wikiランキング

最近作成されたWikiのアクセスランキングです。見るだけでなく加筆してみよう!

  1. MadTown GTA (Beta) まとめウィキ
  2. AviUtl2のWiki
  3. R.E.P.O. 日本語解説Wiki
  4. 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  5. シュガードール情報まとめウィキ
  6. ソードランページ @ 非公式wiki
  7. ドラゴンボール Sparking! ZERO 攻略Wiki
  8. シミュグラ2Wiki(Simulation Of Grand2)GTARP
  9. 星飼いの詩@ ウィキ
  10. Dark War Survival攻略
もっと見る
人気Wikiランキング

atwikiでよく見られているWikiのランキングです。新しい情報を発見してみよう!

  1. アニヲタWiki(仮)
  2. ストグラ まとめ @ウィキ
  3. ゲームカタログ@Wiki ~名作からクソゲーまで~
  4. 初音ミク Wiki
  5. 検索してはいけない言葉 @ ウィキ
  6. 機動戦士ガンダム バトルオペレーション2攻略Wiki 3rd Season
  7. 発車メロディーwiki
  8. Grand Theft Auto V(グランドセフトオート5)GTA5 & GTAオンライン 情報・攻略wiki
  9. オレカバトル アプリ版 @ ウィキ
  10. SDガンダム ジージェネレーションジェネシス 攻略Wiki
もっと見る
全体ページランキング

最近アクセスの多かったページランキングです。話題のページを見に行こう!

  1. 過去の行動&発言まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  2. マイティーストライクフリーダムガンダム - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  3. 魚拓まとめ - 鹿乃つの氏 周辺注意喚起@ウィキ
  4. 参加者一覧 - ストグラ まとめ @ウィキ
  5. 1103環境(遊戯王) - アニヲタWiki(仮)
  6. 前作からの変更点 - 機動戦士ガンダム EXTREME VS.2 INFINITEBOOST wiki
  7. 魔獣トゲイラ - バトルロイヤルR+α ファンフィクション(二次創作など)総合wiki
  8. コレクター・ユイ - アニヲタWiki(仮)
  9. サーヴァント/一覧/クラス別 - Fate/Grand Order @wiki 【FGO】
  10. 画像倉庫 - 鹿乃つの氏 周辺注意喚起@ウィキ
もっと見る

  • このWikiのTOPへ
  • 全ページ一覧
  • アットウィキTOP
  • 利用規約
  • プライバシーポリシー

2019 AtWiki, Inc.