FPSを作ってみる@wiki
02)
最終更新:
slice
-
view
(2009/02/02)
今日はなんだか全然眠れないので、布団でゴロゴロしてるよりは進捗状況を書いておこうかと。
なんだかんだやってるうちに2月になってしまいました
今月の目標は何と言っても動画アップでしょうね。
どっちの動画かって言うと、どっちもです。頑張ります。
なんだかんだやってるうちに2月になってしまいました
今月の目標は何と言っても動画アップでしょうね。
どっちの動画かって言うと、どっちもです。頑張ります。
ちょっと前に書いた記事と重複する部分がありますがこれからやる事整理の為。
リソースをブロック単位で読み込むルーチンを実装し終わったのでこれからテストします
問題なく動くようなら次はゲームの本スレッドとは別のスレッドで読み込み処理を行うようにして
非同期ローディングを実装。
それが終わったらogg vorbis形式の音楽をストリーミング再生するクラスを作る。
(そう、現状ではwav形式でしかも一括読み込みしか対応してないので実質的に音楽鳴らせません)
上記のプログラミングと併行してモデリングもしようかと思っております。
リソースをブロック単位で読み込むルーチンを実装し終わったのでこれからテストします
問題なく動くようなら次はゲームの本スレッドとは別のスレッドで読み込み処理を行うようにして
非同期ローディングを実装。
それが終わったらogg vorbis形式の音楽をストリーミング再生するクラスを作る。
(そう、現状ではwav形式でしかも一括読み込みしか対応してないので実質的に音楽鳴らせません)
上記のプログラミングと併行してモデリングもしようかと思っております。
ここから少し無駄話なんですが、併行という言葉が出てきたのでトリビアを書きます。
「へいこう」には「並行」と「併行」という漢字表記が存在しますが
「並行」は複数の動作を同時に実行することを意味します。複数CPUによる並列演算とか。
対して「併行」はある時間を見ると一つの事しかやっていないけど一定の時間で区切って
複数の動作をする意味。
OSで1つのCPUが複数のスレッドを極短いタイムスライスでちょっとずつ処理する感じです。
自分が論文書くときに注意されました。
「へいこう」には「並行」と「併行」という漢字表記が存在しますが
「並行」は複数の動作を同時に実行することを意味します。複数CPUによる並列演算とか。
対して「併行」はある時間を見ると一つの事しかやっていないけど一定の時間で区切って
複数の動作をする意味。
OSで1つのCPUが複数のスレッドを極短いタイムスライスでちょっとずつ処理する感じです。
自分が論文書くときに注意されました。
(2009/02/03)
ファイルの非同期ローディング完了。
プリエンプティブなスレッド使ったので(今は複雑な事してないから大丈夫そうだが)
将来的にはデッドロックが心配。一応ならないようには組んだつもり。まあいいか。
簡易的なロードの進行状況も取得できるようにした。
(読み込み済みファイル数 / 読み込むファイル数)という形式で、ファイル単位だが。
プリエンプティブなスレッド使ったので(今は複雑な事してないから大丈夫そうだが)
将来的にはデッドロックが心配。一応ならないようには組んだつもり。まあいいか。
簡易的なロードの進行状況も取得できるようにした。
(読み込み済みファイル数 / 読み込むファイル数)という形式で、ファイル単位だが。
(2009/02/04)
音楽のストリーミング再生のベタ実装と確認終了。
バッファの書き換えを毎フレーム更新チェックするポーリング方式にするか
DirectSoundにイベント設定して必要なときだけ呼んでもらうコールバック方式か微妙に迷った。
ポーリングやってみたけど今時のCPU負荷的には全く問題なし。自分の環境で1%行くかいかないかって所。
(というかPentiumIII以上だったら余裕そうだが)
でもやっぱなるべく無駄な処理は抑えたいからコールバック方式だよなと思ってそっちにした。
これからクラス化・・・っていうのかわからんけど
ファイル名指定したら再生準備してくれて後は関数一個呼んで再生するだけ~みたいな状態にする。
ついでにクロスフェードとか付けてみようか。
バッファの書き換えを毎フレーム更新チェックするポーリング方式にするか
DirectSoundにイベント設定して必要なときだけ呼んでもらうコールバック方式か微妙に迷った。
ポーリングやってみたけど今時のCPU負荷的には全く問題なし。自分の環境で1%行くかいかないかって所。
(というかPentiumIII以上だったら余裕そうだが)
でもやっぱなるべく無駄な処理は抑えたいからコールバック方式だよなと思ってそっちにした。
これからクラス化・・・っていうのかわからんけど
ファイル名指定したら再生準備してくれて後は関数一個呼んで再生するだけ~みたいな状態にする。
ついでにクロスフェードとか付けてみようか。
ふと思ったが、音楽って1つのファイルを複数再生するんだろうか?
効果音だと1つのサウンドデータを複数で使いまわすなんてしょっちゅうだけど。
。。いらんよな今の所。違う音楽を再生ならクロスフェードする時にするけど。
効果音だと1つのサウンドデータを複数で使いまわすなんてしょっちゅうだけど。
。。いらんよな今の所。違う音楽を再生ならクロスフェードする時にするけど。
DirectSoundのストリーミングバッファで再生ポインタイベント通知の方法について
ざっとネットで調べてたら皆さんスレッド作成に_beginthread()って関数使ってるんですね。
_beginthread()は標準ライブラリ的でCreateThread()はWin32API的なのかな?
自分はCreateThread()しか使ったこと無かったから知らなかった・・
まあ他機種への移植性を考えたら前者だろうな。でも今回はWindowsオンリーなんでどっちでもいいと。
ざっとネットで調べてたら皆さんスレッド作成に_beginthread()って関数使ってるんですね。
_beginthread()は標準ライブラリ的でCreateThread()はWin32API的なのかな?
自分はCreateThread()しか使ったこと無かったから知らなかった・・
まあ他機種への移植性を考えたら前者だろうな。でも今回はWindowsオンリーなんでどっちでもいいと。
(2009/02/05)
音楽のクラス化完了。ボリュームとパン機能を付けた。フェードはそのうちってことで。
次は何だ?モデル作成を今月に入ってから全然やってなかったから続き作るか。
あと、このwiki作ってから一度もバックアップ取ってなかったから取っておいた。
簡単操作でできましたとさ。
次は何だ?モデル作成を今月に入ってから全然やってなかったから続き作るか。
あと、このwiki作ってから一度もバックアップ取ってなかったから取っておいた。
簡単操作でできましたとさ。
そういえば計算したライトマップの保存と読み込みを実装するべきだな。
ゲームの途中セーブ&ロードに必須。
クイックセーブにするかチェックポイント制みたいにするかは未定。
何回でもセーブ出来るとゲームの仕様上、緊張感(面白さ)が半減しそうなので
一回のプレイで30分~1時間程度を目安に考えてるけど。
ノーマルモードでは数回だけセーブでハードモードだと出来ないようにするかな。
フリーズバグが発生したら軽く死ねるけど・。
いやまてよ、セーブ自体は何回でもできるけどロードが3回までとかどうだろうか。
セーブを戦略的にしておき、いざとなったら計画的にロード。
ロードすると持ち物やステータスはセーブした時点に戻ってしまうがこれからどんなイベントが起きるか、
先がどんなマップになってるかは変わらないので状況次第では事を有利に運べるとか。
不意の事故で死んでしまったときにもロードが出来るが、自発的にロードするのと違い何かペナルティが加わる等。
ランダムマップ故のシステムだと思ったが、どうか。
欠点は暫くセーブを忘れていた時に死んだらやる気なくなる事。
これについてはエリアを移動した時に自動でセーブされるとかで対処かな?
ゲームの途中セーブ&ロードに必須。
クイックセーブにするかチェックポイント制みたいにするかは未定。
何回でもセーブ出来るとゲームの仕様上、緊張感(面白さ)が半減しそうなので
一回のプレイで30分~1時間程度を目安に考えてるけど。
ノーマルモードでは数回だけセーブでハードモードだと出来ないようにするかな。
フリーズバグが発生したら軽く死ねるけど・。
いやまてよ、セーブ自体は何回でもできるけどロードが3回までとかどうだろうか。
セーブを戦略的にしておき、いざとなったら計画的にロード。
ロードすると持ち物やステータスはセーブした時点に戻ってしまうがこれからどんなイベントが起きるか、
先がどんなマップになってるかは変わらないので状況次第では事を有利に運べるとか。
不意の事故で死んでしまったときにもロードが出来るが、自発的にロードするのと違い何かペナルティが加わる等。
ランダムマップ故のシステムだと思ったが、どうか。
欠点は暫くセーブを忘れていた時に死んだらやる気なくなる事。
これについてはエリアを移動した時に自動でセーブされるとかで対処かな?
(2009/02/07)
BSPツリーをファイル出力するルーチンを書いているときにふと思った。
今の実装だとツリー構造は2分木だ。
しかもノード増やすたびにメモリ確保してるから、メモリの断片化が激しいだろうな。
断片化に関しては一旦要素を全部退避して改めてデカいメモリ領域を確保しなおせばいいだろう(言うのは簡単です)
それ以外に気になることがあってそれはツリーバランス。
ある要素にたどり着くまでの根っこからの長いのと短いののバランス。言うまでも無く短い方がアクセスが速い。
アクセス速度がばらついてるって事は=ノード検索処理の負荷が予測しづらい。
ゲームではFPS(Frame per secondの方)が頻繁に上下するより多少処理落ちしててもなるべく安定していた方が良いだろうと。
今の実装だとツリー構造は2分木だ。
しかもノード増やすたびにメモリ確保してるから、メモリの断片化が激しいだろうな。
断片化に関しては一旦要素を全部退避して改めてデカいメモリ領域を確保しなおせばいいだろう(言うのは簡単です)
それ以外に気になることがあってそれはツリーバランス。
ある要素にたどり着くまでの根っこからの長いのと短いののバランス。言うまでも無く短い方がアクセスが速い。
アクセス速度がばらついてるって事は=ノード検索処理の負荷が予測しづらい。
ゲームではFPS(Frame per secondの方)が頻繁に上下するより多少処理落ちしててもなるべく安定していた方が良いだろうと。
そんなわけで、BSP木をなんとかバランス良く出来ないかいろいろ調べもの。
(2009/02/09)
前回、B木がどうとか全っ然関係ない事書いたけどそれは気にしない方向で。
な~んて自分の性質上なるはずもなく「いつか役に立つだろう」と考え
一度乗りかかった船はなんとやらでB木を実装してたりするんですけどね。
データベースにしか使わないんじゃなかろうか><
というかB木の2分木バージョンであるAVL木の方が使えそうだなBSP的には。
絶対そのままじゃ使えないけど。まあいいか。
な~んて自分の性質上なるはずもなく「いつか役に立つだろう」と考え
一度乗りかかった船はなんとやらでB木を実装してたりするんですけどね。
データベースにしか使わないんじゃなかろうか><
というかB木の2分木バージョンであるAVL木の方が使えそうだなBSP的には。
絶対そのままじゃ使えないけど。まあいいか。
今日明日はマップのエクスポート&インポートを頑張る方向で。
モデラからのじゃなくて自作ゲームエンジン側で生成したBSPやPVSやライトマップを
一つのファイルに保存してゲームの途中セーブなんかに役立てようってやつ。
モデラからのじゃなくて自作ゲームエンジン側で生成したBSPやPVSやライトマップを
一つのファイルに保存してゲームの途中セーブなんかに役立てようってやつ。
(2009/02/10)
とりあえず、マップをファイルに出力するのは完了。次は読み込み。
これでテスト実行の度にライトマップ計算で待たされなくて済む予定。
これでテスト実行の度にライトマップ計算で待たされなくて済む予定。
(2009/02/12)
マップのインポートが難航中
そもそもクラスの設計がファイルから読み込むようになってない事に気づいた。
インポートするのに回りくどい処理してる。
だが一旦途中まで実装してしまったので効率が悪くとも最後までやってしまおうと思う。
マップに配置したイベントを出力するの忘れてたし。どうやって出力するかな・・
イベント入出力は3ds maxのエクスポータと処理が大部分被る。すなわち無駄があるので気に食わん。
そもそもクラスの設計がファイルから読み込むようになってない事に気づいた。
インポートするのに回りくどい処理してる。
だが一旦途中まで実装してしまったので効率が悪くとも最後までやってしまおうと思う。
マップに配置したイベントを出力するの忘れてたし。どうやって出力するかな・・
イベント入出力は3ds maxのエクスポータと処理が大部分被る。すなわち無駄があるので気に食わん。
ちょっとだけモデル作り進めたので画像アップしてみた。
基本的にプログラムの合間に気が向いたときしかやってないんで遅い遅い。
基本的にプログラムの合間に気が向いたときしかやってないんで遅い遅い。
#追記
マップ情報を全部入出力するのはクラス設計のままやるのは無駄(どうせ次で書き直すので)だと判断
そこで時間のかかるライトマップとポリゴン分割結果だけをセーブして次回
元マップファイルと一緒に読み込むようにする予定。
そこで時間のかかるライトマップとポリゴン分割結果だけをセーブして次回
元マップファイルと一緒に読み込むようにする予定。
(2009/02/13)
ライトマップの読み込み完了。
ソースがガタガタだ。どうしよう
機能追加は一旦休止してそろそろ次の動画に取り掛かるか・・
ソースがガタガタだ。どうしよう
機能追加は一旦休止してそろそろ次の動画に取り掛かるか・・
(2009/02/15)
射撃場マップでも作ってみるかね
で、自動ドアイベントとランダム的出現イベントの確認
次はだいぶ前に作った得点計算の確認
あの後色々ソースいじってるからそのままだと動かないかもしれないなあ
で、自動ドアイベントとランダム的出現イベントの確認
次はだいぶ前に作った得点計算の確認
あの後色々ソースいじってるからそのままだと動かないかもしれないなあ
(2009/02/17)
これは・・・やばいぞ限界だ。ソースが。
さっさと動画に作ってエンジン書き換えないと。
はやいとこVisualStudio2008にしたいな。あと一ヶ月以内に乗り換えないと買っといて放置で一年になってしまう。
動画にしたいが見えない部分ばっかり作ってるから全然ネタがないぞ。
まぁそれはいいとして。
さっさと動画に作ってエンジン書き換えないと。
はやいとこVisualStudio2008にしたいな。あと一ヶ月以内に乗り換えないと買っといて放置で一年になってしまう。
動画にしたいが見えない部分ばっかり作ってるから全然ネタがないぞ。
まぁそれはいいとして。
1フレームモデルの描画回数が30回以上に増えるとフレームレートが極端に落ちるのだが、原因はなんだろう。
ちょっと試して見た結果、ポリゴン数はあんまり関係ないようだが・・?
デバッグビルドだからなのかね。
だけど現状、中途半端にマクロ切り替えやってるおかげでリリースビルドできません。合掌。
ちょっと試して見た結果、ポリゴン数はあんまり関係ないようだが・・?
デバッグビルドだからなのかね。
だけど現状、中途半端にマクロ切り替えやってるおかげでリリースビルドできません。合掌。
(2009/02/18)
今日は、あんまり頑張って作業してません
敵の向きと移動をスクリプトから制御する部分の細かい修正と
銃のモデリングの続きを少しだけ。
銃の本体は出来たが、マガジンをまだ作っていない事に気づいた。
敵の向きと移動をスクリプトから制御する部分の細かい修正と
銃のモデリングの続きを少しだけ。
銃の本体は出来たが、マガジンをまだ作っていない事に気づいた。
(2009/02/23)
えっと、プログラミングをサボってここ4日くらいある物のモデリングと
テクスチャの作成とそのUV座標合わせ(初体験)をやってたら
なんかプログラミングの腕が鈍りました。その程度でなんだって感じもしなくもないが。
タイプミスが多いの(まあいつも多い方だけど)。
困ったのが一週間前に組んだはずの関数の内部構造ド忘れ。
自分が作ったソースを一ヶ月も触らないと速攻で他人のソースコードの一丁上がりでございますよ。
テクスチャの作成とそのUV座標合わせ(初体験)をやってたら
なんかプログラミングの腕が鈍りました。その程度でなんだって感じもしなくもないが。
タイプミスが多いの(まあいつも多い方だけど)。
困ったのが一週間前に組んだはずの関数の内部構造ド忘れ。
自分が作ったソースを一ヶ月も触らないと速攻で他人のソースコードの一丁上がりでございますよ。
で何でモデリング練習してたか。
いくら絵が描けない自分でも小物くらいは作れないとなっていう気持ちからですね。
プログラム以外何も出来ませんてのもアレじゃないですか。
いくら絵が描けない自分でも小物くらいは作れないとなっていう気持ちからですね。
プログラム以外何も出来ませんてのもアレじゃないですか。
(2009/02/26)
テクスチャを頑張ってみた。結果は別ページにて。
UV展開が素人だな。所々テクスチャが歪んじゃってる。
何のモデルのテクスチャかは次の動画に出てくると思うので、そういうことで。
UV展開が素人だな。所々テクスチャが歪んじゃってる。
何のモデルのテクスチャかは次の動画に出てくると思うので、そういうことで。
プログラムのほうはリソースマネージャをマルチスレッドに対応させてるところ。
今まで1つのスレッドで動作させるようにしか設計してなかったから、
というかゲームを動作させながらバックグラウンドでデータを読み込むとかそのレベルまでいってなかったのだ。
現段階ではゲーム動かしてそのまま裏でファイル読み込もうとすると割と高い確率でクラッシュしてしまう。
今は限定的に対応させて次のソース書き直しの時に本格的に対応させるつもり。
今まで1つのスレッドで動作させるようにしか設計してなかったから、
というかゲームを動作させながらバックグラウンドでデータを読み込むとかそのレベルまでいってなかったのだ。
現段階ではゲーム動かしてそのまま裏でファイル読み込もうとすると割と高い確率でクラッシュしてしまう。
今は限定的に対応させて次のソース書き直しの時に本格的に対応させるつもり。
(2009/02/27)
引き続き、エンジン本体をマルチスレッドに対応させてる途中。
DirectXドライバ生成時にマルチスレッド対応フラグを忘れてクラッシュ。
自作プロファイラ(といってもGameProgrammingGems1のを自分なりに変更しただけ)がマルチスレッド対応してなかったので修正するつもり。
DirectXドライバ生成時にマルチスレッド対応フラグを忘れてクラッシュ。
自作プロファイラ(といってもGameProgrammingGems1のを自分なりに変更しただけ)がマルチスレッド対応してなかったので修正するつもり。