5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

シューティングゲーム製作技術総合 17機目

1 :名前は開発中のものです。:2008/11/27(木) 10:18:19 ID:bBI1A+d5
ゲームプログラマなら誰もが通る、もしくは、通った道。青春の香り?
それは「シューティングゲーム製作」・・・。

このスレでは、そんなシューティングゲームの製作技術や技術の検証、成功談
失敗談笑い話、難易度の設定方法論、多弾の是非などについて語り合いましょう。
もちろんBulletMLなどで弾幕を作成してみたり、自分の作ったシューティングを
晒してみたり、プロジェクトをはじめてみるなどもOK!

ただし、シューティングの未来とか既存のゲームの話題などは、関連する他の
スレでやってくれ。

過去スレ,関連スレは >>2-3で。

952 :名前は開発中のものです。:2009/03/30(月) 16:01:14 ID:kjBKEg9u
//テーブル初期化
:
45[SIN] = 2[SQRT] / 2.0;
:

↑この前こんな感じの見かけたんだけど、今時これはないと思った

953 :名前は開発中のものです。:2009/03/30(月) 17:51:34 ID:Bov4VD4y

szExceptionTitle db "Exception",0

szWindows2000Required db "This application requires NT 5.0 (2000) or later versions of Windows system",0

szErrorSymDefFileNotFound db "The symbolic definition file has not found",0

szErrorSpecSymDefNotFound db "A specific symbolic definition has not found",0

szErrorFileNotReadable db "Could not open or read a specified file",0

szErrorInvalidSize db "The size of symbolic definition file is invalid",0

szErrorBomMismatch db "The byte order mark of symbolic definition file is not the UTF-16 unicode format",0

szErrorOutOfMemory db "Out of memory",0

szErrorMessageFormat db "A fatal exception has occured at procedure ID %08u:",0Dh,0Ah,0Dh,0Ah,"%s.",0


954 :名前は開発中のものです。:2009/03/30(月) 17:52:20 ID:Bov4VD4y
push OFFSET PerformRandomSeedExchangeProc
push 1
push SIZEOF PT_EXCHANGE_RANDOM_SEED
call ExchangeData
test ecx,ecx
mov eax,[lpLargeBuffer]
jl ProcessTerminated
cmp [eax + PT_PUBLIC_CONTROL_WORD.ControlWord],ACT_EXCHANGE_RANDOM_SEED
jne @b
cmp ecx,SIZEOF PT_EXCHANGE_RANDOM_SEED
jne @b
cmp [bHost],0
lea ecx,[edi + CONTEXT.regEax]
jne @f
mov eax,[eax + PT_EXCHANGE_RANDOM_SEED.Seed]
mov [ecx],eax


955 :名前は開発中のものです。:2009/03/30(月) 20:32:01 ID:MsfTb8Bc
もはやCコンパイラを自作したほうが楽なレベル

956 :名前は開発中のものです。:2009/03/31(火) 00:11:44 ID:DQD5khQB
>>952
double sin[360];
double sqrt[1000];

sin[45] = sqrt[2] / 2.0;

ってこと?

957 :名前は開発中のものです。:2009/03/31(火) 01:33:09 ID:jA3Wyd63
何気なくsinとかatanとか使ってるけど、結局それらの関数って
本来めちゃくちゃコストがかかる計算のはずだよな?
なら、やっぱりゲーム的には精度落としてテーブル実装にするのがモアベターなのかなあ。

958 :名前は開発中のものです。:2009/03/31(火) 01:35:57 ID:7Dccknp/
>>957
計算式で求めない確定した数値なら、テーブルのほうがベターじゃねーかな。
結局は、作り手の選択な部分なんで、絶対な解法というのはないよ。

959 :名前は開発中のものです。:2009/03/31(火) 01:36:09 ID:+yfcmkdB
携帯ゲームなら効果あるかも、って認識だ
今時のPCゲームで数学関数がボトルネックになるなんて考えられない
そもそもそこを気にするんならまず描画をやめれ

960 :名前は開発中のものです。:2009/03/31(火) 03:22:49 ID:TlPvCoUd
プロファイリングすれば分かるが携帯とかでも無い限り>>957案は逆に遅くなる
下手な考え何とやら

961 :名前は開発中のものです。:2009/03/31(火) 04:22:06 ID:DdunG5bw
じゃあ座標も少数型でいいんだね?

962 :名前は開発中のものです。:2009/03/31(火) 05:20:12 ID:AlfaWHG9
>座標も少数型
DirectXなので当然そうなる

というか、>>961の脳内にだけ誤差とかで上手くいかない状況があるんじゃね?

963 :名前は開発中のものです。:2009/03/31(火) 09:46:08 ID:6nFXdL0R
計算処理がテーブル参照一回分よりコスト低いなんて普通に考えたら信じられんのだが。

964 :名前は開発中のものです。:2009/03/31(火) 10:03:31 ID:lrQoi4db
まあ、バカにはわからんよ。

テープル参照と三角関数のベンチマークを
ランダムな引数で比較してみろよw


965 :名前は開発中のものです。:2009/03/31(火) 10:13:48 ID:Z60UL3VO
CPUの動作を理解しないと、テーブル参照と三角関数の速度差は理解出来んだろうからな。
つ〜か、キャッシュ絡みの動作は分かりにくい。

966 :名前は開発中のものです。:2009/03/31(火) 10:54:26 ID:6nFXdL0R
少なくとも俺が組んだプログラムでは
テーブル参照の方が10分の1のコストで済んでいた。

どういう組み方すれば三角関数の方が早くなるのか教えて欲しい。

967 :名前は開発中のものです。:2009/03/31(火) 11:20:46 ID:NJFMHqzD
関数のほうは、#pragmaとかで処理系の最適化を効かせた?
まあそれでもテーブルの方が速いってことは十分ありえるが

968 :名前は開発中のものです。:2009/03/31(火) 17:37:45 ID:AlfaWHG9
繰り返す話題だけど、環境依存があって当然の物の話だろ?
>>966のPCで特殊な結果が出たなら、珍しいねとしか言えない

969 :名前は開発中のものです。:2009/03/31(火) 17:52:51 ID:oMQsq3DX
環境が分からんから話が交錯するのです。
速度とか書き込む前に少なくともOS・CPUスペック・RAM容量・言語・住所・氏名を明示しましょう。

970 :名前は開発中のものです。:2009/03/31(火) 18:03:17 ID:EoCekJlW
この手の話題、過去に何度も出てくるけど、
ベンチマーク用のサンプルソースが示されないのはなんで?

論ずるよりもそれ実行すれば一発で納得できると思うんだけど
そんなに特殊なプログラムなの?

971 :名前は開発中のものです。:2009/03/31(火) 18:08:55 ID:wt58uqRX
描画以外の速度なんざ誤差
可読性重視

972 :名前は開発中のものです。:2009/03/31(火) 18:35:26 ID:YrEQyE+G
sinfじゃなくてsinを使うとコンシューマーでは遅くなるが。

973 :名前は開発中のものです。:2009/03/31(火) 18:55:24 ID:DdunG5bw
ああ俺はDXライブラリを使ってたから…
DirectXなら当然のことなのか
ついでに動的使う負荷も無視できるのかな
あれってvirtual宣言した時点で動的と判断されて負荷かかるのかな

974 :名前は開発中のものです。:2009/03/31(火) 19:30:48 ID:e23bhJED
コイツってさ、質問が意味を成してないよな
設計する為に継承したり、インターフェース用意したりしてるんじゃねーの?
手元に1行も自分が書いたソースねーだろw

まさに>>888

975 :名前は開発中のものです。:2009/03/31(火) 20:01:42 ID:eRxRYNY8
// sin関数
dblData = 0.0f;
intTime1 = GetTickCount();
for ( i = 0; i < 100000; i++)
{
dblData = sin ( 0.5f);
}
intTime2 = GetTickCount();
intKekka1 = intTime2 - intTime1;

// グローバルメモリ参照
dblData = 0.0f;
intTime1 = GetTickCount();
for ( i = 0; i < 100000; i++)
{
dblData = dblSin[i];
}
intTime2 = GetTickCount();
intKekka2 = intTime2 - intTime1;

これで、intKekka1が16、intKekka2が0
コンパイラ VS C++ 2008
Dual core 1.6GHz メモリの速度は忘れた。
C++のsinが多項式でいってるのかとか、どこまで精度だしてるかは不明。


976 :名前は開発中のものです。:2009/03/31(火) 20:04:29 ID:eRxRYNY8
100000→1000000で
intKekka1が188、intKekka2が15
VS C++のsinだとメモリ参照したほうが早い
他のコンパイラは、ここになかったんで不明



977 :名前は開発中のものです。:2009/03/31(火) 20:07:14 ID:C8QskIEz
関数がvirtualであることと擬似sinとライブラリ組み込みsinの速度が違うことに関係は無い……

978 :名前は開発中のものです。:2009/03/31(火) 20:07:31 ID:AlfaWHG9
どう見ても釣りです。 本当にありがとうございました。

キャッシュを一言も挟まない辺り狙ってるなw

979 :978:2009/03/31(火) 20:11:04 ID:AlfaWHG9
>>975
>Dual core 1.6GHz メモリの速度は忘れた。
Dualとか関係無いのはさすがに判るよね?

そこに書かなきゃいけないのは、CPUの2次キャッシュの大きさと、dblSin配列の大きさ


980 :名前は開発中のものです。:2009/03/31(火) 20:12:13 ID:EVrWm6RK
>>978
文句ばっか言ってないでお前の環境での結果を見せればいんじゃね?

981 :名前は開発中のものです。:2009/03/31(火) 20:12:53 ID:C8QskIEz
>>975
いや、sin[i]じゃないだろjk。
public double sinex(double rad)
{
for(int i=1;i<tbl.size();i++)
{
if(rad>tbl[i-1] && rad<tbl[i])return tbl[i];
}
return 0;
}
とかこんな感じじゃね?

982 :名前は開発中のものです。:2009/03/31(火) 20:14:58 ID:C8QskIEz
いやごめん忘れて。角度に関して、最初から整数で丸める実装にすればいちいちテーブル範囲参照しないでいいんだな。おkだ。

983 :名前は開発中のものです。:2009/03/31(火) 20:22:33 ID:ZKYAtsRN
>>975
テーブルを頭から走査したら駄目だろw
それでベンチマークになってると思ってるのかね。

それと、そのコードって最適化かかるとまずいんじゃない?
変数をvolatileで宣言してれば平気かもしれんが。

984 :名前は開発中のものです。:2009/03/31(火) 20:23:51 ID:C8QskIEz
>>979
整数実装にすれば(0が0度、64が180度(1PI),96が270度(1.5PI)みたいな設計にしてるなら配列のサイズ関係ないっぽいぜ。
もちろん、それの前処理としてのiが渡ってくる過程が重要になるけど。

それにしたって*1000くらいしたあとに %128とかで片付ければいいだけなのでそんなにコストがかかってるとは思わないけどな。

985 :名前は開発中のものです。:2009/03/31(火) 20:33:35 ID:eRxRYNY8
>>979
2次キャッシュが1024Kbyte
dblSinの大きさは、8000000byte

>>983
for ( i = 0; i < 1000000; i++)
{
intNo[i] = ((float)rand() / (float)RAND_MAX)* 1000000.0f;
}

dblData = 0.0f;
intTime1 = GetTickCount();
for ( i = 0; i < 1000000; i++)
{
dblData = dblSin[ intNo[i]];
}
intTime2 = GetTickCount();
intKekka2 = intTime2 - intTime1;

ランダムいれてみて、intKekka2が31。
今のやり方だとまだテーブルのほうが速い。

986 :名前は開発中のものです。:2009/03/31(火) 20:38:11 ID:eRxRYNY8
>>983
volatileはつけてる。



987 :名前は開発中のものです。:2009/03/31(火) 20:40:53 ID:eRxRYNY8
>>977
ライブラリ組み込みのsinの求めかたってコンパイラが違っても
計算のやり方同じなん?
gccでもVCでも同じ?

988 :名前は開発中のものです。:2009/03/31(火) 20:47:49 ID:DdunG5bw
別にvirtural とsin との問題に絡めて聞いたわけでなく
速度繋がりでついでに別個の問題として聞いたわけだが

989 :名前は開発中のものです。:2009/03/31(火) 20:49:04 ID:C8QskIEz
ライブラリ組み込み関数って大抵はgccの方が圧倒的に遅いんじゃないかなw

990 :名前は開発中のものです。:2009/03/31(火) 21:14:20 ID:+ipl15Vv
つーか、全体の処理の中でボトルネックになってるかどうかを確認するべきだと思うんだが。
今時三角関数省いたくらいで喜ぶなよ。

991 :名前は開発中のものです。:2009/03/31(火) 21:35:55 ID:WEsXEB63
シューティングなんぞループと加算と描画と三角関数くらいしか使わないもんだし、その中の一つ が削れただけでも影響は結構大きいかもだ

992 :名前は開発中のものです。:2009/03/31(火) 22:05:59 ID:yOP/w+uJ
「テーブル参照より三角関数の方が早い」って言う人がいて、
「サンプルプログラム示して実行させれば誰もが納得するだろ」って話になってるのに
「環境で変わるから〜」とか
「三角関数省いたくらいで喜ぶな」とか意味わからん。

993 :名前は開発中のものです。:2009/03/31(火) 22:16:26 ID:AlfaWHG9
現実にはミスキャッシュが起こるわけで、ソレの再現をすればよい
734msのダミーコードを追加した

intKekka1   750  実質 16ms
intKekka2   766  実質 32ms

for ( i = 0; i < 100000; i++)
{
 for ( j = 0; j < 100000; j++)
   tt = otherMemory[j]; //ダミーコード
}
intTime2 = GetTickCount();
dummyOnly = intTime2 - intTime1;

for ( i = 0; i < 100000; i++)
{
 dblData = sin ( 0.5f);
 for ( j = 0; j < 100000; j++)
   tt = otherMemory[j];
}
intTime2 = GetTickCount();
intKekka1 = intTime2 - intTime1;

// グローバルメモリ参照(←ヒープでいいよね?)
dblData = 0.0f;
intTime1 = GetTickCount();
for ( i = 0; i < 100000; i++)
{
 dblData = dblSin[ intNo[i]];
 for ( j = 0; j < 100000; j++)
   tt = otherMemory[j];

994 :名前は開発中のものです。:2009/03/31(火) 23:04:17 ID:0FYQSp1G
現実には割と続けて使われることも多いわけで、
そこまで明らかにミスキャッシュを誘発させるベンチはどうなんだろうね。

あと、dblSin[ intNo[i]]; だとテーブル二段階アクセスになるから
ちょっと不利な計測の仕方でしょ。

995 :名前は開発中のものです。:2009/03/31(火) 23:15:34 ID:WEsXEB63
誰か次スレたのむ

996 :名前は開発中のものです。:2009/03/31(火) 23:35:56 ID:AlfaWHG9
>>994
doubleData[i] = (double)rand() / (double)RAND_MAX;
なる配列を加えて、
dblData = sin ( doubleData[i]);
にした

kekka1 734
kekka2 781

確かに、画像の回転ぐらいやらせんと説得力ないな

997 :名前は開発中のものです。:2009/03/31(火) 23:57:28 ID:oMQsq3DX
妊娠してしまいますが

998 :名前は開発中のものです。:2009/04/01(水) 00:02:19 ID:NFPupAwb
埋め

999 :名前は開発中のものです。:2009/04/01(水) 00:10:27 ID:LuCgRd4k
シューティングで使う角度って10万も分割するのか……。

1000 :名前は開発中のものです。:2009/04/01(水) 00:12:11 ID:HvCh7B+t
http://pc11.2ch.net/test/read.cgi/gamedev/1212237657/

1001 :1001:Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。

252 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)