トップページgamedev
1001コメント353KB

C/C++ゲーム製作総合スレッド Part4

■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。2013/08/12(月) NY:AN:NY.ANID:RPqvnGkC
ゲーム製作におけるC/C++全般に関するスレです。

元スレ
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/
0297名前は開発中のものです。2013/10/04(金) 21:46:22.36ID:yG2oikok
グローバル変数を使うなというのは全体構造を分かり難くするから
使わない方が無難というだけ
必要があるなら遠慮なく使えばいい
0298名前は開発中のものです。2013/10/04(金) 21:49:17.96ID:pWUsBtby
>>297
ありがとうございます
0299名前は開発中のものです。2013/10/04(金) 21:59:15.94ID:yG2oikok
そもそもnamespaceとかexternってグローバル変数を活用するための機能だからな
0300名前は開発中のものです。2013/10/05(土) 06:58:26.67ID:42i+ls1b
>>288
子の参照を持ってるのは親だけなのでは
0301名前は開発中のものです。2013/10/05(土) 08:55:09.52ID:zPZwPgbh
>>296
グローバル変数を使うなと言われる理由はいくつかあるけど、その一つに変数は関数より柔軟性が低いってのがある。
メンバ変数をプライベートにしてsetter/getterを作れっていうのと事情は大体同じ。

例えば、4人対戦ゲーの場合、プレイヤーIDを表す変数は0〜3までの値しかとって欲しくないとする。
変数に直接代入する場合、いざ使う時になってIDが正しいかチェックする必要があって、プレイヤーIDが0〜3になっているかチェックするコードが全体にばらまかれる。
関数経由で代入する場合、引数の値をチェックしてエラーを投げることができるので、値の範囲をチェックするコードは最初のsetterだけで済む。

変数は代入しか出来ないけど、関数は付随する処理(引数チェック、ログの記録)が出来るし、仕様の変更にもある程度柔軟に対応できる。
(プレイヤー人数を6人に増やしたいと思ったときに修正しなければならい箇所の違いを考えると…)


理想的には、Socket自体は通信関係のコード以外に触れられないようにして、

SendAttack(OBJECT_ID target);
SendMove(OBJECT_ID id, Position pos);
SendChat(PLAYER_GROUP_ID groupId, const char* msg);

みたなゲームの仕様に合わせたパケット送受信関数を作って、それをゲームロジック全体で使う。

この手の送受信関数を纏めたクラスのオブジェクトが、シングルトンやグローバル変数になるのは仕方ないんだけど、
Socketが丸出しのグローバル変数ってのはあんまりよくはないな。

まぁ小規模なゲームを一人で書いてる内は、そこまで致命的でもなかったりするが。
まだ仕様がハッキリと見えてない段階でプロトタイプを書いてるときは、何も考えずグローバル変数の方が手早い事も多いし。
長文でスマン。
0302名前は開発中のものです。2013/10/05(土) 09:16:22.33ID:0JH/7YRj
どっちかって言うと実際に使った時直面する問題って、グローバルに複数置いてる物があって、それらが相互に関わってるような時、
開放順が保証されないからデストラクタで何か処理するような場合困るかもしれないって事と、

namespaceも分けて無いグローバル変数でかつexternだらけとかになると迷子になる上、別の翻訳単位にもしも同名があった時面倒な事になる、ってのが

大昔に経験したリアルな問題
0303名前は開発中のものです。2013/10/05(土) 09:18:23.46ID:0JH/7YRj
ちなみに、「翻訳単位内でのローカルな範囲で良いグローバル変数」には、
普通 static キーワード付けて、externさせないってのが常套手段だよな。
0304名前は開発中のものです。2013/10/05(土) 09:31:57.77ID:6oF2RLCd
static = private
extern = public
0305名前は開発中のものです。2013/10/05(土) 12:18:22.70ID:pPsHi/Df
>>300
そうは限らないよ。
親から一定間隔離れて行動したり、親の状況で振る舞いを変えることがあるから。
どちらの場合もある。
0306名前は開発中のものです。2013/10/05(土) 12:29:05.40ID:lHo24dEm
extern Kelsi Olesya_Rulin;
そう、グローバルを遠慮する必要なんてない、ってのは合意事項だよな
0307名前は開発中のものです。2013/10/05(土) 13:13:45.24ID:lHo24dEm
あれ、コンパイル通らなかったか。
そうか参照が抜けてたか。
http://images2.fanpop.com/image/photos/9400000/kelsi-high-school-musical-9487566-333-500.jpg
http://img.photobucket.com/albums/v515/bloodylamer/bastardly-photos/0505/album102/olesya-rulin-09040702.jpg
これでどうだ。
0308名前は開発中のものです。2013/10/05(土) 15:33:55.63ID:hWuxl6U4
>>305
親から全ての子に指示するべきじゃない?
子供が親の参照はよくないと思う
0309名前は開発中のものです。2013/10/05(土) 16:02:12.04ID:hYYXb5oU
>>308
Ogre3Dは親子それぞれ参照をもってるんだがな
0310名前は開発中のものです。2013/10/05(土) 16:25:59.47ID:pPsHi/Df
>>308
それも場合によると思うなぁ。親を辿りたい時があるし、
親が子に干渉しすぎるのはちょっと、という考え方もあるだろうし。
0311名前は開発中のものです。2013/10/05(土) 17:01:45.43ID:GFX991pR
親子の捉え方が違うとなんともいえんような

例えばシューティングでの位置関係なら
親の移動が子全体に影響するなら、親が子の参照を持っているのが便利だよな
これはシーングラフみたいなやつか、スプライトとかはコッチだろうな

逆に子が親の行動をトレースするタイプだと参照の持ち方は逆になる
こっちはカメラのスナップかな、親が持つんじゃなくて、子が勝手にぶらさがる
0312名前は開発中のものです。2013/10/05(土) 18:02:50.50ID:G4p0Eaf6
親ノードは子ノードの配列を持ち
子ノードは親ノードの弱参照を持つという形にしている
0313名前は開発中のものです。2013/10/06(日) 12:59:02.01ID:zo41YPA1
親子関係といっても様々な層にあるからねぇ
例えばゲーム設定上の関係性(物理、組織、通信回線、人間模様、etc)は色々だし
これらの関係性も、実装上は、制御(操作)の流れ、データの流れ、色々だし

話の前提条件が何かを伏せてる限り、問題の所在も実装の最適解も本人にしかわからん
説明が面倒なら、頑張れとしか言えん
0314名前は開発中のものです。2013/10/06(日) 19:46:28.52ID:iRwfUiRG
アクションなんかで敵キャラクターの種類によって戦闘ロジックを変える場合って、種類ごとに継承するのが普通?
それとも、戦闘ロジックの部分だけ無名関数で差し替えるとか?
0315名前は開発中のものです。2013/10/06(日) 19:56:21.47ID:NCxdwdJm
戦闘ロジックには関数ポインタを使った事と、スクリプト言語を使った事がある
処理速度では前者、汎用性では後者だな
0316名前は開発中のものです。2013/10/06(日) 22:48:36.24ID:Gau/gyhr
>>314
前者が、敵1体を1単位とするような粗い粒度の処理の差し替えの話で
後者が、無名関数でもおkな程度に細かな粒度の処理の差し替えの話なら

場合に応じてそうした実装の使い分けをするというのは普通にアリなのでは
0317名前は開発中のものです。2013/10/07(月) 00:06:33.12ID:Z8udyLbh
分解能について教えて欲しいんだけど
timeBeginPeriodとtimeEndPeriodはプログラム全体で同じ分解能なら開始時と終了時に1回呼ぶだけで合ってる?
それともタイムを使うごとに毎回呼ばないといけない?
0318名前は開発中のものです。2013/10/07(月) 00:19:23.88ID:peQndcOh
毎回呼ぶのは無駄ぽいんだが
1回だけだと他のプロセスで精度を悪いほうに変えられたら駄目だろうな
0319名前は開発中のものです。2013/10/07(月) 00:33:00.85ID:Z8udyLbh
>>318
ありがとうございます
そうか他のプロセスで弄られる可能性が有るから毎回呼ぶほうがいいのか・・・
1回呼べば固定されるはずなのにサンプルコードで何で毎回呼ぶのかわからなかったけどようやくわかった
0320名前は開発中のものです。2013/10/07(月) 10:34:56.91ID:cd4YBeJh
>>317
一回でいい。
ただtimeBeginPeriodとかはOS共有だから
他のアプリで操作されたらどうしようもない。
0321名前は開発中のものです。2013/10/07(月) 17:24:54.99ID:qrJ0yezQ
なんでCとC++をごっちゃにしてんだよこのスレ
C++アンチはどこに行けばいいんだよ
0322名前は開発中のものです。2013/10/07(月) 17:27:52.18ID:fbGS27If
C++アンチなんて意味のない行為はやめてしまえ
0323名前は開発中のものです。2013/10/07(月) 17:34:15.51ID:qrJ0yezQ
C++11は許せるがそれ以前はコードに吐き気を覚えるわ
0324名前は開発中のものです。2013/10/07(月) 17:34:45.52ID:HiWWBNmC
オタク系の板みたいにプログラム板にC++アンチスレって立ててみたら?
0325名前は開発中のものです。2013/10/07(月) 18:09:02.74ID:rNPgmZ8O
この板でもよくね?人が集まるかどうかは板の需要と1のカリスマ次第
0326名前は開発中のものです。2013/10/07(月) 18:30:40.04ID:hXeKSm4C
それって「C++でゲームを『作らない』スレ」ってこと?
だとしたらゲ製でやることじゃないな
0327名前は開発中のものです。2013/10/07(月) 18:33:42.33ID:m3YcIJSb
タダでさえ住人の少ないゲ製板の、タダでさえ住人の少ないC/C++スレを
さらに分割してどうするんだよ。
0328名前は開発中のものです。2013/10/07(月) 19:06:58.27ID:Rxv904Ei
今時純粋にCのみてのは居ないだろ。Cのみと言ってて知らずにC++の機能つかってるやつおるし。
0329名前は開発中のものです。2013/10/07(月) 19:46:57.01ID:qP3zr35u
コードに吐き気覚えるとか言っちゃう人って、要は書けないし理解も出来ない人が自分を正当化するために言う台詞だから無視でおk
0330名前は開発中のものです。2013/10/07(月) 19:50:35.82ID:HiWWBNmC
そうかな。重苦しいコードってあると思うよ
0331名前は開発中のものです。2013/10/07(月) 20:19:25.16ID:807/8QJs
ほほほ。そんなのほっとけ

個人の趣味の時は人目を気にすることなくベターC留まりの
作り捨て上等のコードでいいのよ

家ではみんなパンツ一枚でしょ
0332名前は開発中のものです。2013/10/07(月) 20:22:05.83ID:807/8QJs
△作り捨て上等のコードでいいのよ
○作り捨て上等のコードで“も”いいのよ
0333名前は開発中のものです。2013/10/07(月) 22:42:28.85ID:rZ6Ej5K9
今はもうC++(とスクリプト言語)でしか書かない
もちろんオブジェクト指向
0334名前は開発中のものです。2013/10/07(月) 22:47:44.55ID:IYoY04Mi
class myclass{
private:
int* p;
public:
void hoge();
}

void myclass::hoge()
{
p = new int[ sizeof( int) ];
}

void main()
{
myclass obj;

obj.hoge();
obj.hoge();
}

この場合初めにNewした領域はプログラムが完全に終了するまで消すことは出来ませんよね?
0335名前は開発中のものです。2013/10/07(月) 22:49:26.71ID:Rxv904Ei
うん
0336名前は開発中のものです。2013/10/07(月) 22:56:29.67ID:NV8ETZzm
一個目どころか二個目も駄目じゃね
0337名前は開発中のものです。2013/10/07(月) 23:13:34.32ID:IYoY04Mi
>>335
>>336
ありがとうございます!!

2個目を消す場合、
クラスにDelete()関数を追加して、
void myclass::Delete()
{
delete[] p;
p = NULL;
}

void main()
{
myclass obj;

obj.hoge();
obj.hoge();

obj.Delete();
}

でも、ダメですか?
0338名前は開発中のものです。2013/10/07(月) 23:15:28.95ID:Rxv904Ei
いいけど、そこはかとなくダメコードのにおいがする
0339名前は開発中のものです。2013/10/07(月) 23:23:11.69ID:IYoY04Mi
>>338
実際にこれを使うわけではないので安心してください!
プログラムの勉強を始めたばかりで内部的にどうなってるか知りたかったんです。

答えてくださった方たちありがとうございました!
0340名前は開発中のものです。2013/10/08(火) 09:02:29.21ID:4d44TfVz
>>337
一回目のnewで確保した領域をメモリリークさせるコードを書きたいの?
よくわからんテストコードだな。
0341名前は開発中のものです。2013/10/08(火) 09:46:37.11ID:ttaYSeAJ
>>337
myclassのデストラクタで配列解放しない理由は?
0342名前は開発中のものです。2013/10/08(火) 09:56:41.94ID:ttaYSeAJ
>>339
普通と言うかよくやる考え方の順序で言うと、まず真っ先に一旦myclass側のデストラクタで、そのクラスの管理責任として、
自身がメンバとして持っている要素の解放処理書いとくってのをワンセットにしてそれを土台の考え方として、

その後、それじゃ困るようななんらか事情や実装都合、あるいは設計上の理由があった時、
実行時の動作パス踏まえて考えた上で、そこでやってるような開放専用関数追加するとかって順番で考えて。
0343名前は開発中のものです。2013/10/08(火) 16:01:33.64ID:kP7Tf/iB
まぁ奇怪なコードを書きたくなるという性癖は割とありがちなので
(じゃなきゃIOCCCなんて生まれない)
気持ちはわからないでも
0344名前は開発中のものです。2013/10/08(火) 22:12:57.72ID:1rDNRsOY
たしか前スレだったか
シングルトン使いまくりという自由人がいたような記憶があるが
あーいうのもオブジェクト指向的には奇怪な部類に入るだろうか
0345名前は開発中のものです。2013/10/08(火) 23:19:06.01ID:+doHVCff
ゲームなんざ細かいこと気にする必要なんかねえよ
どうせたかだが数万行の糞コードだろ
多少設計が糞でも力技でねじ伏せられるレベルだろ
少なくとも設計が悪いせいで開発が頓挫するほどのことじゃない
細かいこと気にしてる前にどんどん手を動かせ
ゲームなんかmain関数一本のグローバル変数使いまくりでも何の問題もない
0346名前は開発中のものです。2013/10/08(火) 23:25:16.39ID:DeWA7nCL
>>345
個人レベルなら本当にこれだけど、チームでやってるときにそれやられると死ぬ
あと、キャラクタークラスとかは流石に分けないときつくないか
0347名前は開発中のものです。2013/10/09(水) 10:24:14.87ID:0BIVR7NU
あまりクソ設計にするとバグだらけになったりコードに触る気が無くなって頓挫するぞ!!
0348名前は開発中のものです。2013/10/09(水) 11:20:48.07ID:zMZY/uoD
>>346
>個人レベルなら本当にこれだけど、チームでやってるときにそれやられると死ぬ

全くその通りだよな。
俺はグローバル変数使いまくりのベターCプログラミングでゲーム数本作ってるけど、”プログラミングできる”という箔が全く付かない。
だって一人で、しかも小規模なゲームしか作れないから、他に応用ができん。
0349名前は開発中のものです。2013/10/09(水) 11:41:28.47ID:DCwXNpaa
クラス化すると変数管理楽だよ
Cチックだとしても機能ごとに構造体くらい使おう
0350名前は開発中のものです。2013/10/09(水) 11:44:12.15ID:ONTF7nFn
自分一人で作るにしても、次回作の時に使い回しが面倒だろ。
0351名前は開発中のものです。2013/10/09(水) 11:48:30.84ID:688aoXIv
本当に入門者初心者レベルが多いってよくわかる流れだった
0352名前は開発中のものです。2013/10/09(水) 12:01:17.37ID:vmXjWz4J
お題がクソコードですし
0353名前は開発中のものです。2013/10/09(水) 12:24:14.08ID:Qp6WgDlk
>>348
グローバル変数の使用はあまりおすすめしませんね
(おすすめしないだけで使ってはいけないルールはないが)

C言語ゲーム開発の章
http://c-games.main.jp/

ここでC言語及びC++のゲームプログラミング解説サイトを運営している者です
よかったら参考にしてみてください
0354名前は開発中のものです。2013/10/09(水) 12:32:08.06ID:TDiILPQM
3Dゲームで、距離が離れるとSE音量が変わるのってどつやってるんだろう
SE再生する関数に、自キャラからSE発生した場所の距離を取得して音量変えればいいのかな
0355名前は開発中のものです。2013/10/09(水) 12:36:24.84ID:IFQ9aDF8
>>345
N88-BASIC(+ハンドアセンブル)あがりとしては、その心意気は買うけどさ
心情的には理解できなくもないけどさ

>ゲームなんかmain関数一本のグローバル変数使いまくりでも何の問題もない

ネタにマジレスすまんが、それは可能だけど、何の問題もないというのは
痩せ我慢しすぎだよな。構造化の恩恵くらいは素直に享受していいのよ・・・

かつてのN88-BASIC使いにとっては、構造体、関数、ローカル変数、とかは
垂涎ものの新要素で、TrueBasicの構造化プログラミングの世界は極楽だった

構造化プログラミング機能が齎す恩恵は、OOP機能のそれに比べれば癖がなく
万人に手放しでオススメできるかと
0356名前は開発中のものです。2013/10/09(水) 12:45:33.56ID:i/IGCw7u
>>353
kazukiェ…
0357名前は開発中のものです。2013/10/09(水) 14:21:49.49ID:IFQ9aDF8
>>354
X3DAudioは相対位置情報による簡易な3D音響やってくれるよ。
Windows以外ならOpenAL-Soft+ALUREあたりかな。同じような機能

そこらの有名どころの3Dゲームエンジンの類もみんなこういう機能を
サポートしてるから、昨今ではそっちの使い方の情報のほうが多いん
じゃないかな
0358名前は開発中のものです。2013/10/09(水) 14:26:55.31ID:dWkCs9KT
>>354
http://ja.wikipedia.org/wiki/DirectSound
より引用

>誤解されやすいが、DirectSound 3Dの3D音源は、エコー、リバーブ等の環境音を模倣するエフェクトと、
>リスナーの位置と音源(モノラル)の位置関係を簡易に計算するライブラリが主体である。
>やっていることは、旧来、ステレオPCM音源のパンとボリュームを自前で調整することで、
>擬似的に音源の位置(音像)を表現していたが、これをライブラリとして吸収しただけである。
>したがって、実際の空気中を伝播する音の物理そのものを、シミュレートして計算しているわけではなく、
>遮蔽や反射などは考慮されていない。

らしいから、基本的な考え方はそれでOKっぽい
0359名前は開発中のものです。2013/10/09(水) 19:23:49.39ID:zbVDi/wn
>>357
>>358
横レスだけど
考えたことも無かったけどすげぇちょっとやってみたくなったわ
0360名前は開発中のものです。2013/10/09(水) 19:44:59.71ID:JeIpUTuA
オブジェクト指向って自分でやろうとすると設計ムズいんだよなー
C++は多重継承できるから多少は誤魔化しは効くけど
IDEによるバックアップ(委譲のメソッドを自動でコーディングしてくれるとか)か、
Rubyのmixin的な言語仕様がないとコード書くのもめんどいめんどい。

ただ既存のライブラリ使う分には、CのままよりもC++のオブジェクト指向で
ラップしてくれてる方が使いやすいよね、SDLは疲れた
0361名前は開発中のものです。2013/10/09(水) 20:25:05.46ID:688aoXIv
>>360
多重継承云々でちょっと引っ掛かった。
もしもそれが純粋仮想(ようするにインタフェース)を念頭に置いた話なら良いんだが、
そうでない場合、個人的には密結より粗結を中心に考えたいよなと思った。コンポジッションが設計の主体って言うか。
当たり前な話なので、もしも前者の意図だったらスルーよろしく、
0362名前は開発中のものです。2013/10/09(水) 21:02:48.13ID:JeIpUTuA
>>361
んにゃ、ご指摘の通り。差分プログラミング目的だから後者のつもりだったよ

全てのクラスにおいて、インターフェースとその実現クラスに分けてるなら、
多重継承よりも、インターフェースの多重実装と包含→委譲の方がスマートだと思うけど
IDEでサポートされてないとその委譲のコーディングすらめんどいって言いたかった
0363名前は開発中のものです。2013/10/09(水) 21:19:46.43ID:688aoXIv
>>362
あぁごめんそういう事か。設計観点じゃなくて、コーディング時の作業か。
インテリセンス(コードアシスト)で候補出てくれない件。そういう事なら確かに。
0364名前は開発中のものです。2013/10/09(水) 21:22:40.26ID:688aoXIv
コードアシストじゃなくて定義へのジャンプ。言葉ミス。
風邪引いて熱でふらふらしてるわ俺いま
0365名前は開発中のものです。2013/10/09(水) 21:38:37.22ID:JeIpUTuA
>>363
いや、俺の方が未熟でごめんなさい
実装のコーディングがめんどくさくなるようであれば
設計の失敗みたいに思ってました
0366名前は開発中のものです。2013/10/09(水) 23:06:39.48ID:zbVDi/wn
UDP通信について訊きたいんですが
sendtoって何バイトまで送信できるんですか
サーバー側で送信するときに114バイトは送信できて、115バイト以上は送信しないんです
でもクライアント側だと255バイトを送信できてるんです
ただ、送信してるかどうかの確認を受信できてるかどうかで見てるだけなんでもしかしたら受信側がおかしい可能性も否定できません

どうなんでしょうか?
0367名前は開発中のものです。2013/10/10(木) 00:00:01.89ID:f3Vh5Ks+
65535からヘッダを引いたサイズ
0368名前は開発中のものです。2013/10/10(木) 16:47:47.10ID:qSZJbcGZ
サイズをchar やunsigned charで指定してるのか?
0369名前は開発中のものです。2013/10/10(木) 22:09:25.49ID:JQlRWjR0
>>366
それがもし本当に間違いなく起きてるなら、かなり環境(経路)依存の話なのかな

エラーハンドリングの結果を貼ってみては。こういうやり取りを参考にしてさ

http://stackoverflow.com/questions/11809727/sendto-returns-values-greater-than-mtu-on-sock-dgram-udp-socket
0370名前は開発中のものです。2013/10/10(木) 22:11:15.13ID:XFDkBfXE
>>368
サイズはstring型変数.size()で指定してます

すいませんが解決しました
送信の回数を減らすと普通にサイズがでかくてもできていたので大量に送信すると送信量を受信しきる前に内部的にバッファオーバーフローか何かで受信ができなかったのだと思います。
0371名前は開発中のものです。2013/10/10(木) 22:12:09.28ID:XFDkBfXE
>>369
ありがとうございます
0372名前は開発中のものです。2013/10/11(金) 00:39:57.34ID:+9JMgRHw
>>357
ありがとそんな便利そうなものが…
0373名前は開発中のものです。2013/10/11(金) 12:22:49.72ID:q9N4a2GE
フレームレートを算出しようと思っているのですが
main() {
DWORD time;
for(int i=0; i<10000000; i++) {
timeBeginPeriod(1);
time = timeGetTime();
timeEndPeriod(1);
printf("%d\n" time);
}
}

このコードでは15ms位の精度になってしまいます、ただ、timeEndPriod(1)を使わない場合は1ms精度で取れます
この2つ(時間の取得を合わせたら3つ)はセットで使うべきだと思っていたのですが、そうではないのでしょうか
0374名前は開発中のものです。2013/10/11(金) 12:35:27.83ID:q9N4a2GE
ちょっとソースを変えて
int main() {
DWORD start, end;
timeBeginPeriod(1);
start = timeGetTime();
for(int i=0; i<1000000000; i++) {
end = timeGetTime();
if(start < end) {
printf("%d回目 %d\n", i, start);
start = end;
}
}
timeEndPeriod(1)
}

こうした場合最初に2回(397575回目 2800264、865774回目 2800279、877500回目 2800295)が15msの精度で変わるのですが、何故かわかりますか
0375名前は開発中のものです。2013/10/11(金) 12:40:11.45ID:9U+dIMTQ
お前は標準出力が消費する時間を考えたことはあるか?
0376名前は開発中のものです。2013/10/11(金) 13:38:53.06ID:PqVYCTa6
>>374
そのままのソースで試しにやってみたけど、ちゃんと1ms精度でカウントしてるみたいよ
53877回目 73604548
99144回目 73604549
139853回目 73604550

環境は、Windows7x64、VS10、release build、最適化無効(/Od)
0377名前は開発中のものです。2013/10/13(日) 10:17:50.56ID:6LVEM9O1
「ゲーム内状態の更新(時間の経過)」と「描画」のFPSの話なんですが
現在は講座サイトに従って、
・更新の後に描画を行う
・更新が16ミリ秒内に終わらなかったら、そのフレームの描画をスキップして、即座に次フレームへ
・描画が16ミリ秒内に終わったら、16ミリ秒経過するまでsleepした後に次フレームへ
というメインループを組んでます

で、自分はこのやり方のことをてっきり「固定フレームレート」だとばかり思ってたんだけど
垂直同期に合わせるのではなく、sleepを入れて時間で調整するなら、言葉で説明するとしたら
「可変フレームレート」と説明したほうが正しいのでしょうか?
更に言えば描画をスキップするんで「フレームスキップ方式の可変フレームレート」でしょうか
0378名前は開発中のものです。2013/10/13(日) 14:07:49.91ID:gZmH5HfH
何でこのスレで質問したのか知らんが

固定ってのは、更新タイミングが固定って意味だろう
16msという間隔で固定されてるんだから固定フレームレート

可変フレームレートってのは
http://web.archive.org/web/20100722081346/http://spitfire.client.jp/program/fps.html
ここでいうところのA宗のことを指す
0379名前は開発中のものです。2013/10/13(日) 14:43:29.22ID:6LVEM9O1
>>378
なるほど・・・拝見したところ、どうも考え方の前提の次元からしてズレてるようでした

俺の前提は、描画はオマケであって、例えフレームスキップされまくって10FPSしか出てないような状況でも、
キー入力は60FPSで受け付けてゲーム内を正しく更新することを目的としています。

つまり、フレームスキップが連続で起きているときは、それが解消されて次に画面が描画されるまでは
現在見えている画面とゲーム内のデータが食い違っているということが平然と起こります

参考サイトですと、いかに画面上の見た目とゲーム内の情報を同期するか、という話のようですね
0380名前は開発中のものです。2013/10/13(日) 15:57:59.53ID:YUP9zYJg
それをA宗というのだが・・・
0381名前は開発中のものです。2013/10/13(日) 19:19:38.49ID:X8of/PMe
フレームスキップは、どっちかっていうと固定フレームレート側のテクニックじゃないか?
0382名前は開発中のものです。2013/10/13(日) 19:47:44.35ID:jZYJu2f5
>>377
常に60FPSを目指すのが固定フレームレート(上限が定められている)
(コンピュータの能力が足りない場合、20FPSや30FPSなどFPSが小さくなる場合がある。60FPSより大きくはならない)

常に全力でFPSを増やそうとするのが可変フレームレート(上限が定められていない)
(コンピュータの能力が高ければ高いほどFPSは大きくなる。高性能だと150FPS、低性能だと7FPSなど)

ここでいう固定や可変は描画フレームレートの事。内部フレームレートは関係ない。
固定や可変っていうのは上限が定められているかどうかの意味。
0383名前は開発中のものです。2013/10/13(日) 20:16:06.80ID:6LVEM9O1
>>380-382
みんなありがとうございます

根本的な潜入観があったみたいです
マルチスレッドというものを全く意識していませんでした
0384名前は開発中のものです。2013/10/13(日) 20:23:02.86ID:LrrmUogo
モニタのリフレッシュレート以上に描画処理を回しても意味ないんだが
0385名前は開発中のものです。2013/10/13(日) 20:28:08.87ID:YUP9zYJg
>>384
VSYNCに同期してるならね
0386名前は開発中のものです。2013/10/13(日) 20:58:38.68ID:LrrmUogo
VSYNCに同期してなくても意味ない
リフレッシュレートが60だとして描画処理が1秒に180回回ってるとしたら
画面に表示されないグラフィックの描画処理が無駄に走ってることになる
描画は別スレッドにしてVSYNC同期で問題ない
0387名前は開発中のものです。2013/10/13(日) 21:12:00.51ID:YUP9zYJg
それ同期してるじゃん
0388名前は開発中のものです。2013/10/13(日) 21:41:53.14ID:vCxPl4Ox
お前ら話噛み合ってないな
0389名前は開発中のものです。2013/10/13(日) 22:17:46.54ID:ZaPY3z08
ワロタ
0390名前は開発中のものです。2013/10/13(日) 22:23:38.42ID:CojupSXd
非同期なんだよ
0391名前は開発中のものです。2013/10/13(日) 22:56:03.24ID:sU9FZP/8
大体お前らモニタのハードがどういう仕組みで画面に映像表示してるのかちゃんと理解してるのか?
そこの前提ぼやっとしたまま聞きかじりの単語だけで話して無いか?
0392名前は開発中のものです。2013/10/13(日) 23:10:39.75ID:LrrmUogo
描画処理をリフレッシュレート以上走らすことに意味あるのか
0393名前は開発中のものです。2013/10/14(月) 00:46:43.39ID:oyCSEsA5
ティアリングが発生するかわりに反応速度が速くなる。
>>386の条件だと、非同期だと画面VSYNC中だろうと反映されるので、1/3ずつ重なって描画しているが、
同期の場合はVSYNCを待つので最大1/60秒遅れる。
0394名前は開発中のものです。2013/10/14(月) 02:18:15.78ID:FmafERBv
ちらつき怖い
0395名前は開発中のものです。2013/10/14(月) 09:52:13.67ID:8QY3sUz1
2dアクションで人の前でボタン押したらセリフ出そうとしてるんだけど、テキストの内容でどうやって読み込んでます?ソースにべた書き?csvファイルとかを読む?
0396名前は開発中のものです。2013/10/14(月) 10:01:17.72ID:S89Kd2Q2
テキストべた読みでもいいしスクリプト言語に頼ってもいい
csvでスクリプト言語っぽい事をしてもいい
■ このスレッドは過去ログ倉庫に格納されています