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

FPSを作ってみる@wiki

06)

最終更新:2012年06月27日 23:56

slice

- view
管理者のみ編集可

(2012/06/27)

いやいや。

........



いやいやいやいやいや。
前回から2週間の間に色々やってた気がするけど忘れてしまった。
そうならない為に書き留めるんじゃなかったっけな。全く。
何処から話を始めたもんかねぇ・・

基礎固めその6: ファイル読み込みの抽象化

エンジンとか名乗る割にAPIを直接叩いてファイルを読み込むのは格好悪いので
予め「読み込み専用パス」「書き込み専用パス」をファイルマネージャにセットしておき
例えば読み込みパスを "C:/", "./resource" としてファイル名 "background.bmp" としたなら
まずC:/background.bmpが無いか探しに行きあったらそれを読み、無ければ./resource/background.bmpを探す
どちらにも見つからなければ読み込み失敗の旨を通知といった具合。
ただまあWINAPIのファイルハンドルをそのまんま渡すのもやはりシャクなんでそこもクラスでカプセル化。

読み書きするのはHDD上のファイルだけとも限らず、ファイルパスの最初を@にすればメモリ上のファイルを表すとか
あとハフマン符号による圧縮ファイル(複数ファイルを纏めた物)にも読み込みだけ対応してたり。
ハフマンに関しちゃちょっとテストが不十分だが・・まぁリリース時に悩めばよし。

というわけで行く行くはリリース時のリソースはパックしたファイルに入れたままでMODなんか作る時は
書き換えたファイルだけ別途フォルダに入れてあげればそちらを優先して読むなんて事も可。
パックファイルの拡張子末尾を連番にすれば古い方から新しい方へ上書きして読むのでパッチもファイル1つで楽々だ。
っていうかそれがしたかっただけとも・・

なんなら重複するファイルは省いて新たに1つパックファイルを生成する事だって・・・やってたような、頓挫したような。なんせ前に書いたソースだし。

基礎固めその7: Luaの組み込み

賢明な人はtoLuaとか使ったほうがいいかもね。
自分は馬鹿だから自分で書いた。とはいえ半分以上は前のソースをコピペ。
リソースハンドルの受け渡しやLuaの変数をC++上で楽に扱えるようにカプセル化など。関数呼び出しの変数渡し部分はテンプレートの嵐。
(引数の個数分だけパターン書かなきゃいけない)

C++11の可変引数テンプレートあればもっとスマートに書けそうなんだがねぇ。
でもVisualC++に実装されるのは2012だろうし、その為だけにwin7とか買う予定ないし。
もうひとつ言えばgccは普通に対応してるからそっちで欲を満たしている。

基礎固めその8: リソースマネージャ各種 (テクスチャ、エフェクト(シェーダ)、ゲームOBJ)

テクスチャとエフェクトは基本的に前のソースから移植しただけなんでなんとも。
アサートとエラー処理を若干強化したくらいかな?

ゲームOBJというのはゲーム中に登場するオブジェクトのベースである。ってだけじゃ訳がわからんと思うので少し説明すると
他のOBJへメッセージ(命令や変数)の受け渡しやシーンへの登録、
あるOBJの状態が変化した時に通知を受け取ったり
C++のクラスに引数として渡せば条件が揃った時にC++からLuaのOBJへメッセージを送ったりもできるし
OBJの破壊時に関連OBJ(描画用のOBJや当たり判定用のOBJなど)を自動的に破棄したりなど
色々やってくれるクラス。
内部にステート(状態)を持ち、ステートXの時にAというメッセージを受けたら何も起こらないがBだと破壊され
ステートYの時にはその逆。なんて事も。



今取り組んでるのは
前までのソースはシーンや当たり判定、描画の管理やアップデート処理の仕組みがゴタゴタだったのでその辺の整理。

毎フレームのアップデート処理は伝統的なタスクシステムを使えば軽そうだが優先度でソートするしかできない。
シンプルなゲームならそれでいいんだろうけど
例えばFPSなんかでプレイヤーの居る部屋とそこから見える部屋に居る敵はちゃんと処理を行うが
壁の向こうで見えない敵は手抜きをする、なんて事はマップの構造を考慮しないとちょっと難しいかなと。
描画も然り。


これはプログラムとあまり関係ないのだが
バージョン管理システムをSVNからGitにほぼ移行した。
別にSVNに不満という訳ではないがGitHubの件でちょっと勉強してみたら結構いいじゃないという感じで。

(2012/06/14)

物凄い手抜き.
いくつか実装したけど記事書くのを面倒くさがって空いてしまった.

基礎固めその3: 名前付きリソースマネージャ

どんな物かは前回説明してしまったんで,特に・・・

基礎固めその4: 複数変数を返す構造体

普通の人は無難にboost::tuple使う場面なのだが.
中どうなってんだろう?小間物くらい自分でも書けないか??と思ったのが運の尽き.
右辺値参照で返した時に内部に値を格納しておいて関数が終了した後もクラスが生存しているように等,
自分なりに使いやすくしてみたとか.
ま,言い訳にしかならんか.

基礎固めその5: JSON読み書き

これも普通の人はライブラリなど使うとは思うが,前に作った物があったんで流用.
メモリ確保の所を先日作ったTLSFアロケータに変えてエラー処理はちゃんと例外を投げるなど手直し.

次はスクリプトの組み込みかねぇ・・

(2012/06/09)

基礎固めその2: ハンドルベースのリソースマネージャ(シングルスレッド版)

予定通りリソースマネージャをサクッと実装。
前のソースを見ながらやろうかとも思ったがあちらは中途半端にマルチスレッドを意識しており処理効率が微妙だったので
スレッド同期機構などバッサリ切り落としつつ、書きなおした。リソースマネージャ書いたの3回目くらいか。

結局の所リソースを複数スレッド間でどうこうなんて個人プロジェクトではまずやらないだろう。
そんなに重い処理をさせる前に最適化を考えようぜと。
ついでに言えばLuaの仮想実行マシンもマルチスレッドには対応してないし。
大きいファイルの読み込み中にnow loading画面など別の処理をさせたかったらファイル読み込み用に1つ専用スレッドを作ればいい話なのだ。

ハンドルベースのリソースマネージャとは簡単に説明すると
リソースに一意のハンドル値を割り振り、ユーザーはそれをマネージャに渡してアクセス・管理する方式である。
アクセスにワンクッション入るので微量のオーバーヘッドは生ずるが生のポインタでない分、
リソースが使われていない間ならマネージャが好きにメモリ位置を変更可能(デフラグとか)だし
内部に参照カウンタを持っているのでC++特有の「誰がメモリを破棄するのか」問題に対処できる。
加えてデバッグ用にハンドル値へマジックナンバーを組み込むなどすれば「一度解放されたはずのリソースに再度アクセスした」場合
アサートを発して早期にバグを発見できる利点も。

次は名前付きリソースマネージャ。これはモデルやサウンドファイルを複数オブジェクト間で共有する時に便利で
例えば名前としてファイルパスをセットすれば初回は普通にファイルから読み込み
次回以降同じファイルパスが指定された際は前回読み込んだ結果を渡す。
勿論参照カウンタ付きなので誰も使ってなければ自動で破棄される。


(2012/06/08)

基礎固めその1: メモリアロケータ

ゲームの基礎はリソース管理。リソース管理の基礎はメモリ割り当てから。
という事でメモリアロケータを実装していた。
既にあるnewで十分だって?いやいや。
ひょっとしたら数msかかるかも知れない物をゲーム実行中気軽に呼べない。

とはいえ勿論自分でアルゴリズムを1から考えるのは手間すぎるので既存のを使用。
今回実装したのはTLSF (two level segregated fit)アロケータといって詳細はググるなりして欲しいのだが
要は最初から要求されたサイズぎちぎち1バイトも無駄にするなとやるんではなく
ある程度大雑把なサイズ区分でもって割り当てる。
この「大雑把な」というのが2のべき乗だったりして
という事はビットテーブルやビット演算を使ってフリーブロックやブロック分割を高速に出来るねという話。

考えてみりゃメモリの確保と開放に制限を設けなければどうやったって断片化する訳なので最初からそこは諦め
せめて一定以上は断片化しないようにする方向性に持ってくのは極自然ではある。

で、このアロケータ。
空きブロックをループ探索しないので確保がほぼ定数時間で終わり
解放も空き隣接ブロックを結合するか否か位なので処理時間にそれ程バラつきはないと予想される。
正にゲーム向きである。
次はこれを組み込んだリソースハンドルマネージャに取り掛かろうと思う。

これで終わりなのだが、ふと思いついた自前アロケータを用意する利点。
最初に大きなメモリの塊を渡し以後はそれをやりくりする性格上
ポインタの範囲を見れば自前アロケータで確保した物か、そうでないかが一発でわかる。まぁどうでもいいか・・

#追記
真面目に考えれば「メモリ割り当てコストが予測可能」なとこかな < 利点

(2012/06/07)

次の手

なんだかんだ言ってQtフレームワーク弄り(その練習としてツイッタークライアント作成)は既に日課である.
あれからQt Linguistというのを使って英語・日本語両対応にしてみたり,
RTやFavの表示を背景の色変えじゃ安っぽいからとアイコン表示にしたりした.
配信中に外人さんから「オープンソースしないの?」と言われ,つい「It will be.」とか答えてしまったんで
一通り動く段階まで来たらGithubで公開すると思う.
基礎から全部自前のゲームと違ってフレームワークの上で組んでるから割と進行がリニア.
完璧主義なきらいがある自分だけどこれは今月中に公開まで行けそうかと踏んでいる.

前にも書いたけどそもそも何でQtフレームワークやってんのかと言えば「ゲームのエディタ周りを固めたい」為.
WIN32APIを直でとか効率悪くてやってられんし(WPFには興味ないし)
ついでにクロスプラットフォームなら色々な場所で動かせて嬉しいよね.


で.メインである(筈の)ゲーム.
先週でモデリングは一段落した訳だが相変わらずというか,次の一歩を決めかねている.
現在ぼんやりと浮かんでる事を列挙すると・・・

  • 無機物だけでなく生物系もモデリングしてみたい
  • 物理エンジンを導入
  • ゲームの基礎を書き直し
  • 作りかけのハイトフィールドを仕上げる
  • javascript/PHP/SQLを使ったアンケートフォームの作りかけにケリをつける

こんなとこだろうか.
物理エンジンは過去に2回ほど自前でやろうとして玉砕しているのでリベンジしたい所だがまた軽く1ヶ月は吹っ飛ぶから当分はパス.
そろそろ動くゲーム出さんとマズい.外面的にも,モチベーション的にも.

「作りかけのハイトフィールド」を気合入れて仕上げた後に
「ゲームの基礎を書き直し」が一番堅いかな・・
ちなみに自前のゲームエンジンを作るのはもう止めにする.理由は後ほど.

(2012/06/02)

モデリング

先週はモデリング強化週間と称してひたすらモデリングソフトを触る企画をしていたが
出来た物はトップの画像くらいっていうのがアレ。
(本当はもう1つくらい出せる予定だった)
他にはモデリングの際の手際が少しだけ良くなった程度か。まぁ一週間だしね。
あとちょっとだけモデリングをしたらプログラムに戻る。

結構前からだがatwikiが公式にtwitterパーツをサポートするようになってたんで
メニューバーに貼りつけてみた。
けどカスタマイズがCSSの範囲でしか出来なくて
今の状態だと本来のメニューより自己主張が強くてあまり好きじゃない。ページ移動する度に再読み込みというのも微妙だ。
そのうち移動させようか・・

ちなみに現在のTwilveQt。
発言もできるしRTやFavも動作する。緑で表示されているのは他人の公式ReTweet
OAuthも勿論対応。


「06)」をウィキ内検索
LINE
シェア
Tweet
添付ファイル
  • twq1.jpg
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.