Windowsゲームプログラミング 質問スレ
■ このスレッドは過去ログ倉庫に格納されています
0001うゆ ◆vvvK3Fcqdg
2008/11/06(木) 21:28:45ID:lNn2skuQ【 回答してくださる方 】
・ できるだけ優しく質問に答えてあげてください。
・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。
「ググれ」以外の回答でおながいします。
・ 神ですら理解不能な質問は無視して下さい。
【 質問する香具師 】
・ どんな事で躓いているのか明確にしる。
・ 長くならないなら躓いている部分のコードを晒してみれ。
・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書け。
0768名前は開発中のものです。
2011/06/26(日) 02:36:36.47ID:C/6aPfwcFPSが安定しないので
もうウェイト処理にSleep(0)だけ入れる事にした ヽ(`Д´)ノ
Sleep()の仕様で、引数に与えた値以上、戻ってこない事があるらしいから
それが原因なのかな…
0769名前は開発中のものです。
2011/06/26(日) 08:11:41.37ID:Fm5IE/R1キーワードを入れて検索する程度のことすら出来ない怠け者にはプログラムは向いてないよ。
0770名前は開発中のものです。
2011/06/26(日) 08:26:23.84ID:C/6aPfwc>それを使えばSleep()しなくてもCPUに高負荷がかかりませんか?
すみません、この上記の質問だけ教えてもらえませんか?
Yes/No?
0771名前は開発中のものです。
2011/06/26(日) 09:04:29.33ID:Fm5IE/R1やった上で、疑問に思ったことを聞くならともかく、
すぐに実験できることをやろうともしない人間にこれ以上答えることはない。
0772名前は開発中のものです。
2011/06/26(日) 09:35:10.81ID:C/6aPfwcすんませんす。
timeSetEvent()で指定してコールバックで
処理するという形になるんですね。
なるほど。
ただSleep()も試行錯誤してたら
引数の数値を大きく指定するようにすれば
そこそこの精度で安定するようにはなりました。
0773名前は開発中のものです。
2011/06/26(日) 10:20:15.53ID:h26G+E5Yttp://dixq.net/rp/43.html
ここは既知?
自分の場合、垂直同期切り忘れとか実行中にクラスの生成と解放をしてたとかあったな…
0774名前は開発中のものです。
2011/06/26(日) 10:54:34.44ID:C/6aPfwcご紹介ありがとうございます。
ただSleep()さえかけなければ
実際にはパフォーマンスカウンタを使うので
60fpsの誤差は殆どないんです。
ただCPU使用率が100%近くになったりしてたので
なるべく余った時間、CPU負荷をかけたくなく
Sleep()入れて休ませるつもりでいました。
とりあえずSleep()でも、なるべく大きな値を入れるようにしたら
fpsが安定するようになりました。
いくつかのPCで試しましたが、結構安定してます。
(パフォーマンスカウンタで計測すれば、殆ど60ピッタリです)
while(1){
stime = timeGetTime();
game_main();
if((dif = 1000 / 60 - (timeGetTime() - stime)) > 0){
Sleep(floor(dif));
}
while(timeGetTime() - stime < 1000 / 60){ Sleep(0); }
}
0775名前は開発中のものです。
2011/06/26(日) 10:59:23.35ID:U4EFMTMz今は違うんだっけ。
0776名前は開発中のものです。
2011/06/26(日) 12:33:06.53ID:B5xxb33H厳密に言うとメインスレッドでSleepは使ってはダメ。
Sleep中はメッセージ処理が行えないから、ブロードキャストメッセージを使用している
他のアプリケーションのパフォーマンスに影響あったりする。
FPS調整用の短いSleepならほとんど問題ないけど、余裕があればSleepのかわりに
MsgWaitForMultipleObjectsを使った方がいい。
>>775
昔から、明文化はされてないけどSleepの元になるタイマーはtimeBeginPeriodの
影響を受けて精度が変わる。何も設定してないと10ms精度くらい。
0777名前は開発中のものです。
2011/06/26(日) 12:38:17.18ID:C/6aPfwcMsgWaitForMultipleObjects ですね。
調べてみます。情報ありがとうございます^^
0778名前は開発中のものです。
2011/06/26(日) 13:34:56.21ID:Fm5IE/R1コールバックじゃなくてイベントと書いているんだが。
0779名前は開発中のものです。
2011/06/26(日) 13:55:56.88ID:h26G+E5Yそこまで気にかけるならもう回答教えてあげてもいいんじゃないのw
0780名前は開発中のものです。
2011/06/26(日) 14:04:02.65ID:h26G+E5Y小数点以下の話ならごめん(^_^;)
{
t = timeGetTime();
game_main();
while(timeGetTime() - t < 17)
{ Sleep(0); }
}
0781名前は開発中のものです。
2011/06/26(日) 19:28:33.67ID:EEDTFaxzそれだとCPU使用率が下がらない。
0782名前は開発中のものです。
2011/06/26(日) 20:31:02.39ID:h26G+E5Y0783名前は開発中のものです。
2011/06/26(日) 21:04:13.27ID:C/6aPfwcウィンドウズのイベントがコールバックで呼び出されるという話じゃないの??
0784名前は開発中のものです。
2011/06/26(日) 21:49:54.06ID:Fm5IE/R1ちゃんとヘルプを読め。
使うのはイベントオブジェクトであって、コールバックじゃない。
0785名前は開発中のものです。
2011/06/27(月) 02:04:43.20ID:mjTrT8bwイベントオブジェクトの設定もあるんですね^^;
みなさんありがとうございます。
とりあえず今回は、>>774の方法を中心に調整して行きたいと思います。
FPSの安定とCPU使用率を抑える事が大分両立出来ました。
0786名前は開発中のものです。
2011/06/27(月) 13:05:38.66ID:5jj8qo/eSleep()するとスレッド スイッチするんじゃないの
でもって10msだか何だか戻ってこないでしょ?
だから10ms以下のSleepは保障できないのでは・・・
0787名前は開発中のものです。
2011/06/27(月) 15:37:59.15ID:KSejmRDb0788名前は開発中のものです。
2011/07/27(水) 18:19:20.32ID:rtDjJBOt0789名前は開発中のものです。
2011/07/27(水) 20:08:07.17ID:d+vft6M6という冗談はおいておいて、見てのとおりC/C++かと。
0790名前は開発中のものです。
2011/08/05(金) 02:02:20.66ID:iQzPAYN5必要な時にオープンして用が済んだらクローズするのがファイルを扱う基本だと思うのですが
ゲームデータ全て、または画像毎や音声毎などにまとめたパックファイルを利用する場合、
何度も同じファイルにアクセスすることになると思うのですが、例えばゲーム中ずっとオープンしっ放しで利用しても良いものでしょうか?
それともやはりデータにアクセスする度にオープン→クローズするべきなのでしょうか?
0791名前は開発中のものです。
2011/08/05(金) 04:03:33.45ID:LUnU1i9G読み込みアクセスしかしてないなら、クローズなんて気にする必要ない。
0792名前は開発中のものです。
2011/08/05(金) 21:10:30.95ID:2OzNzc7rhttp://raicho.2ch.net/test/read.cgi/newsplus/1312544716/
0793アジェグ4倍 ◆4xAJeG.COM
2011/08/15(月) 12:14:45.95ID:pL1hbMOkCreateWindowsの後のループは、GetMessageのままのほうがいい。
で、WM_CREATEのイベントのときに、60FPSでループするスレッドを作る。
スレッドのループは、何らかのフラグで抜けるようにして、
WM_DESTROYのイベント時に、そのフラグをセットさせるってとこだな。
キーとマウスのイベントは、フラグのセットなどだけにとどめて
すぐにイベント処理を終わらせること。
あと、Sleepと画面反映の順序を間違えないように。
計算して裏画面に描画して、Sleepで時間を調整してから反映、だぞ。
・・・と、イロイロ書いてみたが、理解してもらえるだろうか・・・
0794アジェグ4倍 ◆4xAJeG.COM
2011/08/15(月) 13:26:29.82ID:pL1hbMOkソースレベルでイロイロ書いてるみたいだから、
おれのやり方も書いてみよう。
DWORD StartTick = timeGetTime() ;
DWORD NowTick ;
DWORD NextTick ;
bool SkipFlg = false ;
for( int LoopCnt = 1 ; ExitFlg == false ; LoopCnt++ ) {
// 計算処理
if( SkipFlg == false ) {
// 描画処理
}
SkipFlg = false ;
NextTick = ( LoopCnt * 1000 ) / 60 ;
NowTick = timeGetTime() - StartTick ;
if( NowTick < NextTick ) {
Sleep( NextTick - NowTick ) ;
// 画面反映処理
}
else {
// フレームスキップが必要
SkipFlg = true ;
}
}
こんな感じかな。
0795名前は開発中のものです。
2011/08/15(月) 13:40:49.56ID:cTd0dgcsそれ6月の話題だし、素晴らしいコードを披露するならともかく
今更unsignedとsignedの区別もついてないようなコード貼られても困る。
0796アジェグ4倍 ◆4xAJeG.COM
2011/08/15(月) 13:53:07.65ID:pL1hbMOkはいはい。
というわけで、くれぐれもマネをしないように。
著作権の問題とか発生しかねないからねぇ。
0797名前は開発中のものです。
2011/08/15(月) 15:59:55.34ID:71G/E+750798名前は開発中のものです。
2011/08/15(月) 16:15:04.32ID:cxMX6aDk0799アジェグ4倍 ◆4xAJeG.COM
2011/08/15(月) 16:38:36.57ID:pL1hbMOk糞コテみたら、まずはググレカすことを覚えろよ。
0800名前は開発中のものです。
2011/08/15(月) 16:40:46.38ID:726htfBM0801アジェグ4倍 ◆4xAJeG.COM
2011/08/15(月) 16:44:14.52ID:pL1hbMOk悪いことは言わん、今のうちにあぼーん登録しておくがよい。
0802名前は開発中のものです。
2011/08/15(月) 20:09:42.78ID:WSvdh9Hqそこで自棄を起こして荒らし行為なんてせずに、おとなしく引き下がる事を望む。
0803アジェグ4倍 ◆4xAJeG.COM
2011/08/16(火) 08:37:55.17ID:t616+10I過疎スレで、おれが来るまで10日も放置してたのに、
おれが来たとたん、タチマチこんなに集まっちゃってさ。
sageりゃいいってもんじゃねーんだぞ。
ほんとはうれしいんだろ?
寂しかったこのスレに、大物コテが現れてくれて。
ちなみにおれは、↓のようなMIDIアプリを開発している糞コテさ。
いまは、イロイロな機能追加を進めててね。
http://www2.ocn.ne.jp/~j3262il6/rds/
このソフト、ソースも公開してるけど、くれぐれもパクったり
参考にしたりしないように。
容赦なく、timeGetTimeとかやっちゃってるからね。
0804名前は開発中のものです。
2011/08/16(火) 21:09:07.25ID:3+35ODV/0805名前は開発中のものです。
2011/08/17(水) 00:02:27.51ID:FbzsBwEqパケット投げるのには手軽で便利だよ。
clock()よりは早く投げられるし。
0806名前は開発中のものです。
2011/08/17(水) 02:21:39.99ID:H/5FPjKZ0807アジェグ4倍 ◆4xAJeG.COM
2011/08/17(水) 09:06:45.15ID:4BdszuWf強いて言えば、このクソコテが使ってるからだろう。
ホカの手段としては、QueryPerformanceCounterてのがあるようだが、
おれが試してみた限りでは、timeGetTimeと挙動に大差はなかったねぇ。
そうなるともう、アルゴリズムの問題だな。
上の方では、Sleep(0)などとも言ってるけど、
待ち時間が1ミリ秒を切るようなら、それはすでに処理オーバーだから、
フレームスキップの処理などを考えないと。
0808名前は開発中のものです。
2011/08/25(木) 21:01:01.31ID:L1verjXw
こんにちは。初めてですがよろしくお願いします。
使用文法はcです。
今回おかしいなと思ったのはキャラクターが動かないというバグです。
使用している構造体は
unit_status[k].unit_member[i].xxx
となっていて、kがグループ(つまり味方か敵かなど)、iはその中での番号です。
kが1の時は敵、0の時は味方というかんじです。
(プレイヤーに割り当てられた構造体はkが0,iが0です。ループ中に遭遇した場合はスキップされます。)
敵はしっかり動きますが、味方がうんともすんとも言いません。どうしたらいいのでしょうか?

void unit_ai_base_main(){
for(int k=0;k<UNIT_STATUS_MAX;k++){//動かすグループ
for(int i=0;i<UNIT_NUMBER_MAX;i++){//そのグループのmemberを動かすためのループ
if(k==0&&i==0)break;//プレイヤーだった場合ブレイク
testtest++;
if(unit_status[k].unit_member[i].life>0){//仲間が死んでたり居なかったりしたときの分岐
// aiの分岐。
}
}
}
}
コードをはっつける良い場所ないですかね・・・
0811名前は開発中のものです。
2011/08/30(火) 17:19:22.22ID:84vu7iX6
(´・ω・`)あぁ・・
0813名前は開発中のものです。
2011/08/30(火) 19:08:06.33ID:NWN85EFfm9(^Д^)プギャー
0814名前は開発中のものです。
2011/09/08(木) 18:29:05.58ID:Oef4cD8Uとかどうだろう
0815名前は開発中のものです。
2011/09/23(金) 20:05:36.80ID:8vj2FBxM普通入門書終えたら読めるようになるのでしょうか?ワンクッションおけるような書籍があれば
教えてください。(DXライブラリは使わないものでお願いします)
0816名前は開発中のものです。
2011/09/23(金) 20:12:31.42ID:BbPCTDgWCとかC++の入門書を終えたレベルじゃあれを理解するのは無理だよ。
あの本はある程度、ゲーム作製の経験のある人間でも難解だったりする。
絶版になってるけど古本なら1000円で買えるし
http://www.amazon.co.jp/dp/4797325453
これでも買っておけば?
Windowsのゲームプログラミングの初歩の初歩が学べるよ?
0817名前は開発中のものです。
2011/09/23(金) 20:21:43.07ID:Unh+z/jyサンプル解説の初級本なら、これでいいんじゃね、
0818名前は開発中のものです。
2011/11/29(火) 11:00:43.66ID:E9cixHcQcodepadは最近遅くなってきたからこっちも試してみて
http://ideone.com/
■ このスレッドは過去ログ倉庫に格納されています