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

FPSを作ってみる@wiki

01)

最終更新:2011年01月30日 04:16

slice

- view
管理者のみ編集可

(2011/01/30)#2

進捗

残念ながら今の自分の能力からして皆様のご期待には多分,添えない.
このwikiページの存在は一度忘れて貰って,ふと思い出した頃に覗いてくれるといいな.

さて
luaの話を書いたら長くなったので改めて進捗状況を記す.
現在は視野外で描画の必要がないOBJのカリング処理をスキップする処理を汎用性を持たせた上で組み込もうと試行錯誤.
同様に主人公から遠く離れている,見えない物体はアニメーション等の更新処理を省く場合もあるだろうという事でそれも含めて
アップデートの機構を見直し.
今までそういうのはちぃとも考えてなかったのだ.すべて1つのリストに放り込んでいたし
描画するかしないかは各々のOBJが自分で描画リストや更新リストに自身を加えたり外したりでやっていた.
否,正確には誤魔化していたと言えよう.
それでゲームが作れなくはないと思うが・・・1つのゲーム用にカッチリ作り込むしかないだろうな.

話を戻して,OBJ全てをリストに放り込む方式では
多数の敵が居る広大なマップなんかで毎フレーム100や1000回も判定していたんじゃあ埒があかないので却下.
普通は部屋ごとに分けてリストを確保,カメラがある部屋とそこからみえる部屋の所だけ処理するよなあ・・

とりあえず,表示されるオブジェクトを割り出す処理やカメラからの距離ソートはそれなりに重いからluaでやりたくない.
描画順に関しても不透明ポリゴンはZカリングを期待して手前からさせたいし半透明ポリゴンは奥からでないと不具合が出る
時にはカメラ距離を無視してユーザーの指定した優先度順が適した場面もあるだろう.
そう考えるとソートアルゴリズムは分離した方が良さそうだが・・
ぐだぐだぐだ.中々決まらない.

決まらん事にはプログラムが書けないので作業してる感も無く,辛い今日この頃

(2011/01/30)

luaとか

ちょっと油断するとすぐ間が空く.
細々としたバグ修正などはしてるがいつも通り目に見える進歩がないというか.
subversionの履歴を見るに18日から27日まではパフォーマンスアップ関連の事をしていたようだが・・
Luaのどの命令が重いのか,どうやったら効率の良いスクリプトを書けるのか調べたり時間を計ってみたりもした.
いや基本的にどうあがいてもCより7~8倍程度重いわけだが.それでもなるべく効率の良いコードを書きたいと思うのは自然だろう.

以下,わかった事を適当に述べる.キャッシュの無効化とかは全くしてないからフーン程度に.
言うまでも無いがtable["item"] といったテーブル参照命令は,書けば書いた回数だけ参照が行われるので
同じ関数で2度以上使う場合はローカル変数に置く.math.floor() も例外ではない.
(間にyieldがある場合は除く)

大ざっぱに計ったらテーブル参照一回分と関数呼び出し一回分は関数呼び出しの方が若干重いくらい?

メタテーブルで関数を指定すると当然ながら関数呼び出し一回分はかかる
凝った事をしようとして深くネストさせると悲惨な事に

一回のテーブル参照に対し重そうな浮動小数点数の割り算でさえ5~6回は出来そう

テーブルのインデックスを連番の数値にすると内部で配列表現される為メモリの効率は良くなる筈だが
(少なくとも要素数10以下では)アクセス速度はハッシュの方が微妙に速かった

プログラム実行において一般的に重いと言われがちな分岐命令のコストはテーブルアクセスに比べると
微々たる物なので過度に節約する必要はない

メタテーブルに影響されず生のアクセスを行うrawget/rawsetは
rawgetという関数を呼び出しているのでテーブルアクセス + 関数一回分となってしまう罠
メタテーブルに影響されないとわかってるなら普通アクセスにすべき

関数の終端呼び出しはメモリ効率は(略)だけど速度的には変わらん

luaには汎用forループと算術forループがあるが前者はループする度に関数呼んでるから(略
(ipairs()って要るんか?)
算術は算術で値の評価が最初の実行時のみ行われるのが厄介で,特に多重ループ脱出時に面倒

これらの多くはバイトコード見てればすぐわかる事だけど・・・とにかくそんな感じだ

自分としては関数の呼び出しとテーブル参照が同じ位重いっていうのが結構な落とし穴だと思った.
Cだと配列から読むのなんて訳ないもんねぇ.
関数内に定数のつもりで即席テーブル作ってそこに数値を入れて何か処理するとかもやばそう.

そう.定数といえば以前はluaに定数が無いのを不満に思ってネット上であちこち探して定数の擬似的な記述方法を
参考にしたりしていたが
(グローバルテーブルにメタテーブルを設定して色々っていう方式)
上記の事を踏まえると無駄に重いという結論に至り,辞めた.

知れば知るほどluaという言語はシンプルなもので
変数の型を調べるtype()でさえ特別扱いせずグローバル空間から関数を引っ張ってきてるのだ.
強いて言えば整数型くらいは欲しがこのシンプルさは初めてプログラム言語を触る人でも
BASIC並にとっつきやすい言語かもしれない.

(2011/01/18)

速度が気になる

前々から気にはしていたけれど,どうせ自分しか動かさないしとテキトーに実装していた「fpsを60に保つ部分」をちゃんと作り直した.
QueryPerformanceCounterで時間を見て処理間隔を調整するという基本は変わらないがまだ時間ありそうならSleep(0)しておき,
近くなったらループを回すだけの仕様だったので当然ながらフレーム更新の間隔が毎回微妙にずれていた.※1
しかし今回はちゃんとマルチメディアタイマで次回の更新1ms手前まで待機させ※2
そこからQuery~でループして時間を正確にあわせるようにした.60fpsだとmsで割り切れない問題にも対処.

で,あとは引き続きLua関連の高速化.
いくらスクリプトとはいえ依然として動作速度が満足いかないというのがあり※3
調べてみたらCの関数を呼ぶ際の処理で殆どの時間を食っている模様.
そこでスクリプト記述とコンパイル結果を参考に,あとLuaのソースもちょびっと見つつ処理効率の改善を図る.
通常のインタプリタ方式ではなく適時リコンパイルするLua-JITという物もあるがそれは最終手段ということで.

それと後々裏でマップ計算などさせたい為マルチスレッドを意識したリソース管理にしているが
実際にビルドされたアセンブリの結果を見ていると同期処理に結構な命令数が割かれているのが気がかり.
要は中身にアクセスする度ロック・アンロックしているわけだから仕方ないといえばそうなのだが・・
少し記述を変えればシングルスレッド専用へ切り替えられるようにはしてあるから複数スレッドで共有するリソースと
そうでない物を分ける形になりそうだ.

なんとなくだがLuaのライブラリを既にビルドしてあるバイナリを使うのを止めて自分でコンパイルした物を使うようにした.
先々週に整数型もどきを作った事もあり,Luaの数値型が最早doubleである必要がなくなったのでfloatにしたりだとか.
で,D3Dの初期化フラグD3DCREATE_FPU_PRESERVEをはずす.※4
25bit以上の数値が必要な整数なんてフラグぐらいしかないかなあとも思ったし.

※1 Sleep関数は処理が戻ってくる時間が正確でない
※2 自分の環境で計測したところマルチメディアタイマは(Sleep程ではないが)0.7ms程度の遅延があるようだ
※3 2Dマップにジャンプと当たり判定装備の主人公キャラクター1つ動かすだけでCPU占有率6%っつーのはどうかねー
正直,無いと思うんだけど.pentiumIIIくらいだったらともかく・・
ちなみに描画だけしたら2%程.これはfps調整でループ回してる為
※4 話によるとD3DはFloat精度で最適化されてるようだ

(2011/01/08)

公開へ向けた修正等

今までDebugビルドしかしてなかったので主にReleaseビルドに伴う不具合が無いかの確認.
例えばある時点で想定されたデータ構造になっているかをデバッグ目的でチェックするAssert構文は
Releaseビルド時にはコンパイルされないように条件判定文ごと無かった事にされる.
しかし,もしミスでAssert構文中に進行に必要な関数を呼んでその返り値をチェックしていたりすると不具合の元になる.
他にも最適化によって数値の接合性が取れなくなる場合も無きにしも非ずである.
(バグの箇所がDebugではたまたま上手く動いていたがReleaseでそれが露呈したりだとか)

Lua周りも少々.
CからLuaスタックの数値を取得しようとしてlua_tointeger()を使う際に
数値が浮動小数であった場合の挙動を「常に小数点以下は切り捨てられる物である」と勘違いしていた.
またそうなって欲しいので一度浮動小数で取得しC側で変換するように変更.
(Luaのソースを覗いたら現在のFPUの丸めモードで整数変換する実装だった.高速化の為?)

もうひとつ.デフォルトの実装ではLuaの数値はすべて浮動小数であるが
2DのキャラクターやHUDを表示したい場合は座標を整数で指定しないとあらぬ色補間がかかってぼやけてしまう.
もちろんこれはその都度math.floorを呼べば回避できる.しかしだ.
必要もないのに無駄な処理を入れたくないし,常に「今変数に入っているのが整数なのかどうか」
を意識するのは面倒極まりないわけである.
結局,整数の疑似クラスを作ってしまった・・・
まあでもこれでビット演算も組み込めたし良しとしようか.

ちなみに面倒くさくて浮動小数と書いたが正確には浮動小数点数だから注意ですな.
#ああ
,実数と呼べばいいのか!

(2011/01/01)

今年の方針

今までの進捗状況ログを見返すと作業が進まなかった時の言い訳してる風に捉えられたので
進捗の名の通り進んだ事だけを記す.
また基本的にゲーム製作以外の個人的な事情,感情等は挟まないものとする.
進捗報告は文章だけだと味気ないしなるべくわかりやすく他人に説明するとともに
自分でも何所まで出来たのか確認する意味で必要なら図やスクリーンショットを載せる.

あとこれは前項と重なるが理解を深める目的で適時講座のようなページを作る.
キャラクターの移動アルゴリズムや,「ここの判定どうやってるの?」など
質問があれば出来るだけ答えていきたい.

以上
「01)」をウィキ内検索
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.