仕様書の作成方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

仕様書の作成方法について

#1

投稿記事 by dic » 14年前

シューティングゲームを作成してて、ひととおり完成しました
そこで、次はもうすこし内容のあるシューティングにしようと思ってます
しかし、ボリュームが大きくなるとソースコードやフローの管理が大変になりそうなので
仕様書もしくは設計書などを作ってからプログラミングしたいと考えています

そこで、仕様書はどのようにして作成するのが一般的なのでしょう?
色々調べてみましたけど業種によってさまざまという回答が多く
ゲームについての仕様書は見つかりませんでした(公開してない?)

DB関連の仕様書が多いように見れましたが、頭の回転の良い方はこれを応用できているのでしょう
私の頭の回転ではとても応用できていないです
そこで、何かシューティング向けの仕様書のテンプレートなどないでしょうか?
結構無理難題を言っているかもしれないですけど、参考になるものがあったら教えてもらえると助かります

==========================================
自分的に思っているのですが、基本はできていると思うので
あとは私の気持ち状態次第かなぁ・・・とも思ってます
(細かいバグなどが入ると怖い)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 仕様書の作成方法について

#2

投稿記事 by softya(ソフト屋) » 14年前

オブジェクト指向設計されてはどうでしょう?

ゲームつくろー! 「オブジェクト指向設計編」
http://marupeke296.com/OOD_main.html

「ゲーム作者の集い[ゲームヘル2000] - kenmo」
http://www5.atwiki.jp/yaruhara/pages/39.html

「UMLによるゲーム・プログラミング」
http://eis.yokkaichi-u.ac.jp/WBT/game/gameOOdesign.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 仕様書の作成方法について

#3

投稿記事 by dic » 14年前

>>softyaさん
リンク先読ませてもらいました
オブジェクト指向は私も習得しようとしているのですが
なかなか、設計はした、ではどのようなコードがいいのか?というさらにつっこんだ内容の記事がなく
ただ、UMLのクラス図だけで終わりという記事ばかりで、実用ではないように私は感じています


意見をもらってなんなんですが、オリジナルのマイタスクシステムを作ることにしました
シンプル設計でいこうかと思いまして
構造化設計とほとんど変わらないかもしれないですけど、ゲームを作成するのが目的ですので
気にせずに進めたいと思います


そこで、DxLibを使って組んでいるところなのです
トピックを新しく作るか迷いましたが、ここを再利用します

ここの龍神録のFPS制御の方法をそのままコピーして利用させてもらってますが
どうしても60FPSがでません
各処理にかかる時間を計測しても、0.00000となっており何が原因かつかめない状態です
私のオリジナルDirectXライブラリで、同じFPS制御をしてみると60FPSでるのですが
DxLibとここのFPS制御を組み合わせると43FPSくらいで止まります
下にそのソースコードの一部と結果を載せますので、どこが問題なのかわかるかたいませんでしょうか?

コード:


	static	int	TIME[10];
	//	メインループ
	while(1)
	{
		if( -1 == ProcessMessage() )
			break;

		char	key[256];
		GetHitKeyStateAll( key );
		if( key[KEY_INPUT_ESCAPE] == 1 )
			break;

		fps_wait();
		DWORD	start, end;

		switch( gMode )
		{
		case def_mode_title:
			start = timeGetTime();
			gTitle.Draw();
			end = timeGetTime();
			TIME[0] += end - start;
			TIME[1]++;

			start = timeGetTime();
			gTitle.Move( &gMode );
			end = timeGetTime();
			TIME[2] += end - start;
			TIME[3]++;
			break;
		default:
			break;
		}

		start = timeGetTime();
		int	i;
		for( i=0; i<DEF_TASK_NUM+1; i++ )
		{
			gTask[i].Draw();
			gTask[i].Move();
			gTask[i].System();
			gTask[i].Etc();
		}

		draw_fps( 0, 20 );
		end = timeGetTime();
		TIME[4] += end - start;
		TIME[5]++;


		start = timeGetTime();
		ScreenFlip();
		end = timeGetTime();
		TIME[6] += end - start;
		TIME[7]++;
	}


	//	TIME.txtに出力
	FILE	*f = fopen( "TIME.txt", "wt" );
	char	mes[80];
	sprintf( mes, "かかった時間、1フレームの時間:TIME[0]:%d  %f\n", TIME[0], TIME[0]/TIME[1] );
	fputs( mes, f );
	sprintf( mes, "呼び出し回数:TIME[1]:%d\n", TIME[1] );
	fputs( mes, f );
	sprintf( mes, "かかった時間、1フレームの時間:TIME[2]:%d  %f\n", TIME[2], TIME[2]/TIME[3] );
	fputs( mes, f );
	sprintf( mes, "呼び出し回数:TIME[3]:%d\n", TIME[3] );
	fputs( mes, f );
	sprintf( mes, "かかった時間、1フレームの時間:TIME[4]:%d  %f\n", TIME[4], TIME[4]/TIME[5] );
	fputs( mes, f );
	sprintf( mes, "呼び出し回数:TIME[5]:%d\n", TIME[5] );
	fputs( mes, f );
	sprintf( mes, "かかった時間、1フレームの時間:TIME[6]:%d  %f\n", TIME[6], TIME[6]/TIME[7] );
	fputs( mes, f );
	sprintf( mes, "呼び出し回数:TIME[7]:%d\n", TIME[7] );
	fputs( mes, f );
	fclose( f );

TIME.txtの中身
かかった時間、1フレームの時間:TIME[0]:44 0.000000
呼び出し回数:TIME[1]:696
かかった時間、1フレームの時間:TIME[2]:20 0.000000
呼び出し回数:TIME[3]:696
かかった時間、1フレームの時間:TIME[4]:657 0.000000
呼び出し回数:TIME[5]:697
かかった時間、1フレームの時間:TIME[6]:10853 0.000000
呼び出し回数:TIME[7]:697

//=======================
TIME.txtに出力の際の TIME[x] の部分のミスを修正しました

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 仕様書の作成方法について

#4

投稿記事 by dic » 14年前

コード:

	sprintf( mes, "かかった時間、1フレームの時間:TIME[0]:%d  %f\n", TIME[0], (double)TIME[0]/TIME[1] );
(double)キャストいれたところ
ScreenFlip がそうとう処理がかかっていました
これがないときれいな描画ができない・・・
私のディスプレイは結構大きいので負荷が特別に大きいかもしれないですね
30FPSにあわせます

自己解決しました

(でも私の自作DirectXライブラリは60FPSでるんだよなぁ・・・)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 仕様書の作成方法について

#5

投稿記事 by softya(ソフト屋) » 14年前

解決されたようですが、事前に全体構造を考えて大きなクラス構造・インターフェイス・ステート・シーケンスの設計ぐらいはしたほうが良いと思います。

>しかし、ボリュームが大きくなるとソースコードやフローの管理が大変になりそうなのせ
>仕様書もしくは設計書などを作ってからプログラミングしたいと考えています

経験のあるSTGなら何とか成るかも知れませんが、未知のものを作る時は困ると私は思います。

>なかなか、設計はした、ではどのようなコードがいいのか?というさらにつっこんだ内容の記事がなく
>ただ、UMLのクラス図だけで終わりという記事ばかりで、実用ではないように私は感じています

それは設計や仕様書ではなく実装ですよね。

最初に紹介したこちらとか、実装まで書かれていますが何がものたらないのでしょうか?
分からない部分をdicさんなりに説明して頂けないとこちらとしても説明できないのです。
「UMLによるゲーム・プログラミング」
http://eis.yokkaichi-u.ac.jp/WBT/game/gameOOdesign.html

>私のディスプレイは結構大きいので負荷が特別に大きいかもしれないですね
>30FPSにあわせます
あと使い方の間違いが無いのなら30FPSしか出ないのはDXライブラリの相性・バグの問題だと思いますので、DXライブラリ本家の掲示板でお問い合わせ下さい。
DXライブラリのバージョンを変えると直る場合もあります。

下記のプログラムで60FPSでるか確認してみてください。
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/52.html
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 仕様書の作成方法について

#6

投稿記事 by ISLe » 14年前

ScreenFlipはテアリングを防ぐために垂直帰線期間を待つので、時間がかかるのは仕方がないというか当たり前だと思います。
fps_waitという関数がFPS制御をしている関数だと思うのですが、FPS制御は1フレームの時間が一定になるように待ち時間を入れる処理なので、スクリーンフリップの直後に呼び出すと1フレーム分まるまる待ち時間として計上してしまうと思います。
そこに実際に処理した分が加算されるのでFPSが低下しているのではないでしょうか。

fps_waitをScreenFlipの直前で呼ぶようにすれば期待どおりに動く気がします。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 仕様書の作成方法について

#7

投稿記事 by dic » 14年前

>>softyaさん
「C言語~ゲームプログラミングの館~」
http://dixq.net/g/52.html
ここのコードでは63.5~58FPSでました

SetDrawScreen() 関数というのがあったんですね 気づきませんでした
しかもデフォルトの描画先が画面表だったなんて・・・
ということは、画面表に描画していたので、ScreenFilpはまったくの無用ってことですね(作者の推薦は)
SetDrawScreen( DX_SCREEN_BACK )に変更、追加しました


>>ISLeさん
垂直同期ですね
リフレッシュレートがからんでいるのか、垂直同期をまたない
SetWaitVSyncFlag( false );
に変更したら60FPSでるようになりました
2つFPS制御してたことになりますね
これもデフォルトが垂直同期を待つ設定のようでした


おふたかたの助言で30FPSのコードをくまなくてよくなりました^^

コード:

	//	垂直同期を待たない(こちらで制御する)
	SetWaitVSyncFlag( false );

	//	描画先は画面裏
	SetDrawScreen( DX_SCREEN_BACK );

	// ウインドウモードに変更
	ChangeWindowMode( TRUE ) ;
を最初の方に追加で対応できました

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 仕様書の作成方法について

#8

投稿記事 by ISLe » 14年前

テアリング対策で垂直帰線期間に画面を切り替えるので、垂直帰線期間を待たないとテアリングが発生しますよ。
背景スクロールなんかするとはっきり水平にぶった切られたように映ります。
アーケードゲームの移植ではテアリングを我慢してでもオリジナルの速度を重視する場合がありますけど。

Vistaや7ではデスクトップマネージャーレベルで対策されているのでウインドウモードではテアリングが発生しないそうです(聞きかじり)けど。
そのかわりモニタのリフレッシュレート以上の速度で画面を描き変えても映らないとか。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 仕様書の作成方法について

#9

投稿記事 by dic » 14年前

>>ISLeさん
画面のちらつきは起きるということが前提でDirectXが作られているので(たぶん)
私の場合はダブルバッファリングで対応しています
モニタの性能の違いがあるので100%カバーできるとは思ってません
90%を目標にし、91%、92%とつきつめていくとどんどんキツくなりプログラムどころではなく
それは私の時間の都合もあるので不可能とわりきっています

Vista や 7 はまだ手元にないですがハードウェアの性能も向上していくと思っているのでほどほどにしていますし
私が配った知り合いの範囲内においては、そのようなことを言ってくる方はいませんので、大丈夫と思ってます

しかし、何か画面のちらつきについて言ってくる方がいましたら、考えようと思います
(それくらい私の影響力はないと思ってます)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 仕様書の作成方法について

#10

投稿記事 by softya(ソフト屋) » 14年前

>画面のちらつきは起きるということが前提でDirectXが作られているので(たぶん)
>私の場合はダブルバッファリングで対応しています

ティアリングは理解されていますよね?
「ティアリング」
http://d4.princess.ne.jp/multimedia/ntsc/tearing.html

ダブルバッファにして同期を待つことでティアリングもチラツキも無くすことは出来ますよ。
それが出来ているDXライブラリもDirectXですからなにか勘違いされているのでは無いでしょうか?
DXライブラリはDirectDrawなので同期に次のものを使っていると思います。
「IDirectDraw::WaitForVerticalBlank」
http://msdn.microsoft.com/ja-jp/library/cc355951.aspx

あと3Dだと「D_D3DPRESENT_INTERVAL_ONE」
http://msdn.microsoft.com/ja-jp/library ... s.85).aspx
が使えるはずですが私は使ったこと無いので動作確認をお願いします。
CPU負荷が上がると言う話も聞くのですが、DirectXのバージョンで違うかも知れません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 14年前
連絡を取る:

Re: 仕様書の作成方法について

#11

投稿記事 by ISLe » 14年前

今回はじめてSetWaitVSyncFlag(FALSE)で垂直帰線期間を待たないようにされたのではないのですか?
ダブルバッファリングは描画途中を隠してチラツキを抑えますが、テアリングを解消することはできません。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 仕様書の作成方法について

#12

投稿記事 by dic » 14年前

>>softyaさん
混合された状態で表画面に出てくるのがティアリングですね
ちょっと誤解してました

>>ISLeさん
ティアリングを回避できないということで
ではどういった方法で回避できるのでしょうか?
といった話になりますが

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 仕様書の作成方法について

#13

投稿記事 by softya(ソフト屋) » 14年前

dic さんが書きました:>>softyaさん
混合された状態で表画面に出てくるのがティアリングですね
ちょっと誤解してました

>>ISLeさん
ティアリングを回避できないということで
ではどういった方法で回避できるのでしょうか?
といった話になりますが
同じ話の繰り返しになりますが、表裏画面の切り替えで垂直帰線期間を待てばティアリングは発生しません。
なので、SetWaitVSyncFlag(FALSE)とすれば発生します。

「s6. FPSを表示する。」
http://dixq.net/g/52.html
に書かれている仕組みにすれば同期して表裏画面の切り替えが出来ます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

dic
記事: 658
登録日時: 14年前
住所: 宮崎県
連絡を取る:

Re: 仕様書の作成方法について

#14

投稿記事 by dic » 14年前

>>softyaさん
「s6. FPSを表示する。」
http://dixq.net/g/52.html
に書かれている仕組みにすれば同期して表裏画面の切り替えが出来ます。
を参考にして、テストしたところ、上にもあるように62~58FPSくらいの不安定なFPS制御になってしまうので

「43.きっちりFPSを制御してみよう」
http://dixq.net/rp/43.html
のコードを再利用して使ってます
私のパソコンのスペック不足か、ここのコードを再利用すると40FPSまでしかでないのです
この場合、すべてDxLibのデフォルト設定なので、表画面に描画し、垂直同期もDxLibまかせです
この状態だと私のパソコンでは40FPSしかでません
なので、なんとか60FPSだそうと思い、いろいろいじってたところです
「s6.FPSを表示する」のコードではきっちり60FPSにならないので「43.きっちりFPSを制御してみよう」のコードで
60FPSを保つように、上にあるように、裏画面に設定したり、垂直同期を「43.きっちりFPSを制御してみよう」の
コードだけにまかせるという方法をとったところ、うまくいったというところです
また、デフォルトが表画面に描画するので画面のチラツキもあり、これはマズいと思っていたところです

テアリングに関しては softyaさんとISLeさんの意見が異なるので、保留にしておきたいと思います

閉鎖

“C言語何でも質問掲示板” へ戻る