- 1 名前:名前は開発中のものです。 [2009/03/31(火) 01:14:36 ID:IgyJcgap]
- Cを習得した程度のスキルでも、
GUIのゲームを比較的容易に作成する事を可能にする、 「DXライブラリ」に関するスレッドです。 DXライブラリの詳細ついては homepage2.nifty.com/natupaji/DxLib/ を参照して頂きたい。 DXライブラリに関するテクニックなどの情報交換などを行う事で、 多くのDXライブラリユーザのスキルの向上に役立てたら幸いです。 過去スレ:DXライブラリ 総合スレッド pc11.2ch.net/test/read.cgi/gamedev/1197468399/ DXライブラリ 総合スレッド 2008 pc11.2ch.net/test/read.cgi/gamedev/1224923873/
- 464 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 08:51:37 ID:mvp6g5dM]
- 歩行絵+右足踏み出し絵と左踏み出し絵を描けばいいだけじゃね?
- 465 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 09:09:09 ID:q6YxOHAd]
- while(ProcessMessage()!=-1){
ClearDrawScreen(); if(count<20) 右足が前に出てるキャラ表示 if(count>=20&&count<40)左足が前に出てるキャラ表示 ScreenFlip(); WaitTimer(10); count++; if(count==40)count=0; } うーんよくわからん
- 466 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 09:54:16 ID:1CAlzcIC]
- >465
基本的な考え方はそれでいいと思うよ。 あとせっかく答えてくれた>460の答えも読んどいた方がいいんじゃね?
- 467 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 10:06:16 ID:yTy6SiIo]
- >>465
基準FPS値決めて、フレーム数と秒が変換できるようにしてみるといい あとWaitTimer(10)とかいうのはジョークだよね?w
- 468 名前:466 mailto:sage [2009/06/16(火) 10:16:47 ID:1CAlzcIC]
- とりあえず>466の日本語がおかしいってのはスルーしてくれると嬉しい。
>>467 おや、見逃してたw もしかして>463(俺)の発言を勘違いしちゃったのかな……? だとしたらちょっと責任感が。
- 469 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 12:57:31 ID:zt3Tshey]
- >>467
たぶんWaitTimer等の関数を使わないと高速足踏みに見えると感じて、 こういう手段で自然に見えるようにしたんじゃないかな。 一秒でひとつの動作をループさせる必要はないからこれはあまり良くないと思うけど。
- 470 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 13:19:46 ID:1CAlzcIC]
- >469
count値20ごとに表示を変えてるみたいだし、それは大丈夫なんじゃないかしら?
- 471 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 14:04:12 ID:KbLsp5Ay]
- ScreenFlipで垂直同期信号待ちが行われているかどうかで変わってくるような。
- 472 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 14:17:30 ID:MjcTUWQv]
- WaitTimer使う位なら count<20 の値を増やした方がよくね
- 473 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 16:03:45 ID:rewLOGjy]
- 時分割で状態変移したいのなら、コルーチン使ってみては?
と上級者ぶってみるわ
- 474 名前:459 mailto:sage [2009/06/16(火) 18:26:00 ID:qN6akUYZ]
- いろいろ意見ありがとう。
WaitやSleepは使わずにFPSとかFrameやらを使って試行錯誤してみます。 countを0と1でオンオフにしてたけど>>465のようにフレームカウントにしてやってみます。
- 475 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 18:35:39 ID:1CAlzcIC]
- 別人だったんか!
- 476 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 23:35:34 ID:8GILQKQT]
- リフレッシュレートの概念がわからないと変なの書いちゃうぞ
レートは60ヘルツかも100ヘルツかもしれないし 65とか75とか微妙な数値になることもある DXライブラリの教本にあるように書かないと、動作環境が変わった時に同じように動く保証がない 俺が以前に見た酷い例 FPSが60切ると点数がどんどん減る意味不明なゲーム しかもどんなアルゴリズムか知らんが、FPS60でも点数が減りっぱなし ああいう「自分の環境しか見ない」人間は駄目だな
- 477 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 23:40:46 ID:fYBFrBfu]
- ゲーム機のゲームってその辺固定だからなにも考えなくていいんだよなー。
- 478 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 23:56:34 ID:1CAlzcIC]
- >>476
と言っても、個人レベルの開発でどこまで他の環境を考えられるやら。 定番のアルゴリズムとかは書けるかもしれないけど、それだけじゃ意味ないし。 結局のところ「知らね」って言いきるしかできない。
- 479 名前:名前は開発中のものです。 mailto:sage [2009/06/16(火) 23:59:57 ID:+nd9Tj3k]
- 俺今作ってるゲームはリフレッシュレート無視しちゃってる。
ティアリングが気になるんだよなぁ。 他人が作ったゲームは60FPS超えるやつとかあるけど ティアリングあまり気にならないんだよな。どうやってんだろ。
- 480 名前:名前は開発中のものです。 [2009/06/17(水) 00:27:22 ID:gsrBiXQc]
- >>469
WaitTimer(10); 入れるとCPU使用率が下がる ただそれだけw
- 481 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 00:32:32 ID:s0zhQi6M]
- >>479
君みたいな人が駄目らしいよ 自分の環境しか見ない人間は駄目なんだってさ ていうかさ、FPSが60切ると点数がどんどん下がるゲームかどうか ソースもアルゴリズムも考えずにどうやって判別したのかねwプッw 偉いなぁこの人wプレイしただけでバグの原因分かっちゃうって>>476は神だねwプッw
- 482 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 03:56:59 ID:moXGEW/H]
- 環境を合わせる方法としては
1,Sleepを使ってFPSを30ほどに落としてやる。 2,時間と同期をとる。 くらいしか思いつかない。
- 483 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 07:52:50 ID:zFwmddUq]
- 関係ないけど、テクスチャに描画する場合ってZバッファ効かないんだね
- 484 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 08:55:08 ID:Sg+3JQO3]
- リフレッシュレートをAPIを使ってある固定値に設定する
- 485 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 15:01:39 ID:v4ECr6VG]
- セガの新人教育の本の人いわく、
作りやすいのは固定フレーム、性能を活かしやすいのは可変フレーム。 自分は面倒なので、60固定前提でやってるんだが (1)タイマ(ミリ秒)を取得して1フレームの規定時間(16msec)が過ぎるまで待つ (2)モニタのVSYNCを待つ (3)モニタのリフレッシュレートを変更する の3パターン用意して、あとはユーザに適当に選んでもらおうかなと。 まずいかな?
- 486 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 18:17:49 ID:V4BAg+VP]
- ScreenFlip使えばFPS保たれるんじゃないの
- 487 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 18:47:03 ID:A2Hqv0+b]
- >ScreenFlip使えばFPS保たれるんじゃないの
・環境(グラボの設定)によっては垂直同期信号待ちがOFFになってる場合があるのでFPSは保たれない。 ・垂直同期信号待ちがONだとして、FPS保てる状態でも、 モニタのリフレッシュレートを60にしてたり70にしてたりってのはユーザーの好き好きなので、 作り手の望んだとおりのFPSになってくれるとは限らない。
- 488 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 20:28:42 ID:00woQzQy]
- めんどくさいからゲーム機のゲーム作ろうぜ
- 489 名前:名前は開発中のものです。 mailto:sage [2009/06/17(水) 20:53:25 ID:00woQzQy]
- www.gbadev.org/
www.pqrs.org/tekezo/gba/index.html.ja omoshiro-joho.com/tech-center/cgi-bin/wiki/index.php?Linux%A4%C7GBA%A5%B2%A1%BC%A5%E0%B3%AB%C8%AF nocash.emubase.de/gbatek.htm belogic.com/gba/directsound.shtml
- 490 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 01:52:47 ID:lg5GVuaj]
- >>481は得点表示も見れないようです
- 491 名前:名前は開発中のものです。 [2009/06/18(木) 04:16:26 ID:eqFlz8O1]
- 勝手にリフレッシュレート60に切り替える命令とかあればいいのに
- 492 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 04:54:12 ID:U/ILN7Qk]
- >>491
一応あるっしょ。
- 493 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 05:03:47 ID:4gTcdCic]
- 別に少々速度違ってもいいじゃない
- 494 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 05:07:59 ID:U/ILN7Qk]
- >493
アクションゲームのゲーム速度2割アップとか結構きついですぜ
- 495 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 07:25:22 ID:8Inai5Jq]
- DXライブラリ3Dってどうなったの?
開発中止?
- 496 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 09:48:52 ID:obCaTvEe]
- 60FPSのゲームを70FPSとか、とんでもないぜw
- 497 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 16:23:14 ID:FAWLSPyh]
- たまに弾幕シューティングが75FPSになったりするけど、
気づくのはいつもしばらくプレイしてからだった
- 498 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 16:53:46 ID:U/ILN7Qk]
- >497
気付かぬうちに難易度が上がってたり、タイミングが変わってミスを誘発させたりするって ちょっと怖いよな。
- 499 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 17:10:57 ID:4gTcdCic]
- 一般的に表示上のFPSが上がるとゲーム速度も上がるものなの?
ってことは2次元アクションでいえば1フレーム毎の移動量が固定なのか。 自分自身も楽だからそういう作り方をしているけど… 例えばあるゲームで 60FPSだと重いのでコンフィグで30FPSに変更って場合は ゲーム速度そのものは変わらないものだと思っていた。
- 500 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 17:35:08 ID:u8KJWVMz]
- >>499
時間で処理、描画だけFPSで更新なら変わらないよ。 全体をFPS60処理だと60より上に上がらないようにしてるのが一般的かなぁ。 ツールで簡単に上げれたり、処理間に合わないとFPS下がって全体の速度も低下する。
- 501 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 17:56:28 ID:U/ILN7Qk]
- >499
フレームではなく時間単位で処理してるなら ゲーム速度云々の話題にすらならんと思うよ。
- 502 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 21:48:15 ID:3XyNBKLr]
- しかし時間単位で処理すると確実にティアリングが発生するので画質面で劣るという
- 503 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 21:57:55 ID:y4gPpvjp]
- そんなの関係なくバッドノウハウ使わない限り起きるだろw
- 504 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 22:12:42 ID:4gTcdCic]
- 発想を逆転させるんだ
ユーザーをゲームに合わしちまえばいいんだ
- 505 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 23:01:35 ID:7QIAxIr+]
- まともにゲーム作ったことある人手あげて〜?
- 506 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 23:19:36 ID:cOrVzTjy]
- >>502
違うんじゃない? モニタのリフレッシュレートが60だろうが70だろうが時間単位で処理するからこそ スピード一定でティアリングも発生しないようにできるんでしょ。 垂直同期信号が切ってあるなら、そもそもティアリングは発生してあたりまえだろうし。
- 507 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 23:47:20 ID:3XyNBKLr]
- モニタの画面更新のタイミングを無視してメモリ上の画面データを書き換えると言うことだから
1画面分のデータの構築途中でそのメモリイメージが画面に表示されて画面上部と下部でフレームがずれるということだから ティアリングが発生するということじゃないの
- 508 名前:名前は開発中のものです。 mailto:sage [2009/06/18(木) 23:58:10 ID:cOrVzTjy]
- 「モニタの画面更新のタイミングを無視する」なら、時間単位で処理する意味ないでしょ?
なぜ時間単位で処理する必要があるかって言ったら、 垂直同期信号待ちをして、ティアリングを起こさないようにしたいけど、 ユーザーのモニタのリフレシュレートが60なのか70なのかが判らない、からでしょ?
- 509 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 00:03:49 ID:Wkij18nv]
- 間違えた。逆だった。
実際の画面の更新途中でメモリ上の画面データが更新された場合に、描画済み画素と未描画画素でフレームがずれるためティアリングが発生する、だった。 要するにAPIでリフレッシュレートを60に設定して60前提で作ればよい。60に対応してないモニタを使ってるやつのことは知らない。
- 510 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 00:08:11 ID:AlkmRsbh]
- なんか「時間単位で処理」と「フレーム単位で処理」の認識が逆になってる気がするw
- 511 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 00:12:38 ID:s7w0uGNM]
- >509
FPS指定APIは過信してはいけない 上のほうにあるようにドライバ側の設定が優先される
- 512 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 00:22:34 ID:Wkij18nv]
- じゃあPC環境は糞
- 513 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 00:47:10 ID:pN8o6lEn]
- >509
「60以外は知らん」と言いきっちゃうのも、それはそれでアリな気がする
- 514 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 02:05:59 ID:7uKPrG8o]
- 最近は液晶が殆どだしそれもありだな
- 515 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 03:38:42 ID:AlkmRsbh]
- 液晶がどう関係するのか。
- 516 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 08:04:02 ID:huFKHnzQ]
- 一般的な普及価格帯のやつは選択肢が60Hzや59Hzしかない
- 517 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 09:00:27 ID:Dq7L9OoN]
- >>516
20世紀へお帰り下さい
- 518 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 09:40:02 ID:4AnMu6gm]
- 自己中心的なハード理論を押し付けるもんじゃない
動作環境をテキストに書いたら、それを満たすあらゆる環境で同じように動いてもらわないと困る デフォルトで不具合が出る可能性があるなら、設定で変えられるようにしなきゃ駄目 なるべくたくさんの環境でテストするのも大事
- 519 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 12:28:29 ID:8D0wDPEb]
- 難しいことしなくても、垂直同期かウェイトかはオプションで選べようにすれば問題ないだろ
- 520 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 12:57:07 ID:ciGq9GNb]
- 全くその通りだと思うんだが、
そういう選択式になってるゲームってほとんどみないよな? 普通はどうやってんだろ、ってのが話題の焦点じゃないかな。
- 521 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 15:25:14 ID:pN8o6lEn]
- >>517
実際、60Hz固定のモニタも多いんじゃね?
- 522 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 16:07:46 ID:L4Ogxl+D]
- 他に話題ねーのかよ
飽きた
- 523 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 16:47:37 ID:8D0wDPEb]
- 何か話したい話題があるなら自分から振れと
- 524 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 23:33:13 ID:Dq7L9OoN]
- >>521
だから帰れってww
- 525 名前:名前は開発中のものです。 mailto:sage [2009/06/19(金) 23:50:46 ID:L4Ogxl+D]
- んー
じゃぁDxLibの今後 俺はもう少し発展してくれてもいいと思う、3Dを強化して欲しいね
- 526 名前:名前は開発中のものです。 mailto:sage [2009/06/20(土) 00:41:17 ID:ynTX3CaL]
- 無理じゃね
3D強化するなら作り直しレベルだろ
- 527 名前:名前は開発中のものです。 mailto:sage [2009/06/20(土) 00:42:51 ID:FZJG9pXN]
- デスクリムゾンレベルなら作れるw
- 528 名前:名前は開発中のものです。 mailto:sage [2009/06/20(土) 00:53:36 ID:gQS8hglY]
- 上からくるぞっ!気をつけろ!
- 529 名前:名前は開発中のものです。 mailto:sage [2009/06/20(土) 01:03:05 ID:X3CDDO5o]
- >>526
いま3D機能作ってるって公式掲示板で言ってたけど・・・ 意外とみんなチェックしてないんだな
- 530 名前:名前は開発中のものです。 mailto:sage [2009/06/20(土) 01:08:17 ID:ppcvkMn4]
- >>529
なん…だと?
- 531 名前:名前は開発中のものです。 mailto:sage [2009/06/20(土) 01:49:27 ID:FZJG9pXN]
- 俺のクリムゾンは下からくる設定で作るわ
- 532 名前:名前は開発中のものです。 mailto:sage [2009/06/20(土) 02:34:40 ID:gQS8hglY]
- せっかくだから俺はこの赤い扉を選ぶぜ!!
- 533 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 02:15:20 ID:dtFx8GuN]
- Platinumっていうマップエディタで、15*20マスのマップを作って
csv形式で出力して、読み込んで描画したいんだけど上手くいきません #include "DxLib.h" int WINAPI... { if( DxLib_Init() == -1 ) return -1 ; int mapchip[256]; char mapdata[15][20]; int filehandle; LoadDivGraph("a.bmp",256,16,16,16,16,mapchip); f = FileRead_open("a.csv"); FileRead_gets(mapdata,num,filehandle); このあとfor文でFileRead_getsで読み込んだ1行を15回くりかえして mapchipに入れていきたいんだけど・・・ FileRead_getsのnumに何を入れていいのかが??状態。 リファレンス読んでもメモリ領域のサイズて書いてあるけど・・・ 日本語おかしくてスマン
- 534 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 02:35:09 ID:ffHKmVPn]
- numはメモリ領域のサイズってリファレンスに書いてあるじゃん。
てか、a.csvの内容はどんな感じになってんの?
- 535 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 02:48:44 ID:aQAsxkjf]
- >>533
int mapdata[15][20],mapwidth= 0, mapheight= 0, mapchipwidth, mapchipheight, bitcount; int filehandle; char buf[1024]; filehandle = FileRead_open("a.csv"); if (filehandle==0){エラー処理} int gyoucount = 0,retucount = 0, iVal,layercount; while((FileRead_eof(filehandle) == 0)&&( gyoucount < mapheight+1 )) { FileRead_gets(buf, 1023, filehandle); if (gyoucount == 0){ sscanf_s(buf, "%d,%d,%d,%d,%d,%d", &mapwidth, &mapheight, &mapchipwidth, &mapchipheight, &layercount, &bitcount); }else{ while(retucount<mapwidth){ char *next_token; if (retucount==0){ iVal=atoi(strtok_s(buf, ",",&next_token)); }else{ iVal=atoi(strtok_s(NULL, ",",&next_token)); } mapdata[gyoucount-1][retucount] = iVal; retucount++; }} gyoucount++; retucount = 0; } FileRead_close(filehandle); if( ( gyoucount != mapheight+1 ) || ( retucount != 0 ) ){エラー処理}
- 536 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 02:49:49 ID:dtFx8GuN]
- 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 3 3 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 3 3 0 0 0 0 1 1 1 1 1 1 1 0 0 0 0 0 3 3 3 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 0 2 2 0 0 0 0 2 2 2 2 2 2 0 0 0 0 3 3 0 2 2 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 2 2 2 2 0 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0が草原で1が川で2が森で3が山です 1行ずつ読み込んでchar chip[ ][ ]に入れて その番号をint型の数字に変換してmapchip[ ]で描画させたいんですが・・orz ごめん、メモリ領域のサイズってどうやって調べるの?
- 537 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 04:17:54 ID:jkwbtsZu]
- コーディングしたのはおまいさんだろ?
- 538 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 08:29:25 ID:vb/GsENJ]
- FileRead_gets(mapdata,sizeof(mapdata),filehandle);
- 539 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 09:37:49 ID:SurdRKYg]
- >>507
遅れたけど正確にはダブルバッファリングしてるからティアリングはおきないよ。 データの構築中に画面に表示される事は無い。 あと垂直同期を待ちつつタイマーで調整する事も可能。 具体的にはタイマーでfpsを調整すれば、ゲームが基準にするのはタイマーじゃなく、 一定間隔が保障されてるフレームを基準にすればおk
- 540 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 13:35:35 ID:QJhUeuVR]
- マップの縦横が固定長なら
ifstream+For2重ループで読み込んでしまえば良い 都合のいいことに半角スペース無視ってくれるからね c++知らなければスルーしてよし
- 541 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 13:59:11 ID:E25maqZD]
- 垂直同期を待つってことは動作速度がリフレッシュレート固定になるってことじゃないの?
最期の2行の意味をくわしく。
- 542 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 14:24:01 ID:ZO5ct3aw]
- 可変レートの場合、
60の時は、前回の1/60秒後の世界を描くし50の時は1/50秒後の世界を描くんだろう。
- 543 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 14:40:01 ID:/SjwP+Lm]
- ググってると公式サイトのリファレンスに載ってない関数が時々出てくるんですけど、
そういうのが載ってる詳細なリファレンスは無いんですか?
- 544 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 15:01:10 ID:E25maqZD]
- 擬似コードでいいからプログラムで説明してくんない?
下記に追記する形で。 while(1){ main_loop(); flip(); }
- 545 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 15:55:05 ID:gvSWV/Tl]
- 1秒間に100ドット移動させたい時。
: ScreelFlip() 時間計測A(ミリ秒) : ScreenFlip() 時間計測B(ミリ秒) : 移動距離算出 100 * ( B-A ) / 1000 : ScreenFlip() 時間計測〜 って感じ?
- 546 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 17:22:04 ID:nC5CYBlY]
- ぼくのイメージではこんなだけど合ってる?
垂直同期が取れるなら while(1){ main_loop(); sleep until 垂直同期60hz; flip(); } 取れないなら A = GetTickCount(); while(1){ main_loop(); B = GetTickCount(); sleep(17 - ((B - A) % 17)); //1tick = 0.001秒, 17tick = 1/60秒と仮定 flip(); A = B; } ただ、こうするとsleepしてる時間が無駄だから…
- 547 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 17:24:40 ID:nC5CYBlY]
- 無駄を減らすために
main_loop()の処理時間が十分に短いなら A = GetTickCount(); while(1){ do { main_loop(); B = GetTickCount(); } while (B-A < 17); flip(); A = B; } あるいはタイマーを使うか… A = GetTickCount(); while(1){ main_loop(); B = GetTickCount(); SetTimer(17 - ((B - A) % 17), flip()); A = B; } それとも描画と計算は別スレッドにするか…
- 548 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 20:10:23 ID:SurdRKYg]
- >>541
そうとは限らないよ。 まずfps制限と描画を完全にわけて考える。 fps制限は60に設定したとする。 int nowtime = GetNowCount(); static int oldtime = 0; static int frametime = 1000 / 60; int diftime = nowtime - oldtime; while(1) { if(diftime >= frametime) { oldtime = nowtime; break; } else { Sleep(1); nowtime = GetNowCount(); diftime = nowtime - oldtime; } } これで垂直同期しようがしまいが60で固定された。 1ループで1フレーム1/60秒が保障されたので、1秒で100ドットキャラを進ませたいのなら、60フレームで100ドット進ませればおk 5秒後に何かをしたいときも、5秒をタイマーで計測するんじゃなくて300フレーム後に行えばおk だから>>539で「ゲームが基準にするのはタイマーじゃなく、一定間隔が保障されてるフレームを基準にすればおk」と書いた。 ただ、これだとスペック不足によって60fpsが出ない場合や、リフレッシュレートが60以外でかつ垂直同期を待った場合中途半端な同期によって60fpsが出ない場合(これは垂直同期を待たない事で解決出来る)、 フレームがゲームスピードの基準になっているのでゲームスピードが遅くなってしまう。(処理落ち) これはこれでおkならそのままでいいが、ゲームスピードだけは死守するのならフレームスキップ(コマ落ち)が必要になる。 この方法も色々あるので今回は割愛。
- 549 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 20:20:31 ID:E25maqZD]
- 結局ティアリング発生するじゃん
- 550 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 20:27:19 ID:SurdRKYg]
- せっかく説明したのになにその全然読んでないようなレスは。
ティアリングの話がしたいの? >垂直同期を待つってことは動作速度がリフレッシュレート固定になるってことじゃないの? これを解決したいの? どっちなの? てか548を読んで解決出来なかったの? 質問しといてなんなの。
- 551 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 20:38:53 ID:E25maqZD]
- ティアリングを発生させずにどんなリフレッシュレートのモニタでも同じ処理速度で動作させる方法があるかを聞いてる。
- 552 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 20:52:15 ID:dtFx8GuN]
- 14歳からのゲームプログラミング読めよ
書いてあるよ
- 553 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 20:52:45 ID:n8mlBebR]
- >>551
>>539に書いてあんじゃん SurdRKYgがかわいそすぎる、援護するぜ んでぐぐったらすぐにわかりやすいのでてきたぞ ちょっとは自分で調べろ ttp://spitfire.client.jp/program/fps.html
- 554 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 20:55:52 ID:dtFx8GuN]
- 馬の耳に念仏だろうがな
- 555 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 21:15:08 ID:E25maqZD]
- なるほど。
リフレッシュレートをAPIで固定する、か リフレッシュレートを何らかの方法で取得して、1フレームの移動量をリフレッシュレートに合わせて変更する しかないわけか。
- 556 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 21:26:14 ID:nqKSgOSf]
- >>555
何が「なるほど」なんだか・・・ 548をどう読めば 「リフレッシュレートを何らかの方法で取得して、1フレームの移動量をリフレッシュレートに合わせて変更する 」 の説明になるんだよ 読む気がないなら質問なんてするな
- 557 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 21:33:30 ID:E25maqZD]
- >>548は垂直同期を待たない事で解決出来るとか言ってるから話にならないじゃん
ダブルバッファリングしてるからティアリングはおきないとか言ってるし。
- 558 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 21:41:05 ID:OYxJ3LRg]
- ダブルバッファリングとティアリングは関係ないよな。
垂直同期信号待ちしないと、裏画面と表画面切り替える瞬間にモニタ画面更新される事もあるから結局ティアリングは発生する。
- 559 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 21:59:20 ID:SurdRKYg]
- >>557
垂直同期を待たない事で解決出来るのは60fpsにならない場合の話だから下5行は読まなくていいよ。 しかもコマ落ちさせれば同期待ちでも解決出来るって書いてあるのに…。 120Hzのモニタで同期待ちするけど60fpsに制限すればゲーム速度も一定になるでしょ? 1フレームの移動量を変更するんじゃなく、移動量をフレームに合わせれば常に一定でしょ? >>558 flipする時はコピーするんじゃなくてVRAMの参照先を変えるだけだから、VRAM上のデータを書き換え途中って事は無いと思うけど。 だからどの瞬間においても描画途中で画面更新される事は無いと思うんだけど違うのかな? もちろんこれはティアリングの厳密な意味でのことなので、広義の意味の 画面のちらつき=ティアリング として使われる事についてはそれでいいけど。
- 560 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 22:03:54 ID:nqKSgOSf]
- >>559
残念だけど垂直同期を待たない場合はビデオカードがモニタに映像を送信している間でも 参照先のVRAMアドレスを変えてしまうからティアリングは発生する
- 561 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 22:08:13 ID:OYxJ3LRg]
- >>559
DXライブラリで裏画面への描きこみ、ScreenFlipってほとんどデフォだよね? これが君のいうダブルバッファリングでしょ? ScreenFlipの垂直同期信号待ちをOFFにして、 タイマーだけでスピード固定するようにして、フルスクリーンで動かしてごらん。 ティアリング一目瞭然だから。
- 562 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 22:11:13 ID:SurdRKYg]
- >>560
そうなんだ。どうもありがとう。 同期しない事によるちらつきは画面更新部分と非更新部分の時間がばらばらな事による現象かと思ってた。 モニタのVsync信号の方が偉くて、そのタイミングでflipした時は次のVRAMの更新先を強制的に参照するみたいな認識でいいのかな。
- 563 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 22:16:46 ID:SurdRKYg]
- >>561
ややや、ちらつくのは一目瞭然だけど、ティアリング(=上半分表画面で下半分裏画面のような状態)かどうかっていのは人間の目では判別不可能でしょ。 そのちらつきの原因は、更新部分と更新して無い部分の時間差によるものだと思ってた。 例えば背景が流れる画面の場合、1場面を■、次の場面を□とした場合、 ■□■□■□■□■□ と見えればちらつかないが、 ■■□■□□□■■□ のように見えるとちらついてみえると思うんだ。 でも>>560のレスで、ティアリング自体も起きているとのことなので一応解決出来た。 これはもうちょっと自力で調べてみようと思う。
- 564 名前:名前は開発中のものです。 mailto:sage [2009/06/21(日) 22:23:40 ID:OYxJ3LRg]
- 「垂直同期信号待ち」ってのは要するに画面が全部描き終わるまで待つって事だから。
描き終わって、次の画面が描き始められるまでの一瞬の間にVRAMのアドレスを切り替える、って事だね。 そうする事で初めてティアリングを防げる。 >>563 ちらつくというより画面が波打つ、と言った方がよかったかな。 >ティアリング(=上半分表画面で下半分裏画面のような状態)かどうかっていのは人間の目では判別不可能でしょ。 ぴったりには合わないとは言え、だいたい60FPSで固定しようとしてスピード調整してるわけだから ズレが生じるのも大体画面更新の同じタイミングになるわけ。 当然、人間の目にもはっきり判るよ。
|

|