C/C++ゲーム製作総合スレッド Part4
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2013/08/12(月) NY:AN:NY.ANID:RPqvnGkC元スレ
DXライブラリ 総合スレッド その12
http://toro.2ch.net/test/read.cgi/gamedev/1330000532/
前スレ
C/C++ゲーム製作総合スレッド Part1
http://toro.2ch.net/test/read.cgi/gamedev/1337516528/
C/C++ゲーム製作総合スレッド Part2
http://toro.2ch.net/test/read.cgi/gamedev/1351015269/
C/C++ゲーム製作総合スレッド Part3
http://toro.2ch.net/test/read.cgi/gamedev/1357899040/
0672名前は開発中のものです。
2013/11/10(日) 14:29:39.91ID:NUelFT18「自分で別に起こした、ゲーム処理用のスレッドの事」 の事か。
で、OS側とのポンプを行うディスパッチは、「本当のメインスレッド側に任せている」 みたいな。
もしもそういう意図で言ってるならいいんじゃねと思うが。多分にエスパーだけど。
用語に齟齬がある感じか?
0673名前は開発中のものです。
2013/11/10(日) 14:33:41.51ID:SiZkRCd6ああ、そういう事を聞きたかったのか。理解力が無くてすまん。
それで当たってる。
0674名前は開発中のものです。
2013/11/10(日) 14:35:33.82ID:YibCAKGF0675名前は開発中のものです。
2013/11/10(日) 14:35:58.59ID:NUelFT18> メインスレッドでゲームの主な処理全般をやってて、WinProcがレストア対策とかを、
入れ違ったけど、>>672 で合ってたようだ。
そしてその様子だと、なんかOS側都合の処理と自分のアプリケーションコードと、切り分けないで行ったり来たり混ぜ込んでるみたいだけど
… いやそれで問題無いなら別にいいが、エラく遠回りな実行パスになってるなぁとは思うけど。
あと "タイマー" スレッドって言うか、それもしかしてハートビート処理してるんじゃね的な印象受けるが。
いや、いいならいいんだけど。
0676名前は開発中のものです。
2013/11/10(日) 14:44:09.28ID:NUelFT18一絡げに良い悪いでぶった切れる訳じゃないって事を一応書いておく。
0677名前は開発中のものです。
2013/11/10(日) 14:50:50.53ID:SiZkRCd6始めはマイクロ秒単位に直すべきかな?とは思ってたんだけど、
なんだか最近はどうでも良くなってね。
多分、苦情も出ないだろうと。
0678名前は開発中のものです。
2013/11/10(日) 15:18:12.54ID:NUelFT18違う使われ方なら違うと思うけど、>>671 のコードだけ見ると、一定速で足並みそろえる為だけに別スレッド起こして
定期的に処理全体の速度決めてるみたいだから、それっぽく見えただけ。 ループ1回のテンポ管理って言うか。
0679名前は開発中のものです。
2013/11/10(日) 15:40:15.07ID:SiZkRCd6レストア関連の処理を登録型にして、オブジェクトの生成時に自動登録してるから変に思うのかな?
0680名前は開発中のものです。
2013/11/10(日) 15:46:33.19ID:NUelFT18?いや全然そういう事じゃなくて、書いてる通り。
あと、「変」 と思ってる訳じゃなくて、これも書いてる通り、エラく遠回りな実行パスになってるなぁって話。
> OS側都合の処理と自分のアプリケーションコードと、切り分けないで行ったり来たり混ぜ込んでるみたいだけど
こういう事。OS側都合の処理と、自分側都合のアプリケーション設計のレイヤをキレイに整理して分けないで、あえて混ぜ込んでるのかなと思ったって事。
そう思った理由が、要は別スレッドに分けようがどうしようがいいんだけど、いちいちOS側のメッセージポンプ経由してやりとりしてるように見えたから。
0681名前は開発中のものです。
2013/11/10(日) 16:03:46.14ID:NUelFT18OSに対してメッセージを送信したり受信したりって動作は、メッセージキューに対してデータをストアしたり自分で取得したりって言葉に置き換えられて、
で、取得したメッセージデータをディスパッチするなりなんなりしてポンプとやりとりするその繰り返しを、つまりメッセージループと呼ぶ訳だけど、
その動作の正体って、要はこちらのアプリケーションコードがOSと協調して動く為に、
OS側の都合で用意された仕組みな訳で、いわば 「ここで動く物ならば、書かねばならない事」 な訳だけど、
それはそれ、これはこれって話で、逆にこちらのアプリケーションコード側には当然こちらの処理都合や設計がある訳で、
その両者、つまりOS側都合のコードと、アプリケーションの設計に基づく自分都合のコードと、それらの仲立ちをする部分ってのを
明確に分けないで、常にOS側に寄ってるような書き様に見えた、って事。
でも細かい事を言えば、例えば描画処理やキーやマウスなんかの入力状態の取得は
結局OS側API経由で行う訳だから、その意味では完全に切り分かりはしないんだけど、メッセージポンプそのものを直接操作する部分まで
自分のレイヤに置いてるから、実行パスがなんか長く無いか? と思うって事。 真面目に書くと長い。
0682名前は開発中のものです。
2013/11/10(日) 16:49:07.90ID:BZWoGG+b具体的にどんなふんにやってるのか、それがよくわからんのよね
メインスレッドはメッセージポンプだけ担当させて
メッセージは別の状態更新スレッドに送って、さらに描画を別スレッドでやる?
1/60秒で処理をやるにしても、正確に処理をまわせるのか?って悩んでるんだけど。
0683名前は開発中のものです。
2013/11/10(日) 17:00:52.03ID:SiZkRCd6それぞれのシーンを表現しているけれども、
それに違和感を感じたって事かな?
0684名前は開発中のものです。
2013/11/10(日) 17:02:48.64ID:HHIqigB3ゲームの処理を終わらせた後じゃないと描画する意味が無いから
メインループ {
1F経過まで待つ
シーンマネージャー処理(ゲーム処理)
シーンマネージャー処理(描画処理)
}
もちろんゲームの処理は中でできるとこだけマルチスレッドにしてもいいけど
こんな感じじゃダメなの?
0685名前は開発中のものです。
2013/11/10(日) 17:11:59.41ID:SiZkRCd6自分の場合は描画もゲームスレッドでやってるからそれは何とも言えない。
ただ単純に、
for(int i = 0;i<30;i++){1F経過まで待つ;ゲーム処理;描画処理;}
ってやれると楽そうだな、という発想でゲームスレッドでやってるから。
0686名前は開発中のものです。
2013/11/10(日) 17:24:20.86ID:SiZkRCd6//初めのシーン
for(int i = 0;i<30;i++){1F経過まで待つ;ゲーム処理;描画処理;}
//ゲームシーン(breakで抜けるまで続く)
for(;;){1F経過まで待つ;ゲーム処理;描画処理;}
//終了シーン
for(int i = 0;i<30;i++){1F経過まで待つ;ゲーム処理;描画処理;}
0687名前は開発中のものです。
2013/11/10(日) 17:32:39.17ID:xFfnK9kVsugeee
0688名前は開発中のものです。
2013/11/10(日) 18:51:24.54ID:J6U7RGC4やっぱり言葉よりコードだな、ようやく言いたいことが分かった。
確かに分かりやすいし書きやすい。
もう少し粒度を小さくしないと、後々大変そうだけどね…
0689名前は開発中のものです。
2013/11/10(日) 19:02:16.28ID:6BMJKGP60690名前は開発中のものです。
2013/11/10(日) 19:19:59.24ID:YibCAKGF0691名前は開発中のものです。
2013/11/10(日) 19:48:01.12ID:6BMJKGP60692名前は開発中のものです。
2013/11/10(日) 19:50:19.66ID:YibCAKGF?
好きにつかえば?
0693名前は開発中のものです。
2013/11/10(日) 19:55:37.45ID:6BMJKGP60694名前は開発中のものです。
2013/11/10(日) 20:22:31.51ID:bgKauzyA2つのスレッドで構造体のポインタをスワップする方式とか構想したことあるなぁ
Aを描画スレッドが使って、Cをルーチンスレッドが更新、
AとCのスレッド同期待ちを防ぐためにBがあるんだけどメモリ消費3倍の割りに
得るものがほとんどないんだよねw
A ←→ B ←→ C
0695名前は開発中のものです。
2013/11/10(日) 20:43:45.76ID:AQnkKNT/DirectX11のマルチスレッド対応も実際には描画してないし
0696名前は開発中のものです。
2013/11/10(日) 22:37:11.50ID:Y52keycrデータから頂点の座標取得したりする描画スレッドとそれ以外のメッセージ処理や更新判定処理スレッドの
二つがあるとして
メインループの中で
更新
判定
描画
ってやってるんだけどちょちょいのちょいで出来るようにならない?
一応オブジェクト指向に則って疎結合を意識してるつもりな設計
0697名前は開発中のものです。
2013/11/10(日) 22:37:57.03ID:Y52keycr0698名前は開発中のものです。
2013/11/10(日) 23:25:00.60ID:BZWoGG+b0699名前は開発中のものです。
2013/11/11(月) 00:58:53.66ID:wJB5S1Qkなんちゃって垂直同期は16ms待てばいい
0700名前は開発中のものです。
2013/11/11(月) 01:43:24.19ID:5EPocdwqそれ以前と以降では仕組みが違うんかな。
0701名前は開発中のものです。
2013/11/11(月) 12:48:03.31ID:Fts6Gxoy基本フルスクリーンモードでなきゃなんちゃってだけど
0702名前は開発中のものです。
2013/11/11(月) 16:02:02.14ID:QJvegRhHこれのかわりになるものってありますか?
ちなみにPCはWindows7でDirectX11です。
0703名前は開発中のものです。
2013/11/11(月) 16:51:39.02ID:nqfJmzHsCPUやメモリへの負荷がさらに軽減され、
超高解像度の大画面などの表示もこれまで以上に快適になりました
0704名前は開発中のものです。
2013/11/11(月) 16:52:56.35ID:ccAyXS0p0705名前は開発中のものです。
2013/11/11(月) 18:51:40.86ID:9nBr9W7M0706名前は開発中のものです。
2013/11/11(月) 20:46:10.17ID:Pi4WQJr5もしかして VisualStudioのAppWizardの事言ってる?
0707名前は開発中のものです。
2013/11/11(月) 21:05:44.05ID:2v1wLOCn最後の方のDirectX9のサンプルを持ってればその中にEmptyProjectってのが代わりにあった
これをそのまま毎回コピペして読み込めばたぶん一緒
最近のVisualStudioなら最初にテンプレートのエクスポートすればコピペしなくて済みそうだ
0708名前は開発中のものです。
2013/11/11(月) 21:29:01.28ID:YrCkgvSp確かにEmptyProjectってのはありました
テンプレートのエクスポートってのをちょっと詳しく教えてください
0709名前は開発中のものです。
2013/11/11(月) 21:34:01.50ID:8+GX9h850710名前は開発中のものです。
2013/11/11(月) 21:36:39.52ID:Pi4WQJr5テンプレート書き換えの際に注意な。
あと基本的に自己責任
0711名前は開発中のものです。
2013/11/11(月) 21:37:03.59ID:YrCkgvSpDirectX9 シェーダープログラミングブックではその機能を使って進めてるから、ない場合はどうすればいいのかなと疑問に思っただけ
0712名前は開発中のものです。
2013/11/11(月) 21:38:00.99ID:Pi4WQJr5大体シェーダプログラミングってお題でなんでAppWizard必要なのかってのは
俺もずっと引っ掛かってた
0713名前は開発中のものです。
2013/11/11(月) 21:40:36.26ID:Pi4WQJr5そのお題で言うなら、要点はhlsl書く部分なので、
いつも通りのDirectXコード書いた上で、追加するイメージだよ
0714名前は開発中のものです。
2013/11/11(月) 22:26:29.70ID:YrCkgvSpなるほどわかりました
丁寧な回答ありがとうございました!
0715名前は開発中のものです。
2013/11/11(月) 22:32:50.04ID:PnsUbhmi3dゲームでモデルファイル読み込むときって自分でバイナリ展開して頂点一個づつメモリ確保しておくの?
それともdorectxにそういう型があるの?
0716名前は開発中のものです。
2013/11/11(月) 22:55:28.71ID:d6CPjZRDEmptyProjectでもなんでもいいんだけど読み込んでビルドして問題ないようなら
メニューから→ファイル→テンプレートのエクスポートしておくと
新規作成で同じプロジェクトが量産できる
0717名前は開発中のものです。
2013/11/11(月) 23:00:12.51ID:YrCkgvSpそうなんですか?
めちゃくちゃ便利ですねww
今度使ってみます
0718名前は開発中のものです。
2013/11/11(月) 23:01:07.66ID:8+GX9h85シェーダでは使いやすい構造を自分で定義して使う。
0719名前は開発中のものです。
2013/11/11(月) 23:09:49.33ID:Pi4WQJr5一応D3DXMESH型って言ういわゆる xフォーマットって呼ばれる形式はあるよ。
あるが、都合によっては遠回りだった色々あるので、VertexBufferやIndexBufferに詰めて、カスタムFVFで頂点情報指定して、
自分でDrawしたりする、
でその際、hlslのVertexShaderでは頂点の表示用移動計算したり、PixelShaderではラスタライズする際の色の計算したりする。
そんな感じ。
俺はDirectXとOpenGLの両方でキャラクタコントロール処理書いてるけど、どっちも基本的な考え方と処理方法の方針は同じ。
0720名前は開発中のものです。
2013/11/11(月) 23:12:39.08ID:Pi4WQJr5例えばAndroidアプリ作るような場合にもほぼそのまま同じ考え方を持っていけるので楽しい。
0721名前は開発中のものです。
2013/11/20(水) 16:41:23.19ID:mZCOUmnU4byte(int) * 100 * 100 = 40Kbyte をメモリ上に展開しちゃうことになると思うんだけど、
そんなにメモリ使っちゃってOKなんかな?
charで節約したりした方がいいのん?
0722名前は開発中のものです。
2013/11/20(水) 17:02:58.00ID:8xStlzdMそれはそれとして、普通8bitで収まる情報量なら聞くまでもなくわざわざ4byteで持たないと思うけど。
0723名前は開発中のものです。
2013/11/20(水) 18:10:09.38ID:Llt9nZp6将来的にも、640KBもあれば充分だw
0724名前は開発中のものです。
2013/11/20(水) 18:21:35.83ID:a0jyWJdjつi'"':
`、:_i'
0725名前は開発中のものです。
2013/11/20(水) 18:28:50.19ID:IgNTutIb0726名前は開発中のものです。
2013/11/20(水) 18:37:24.78ID:AhomBF6+お前天才だな
0727名前は開発中のものです。
2013/11/21(木) 01:41:01.40ID:a974XkAr0728名前は開発中のものです。
2013/11/21(木) 21:30:35.93ID:gO/u8tbYありがとう。レイヤに分けるとけっこう嵩みそうだったから気になったの
0729名前は開発中のものです。
2013/11/22(金) 11:42:42.36ID:L4YYaWZ60730名前は開発中のものです。
2013/11/22(金) 11:45:55.04ID:el2jZgnT0731名前は開発中のものです。
2013/11/22(金) 12:16:45.45ID:d//1m//p0732名前は開発中のものです。
2013/11/22(金) 12:18:32.72ID:D9r/jCClclassばっかり使ってても別に問題ないと思うよ
使い分け指針は人によって違ってくるんじゃないかな
俺は、PODでメンバ関数をほとんど持たないものはstructにして
それ以外はclassにしてる
0733名前は開発中のものです。
2013/11/22(金) 12:19:54.66ID:el2jZgnTアイテムとかはクラスにするか
0734名前は開発中のものです。
2013/11/22(金) 12:27:03.21ID:C5tdgqMt構造体だって、メンバに仮想関数がいる時点でアウト。
クラスと構造体の違いは、デフォルトの属性だけだ。
0735名前は開発中のものです。
2013/11/22(金) 12:47:03.52ID:m4o+8FyI0736名前は開発中のものです。
2013/11/22(金) 13:10:34.70ID:f0yNZwTQ配列でやってるが
セーブデータ類は一旦構造体にまとめてるな
0737名前は開発中のものです。
2013/11/22(金) 13:14:01.85ID:f0yNZwTQ0738名前は開発中のものです。
2013/11/22(金) 15:23:15.47ID:0yYw/Mnl例えば、いままで下のようにプログラミングしてました。
int loopflg = 1 ;
main() {
}
0739名前は開発中のものです。
2013/11/22(金) 15:25:57.09ID:0yYw/Mnlint loopflg = 1;
main (){
while( loopflg) {
//色々処理
}
}
こうしてると、プログラムのどこでもloopflgをオフにすればプログラムを終了させたりする事ができてたのですが、
これをグローバル変数でなくするとしたら、いちいちポインタをloopflgを使うであろう全関数に渡さなくてはいけないって事になるのでしょうか?
0740名前は開発中のものです。
2013/11/22(金) 15:29:21.26ID:WFSnBMBO0741名前は開発中のものです。
2013/11/22(金) 16:04:33.07ID:lwGBy8D8ダメなモノをclassで定義してるな
0742名前は開発中のものです。
2013/11/22(金) 16:27:28.59ID:FoltViiyグローバル変数使いまくりでもmain関数一本でも力技でねじ伏せられるから
何の問題もないよ
0743名前は開発中のものです。
2013/11/22(金) 17:10:07.07ID:mwriLfsE何でグローバル変数の濫用がいけないのか、その理由について調べた方が良いよ
0744名前は開発中のものです。
2013/11/22(金) 17:13:59.69ID:hYC6pvwJそれでいいって考え方のまま定着すると、当然本人が糞しか知らない人間になるけどな。
それでいいならご自由に。
0745名前は開発中のものです。
2013/11/22(金) 17:28:53.76ID:dd6zd2gaグローバル変数よりかは安全
0746名前は開発中のものです。
2013/11/22(金) 18:38:56.79ID:D9r/jCClグローバル変数のままで良いんじゃないかな
0747名前は開発中のものです。
2013/11/23(土) 02:22:34.08ID:pCp+KEqgBクラスでAクラスのヘッダーをincludeしてから、
A* a;
って宣言したんだけど、「 構文エラー : ';' が '*' の前にありません。」って怒られる。
宣言を削除したらエラーは解消されるんだけど。誰か助けてー。
0748名前は開発中のものです。
2013/11/23(土) 06:37:52.23ID:mkjLONm4もしそうならBヘッダ内でのinclude Aを消して、class A;ってだけ書けばいけると思う
Bヘッダ内でAのポインタ以外も使ってるとこの方法でも駄目だから、
その場合は循環参照をなくすかヘッダ内はポインタのみの使用にしないとだめ
0749名前は開発中のものです。
2013/11/23(土) 07:11:39.19ID:5dPh0gWJAクラスの宣言の終わりの } の後ろにつけるべき
セミコロンが抜けていると思われる
class A {
...
} ; ←コレ
これがないから、次に書いた「A* a」の「A」が変数名と取られて
変数宣言文なのにセミコロンで終わってねーよ、って怒ってるんだと思う
0750名前は開発中のものです。
2013/11/23(土) 09:07:58.39ID:pCp+KEqgセミコロンは入っていたので、他の変数で循環参照になってないか見てみます。
includeしないでclassを宣言するって方法も調べた時に見つけたのですが、
そうするとAのメソッドや変数を使う時に困らないですか?
0751名前は開発中のものです。
2013/11/23(土) 09:15:59.31ID:qAUswyg9基本的にcppファイルをincludeすることはないからな
0752名前は開発中のものです。
2013/11/23(土) 09:29:25.53ID:pCp+KEqgありがとうございます。
cppとhどっちにincludeするかでどう違うかは勉強しないと。
どっちみちincludeしたソースを展開するから一緒の意味かと思ってました。
0753名前は開発中のものです。
2013/11/23(土) 09:36:08.07ID:quMDFUnR0754名前は開発中のものです。
2013/11/23(土) 15:00:40.23ID:pCp+KEqgちゃんとincludeしてるのに。
0755名前は開発中のものです。
2013/11/23(土) 15:52:53.74ID:eDIontM4外部シンボルの解決はリンカの範疇の話だから、includeの話じゃない
たまたま include先で pragma してたらリンクされるけど、本質的にリンカの話。
ビルド時にリンクしてないんじゃないの?
0756名前は開発中のものです。
2013/11/24(日) 00:58:34.12ID:nXfPoBTRヘッダーに宣言があってもリンク時に定義(本体)が見つからなければそらエラーになるさ
ライブラリをリンクし忘れる以外でも
関数の本体を書くのを忘れた、とか
書いていてもcppがプロジェクトに入ってなくてコンパイルされていないとかでも起こる
0757名前は開発中のものです。
2013/11/24(日) 05:16:53.08ID:8WCzf0hrAクラスはコンストラクタ2つ宣言してて1つしか定義していませんでした。。。
Aクラスの親クラスは2つ定義していたから勘違いしててずっと気づかなかった。
ありがとうございました!
0758名前は開発中のものです。
2013/11/24(日) 16:28:43.61ID:Hldh+di00759名前は開発中のものです。
2013/11/28(木) 08:11:12.57ID:CZM1vdUb0760名前は開発中のものです。
2013/11/28(木) 09:37:30.27ID:7WgsJNsl0761名前は開発中のものです。
2013/11/28(木) 09:51:07.57ID:al6vnunW0762名前は開発中のものです。
2013/11/28(木) 10:19:38.67ID:X9Kxk+W20763名前は開発中のものです。
2013/11/28(木) 10:44:05.67ID:xZXVZMiYcam.dirX += cam.speed;
cam.posX = cam.range * sinf(cam.dirX * PI / 180.0f);
cam.posZ = cam.range * cosf(cam.dirX * PI / 180.0f);
縦回転(上)はこれなんだが
cam.dirY += cam.speed;
cam.posY = cam.range * sinf(cam.dirY * PI / 180.0f);
cam.posZ = cam.range * cosf(cam.dirY * PI / 180.0f);
縦回転するときだけX軸にぐにゃっと動きながら回転するんだよなぁ、多分>>761の通りミスかも
出先だから詳しくなくてすまん、あとdirは角度
0764名前は開発中のものです。
2013/11/28(木) 11:02:27.16ID:LQeMJPROそういうときはsinをcos変えてみるべ
0765名前は開発中のものです。
2013/11/28(木) 11:03:24.11ID:LQeMJPRO0766名前は開発中のものです。
2013/11/28(木) 11:33:55.99ID:Px6CCwOG0767名前は開発中のものです。
2013/11/28(木) 11:46:55.19ID:uKSbr4aj結構バラバラだったりするしなあ。
0768名前は開発中のものです。
2013/11/28(木) 14:45:26.84ID:WY2yxhUIposZ = range * cosf(dirY * PI / 180.0f);
バグのもと
上の式から逆算してdirX計算してるならxが動くのもあたりまえ(dirX=dirY、斜めに回転)
初期状態で全部変わるから行列から計算しなきゃ出ないと思うよ
3Dアクションのソース見れば幸せになれる
0769名前は開発中のものです。
2013/11/28(木) 14:55:56.16ID:xZXVZMiY視点はプレイヤー固定なのでsinとcosをちょっと弄ってみるかなぁありがとう
0770名前は開発中のものです。
2013/11/28(木) 15:15:08.32ID:WY2yxhUI直接式書くなら三角関数の数はxzは2つyは1つだと思う
0771名前は開発中のものです。
2013/11/28(木) 15:40:16.54ID:l3wVILCrアクションのソースとか言っちゃった恥ずかし
一応初期値(1,0,0)でY軸回転αZ軸回転βなら
x=L*cosα*cosβ
y=L*cosα*sinβ
z=L*sinα
間違ってる可能性もあるし参考程度にどうぞ
■ このスレッドは過去ログ倉庫に格納されています