投稿
ぷちぷち PetitPetit3q
プチコンでゲームを作るには、VSYNCの使い方が重要です。 実際にはおまじないコードとしてメインループ内に1回入れるだけですが、VSYNCは意外とわかりにくく、わかっていても説明しずらいため、わかりやすいように図にしてみました。
28そうだね
プレイ済み
返信[1]
親投稿
ちんた k.hikari118
わたしもよくわからずに入れていました。わかりやすい解説ありがとうございます。数字の所を2にすると、メインループを2周してから画面に反映するわけですか?
0そうだね
プレイ済み
返信[2]
親投稿
ぷちぷち PetitPetit3q
VSYNCとは(Vertical SYNChronizing signal)垂直同期信号なので、3DSの画面を書き換えるタイミングを意味します。 プチコン3号では 「VSYNC 1」でVSYNCの1回分の間隔(1/60秒)、 「VSYNC 2」でVSYNCの2回分の間隔(1/30秒)に合うように待機します。 画面の表示自体はBASICの命令にかかわらず、常に1/60秒ごとに更新されます。 ここで言うメインループとは、BASICプログラム側でのゲームの進行に対するループを意味します。 また、プチコンのBUTTON()命令は、実行された瞬間(フレーム)でのボタンの状態を取得しますので、 VSYNC 2以上やWAITで待機すると快適にボタン操作を行えなくなる場合があるため、快適なアクションゲームを作りたい場合は、VSYNCやWAITでゲームのスピードを調整することはお勧めしません。
0そうだね
プレイ済み
返信[3]
親投稿
bread kaltouami1211
ありがとうございます♪
0そうだね
プレイ済み
返信[4]
親投稿
MIKI ifconfig
画面を更新するには一定の時間がかかると思いますが、 vsync から帰ってくるのは、更新開始の瞬間ですかそれとも更新終了の瞬間ですか? それとぷちぷちさんとゴキちゃまZさんはご親族ですか?
0そうだね
プレイ済み
返信[5]
親投稿
ぷちぷち PetitPetit3q
私もそこまでプチコンに詳しい訳ではないですが、 プチコンは全て1/60秒単位で動作するようです。(おちゃめさんも言っている)プチコンはそれよりも小さい時間は存在しないと思います。更新時間は1/60秒以内で行われているので、VSYNCの戻り時間はあまり関係ないと思います。 ごきちゃまZさんとはリアルで面識があるわけではありませんよ
0そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
ん、それだと a=b b=c だけで2/60秒かかることになっちゃいませんか? 内部では数メガHzで中間コードインタプリタが動いているはずです。 あまり詳しくないけど、一般には書き終わったときが VSYNC みたいですが、SmileBasic だとどうなのかなあと・・・ 他人の空似でしたか! 失礼申し上げました!!
0そうだね
プレイ済み
返信[7]
親投稿
まあ基本VSYNC 1(もしくは数値は省略)でメインループを作って、速度を変更するときは内部でカウンタを使うなどした方がいいって感じですかね〜。 WAITはその名の通り、全ての動きを一定時間止めたいときに使う(ループのタイミングじゃなくて)方がいいと思いますが、プチコンではVSYNC 1もWAIT 1も実は同じ動作、みたいな話を聞いたこともあるんでどっちでも問題ないんでしょうが、メインループだったらVSYNCの方が名前と目的が合っていてスッキリする感じがしてます。
1そうだね
プレイ済み
返信[8]
親投稿
おちゃめ ochame_nako
みき★さんへ 私が調べた限りだとVSYNC終了時には画面更新は終了しているみたいですね。(ver.3.0.0では違っている) あとぷちぷちさんが言われている1/60秒単位での動作というのは入出力系の関数はすべて値がVSYNCのタイミングで値が更新がされているということです。 BUTTONだけではなくSTICK、TOUCH、ACCEL、GYROなどがすべて当てはまる(MIC命令は例外)ので60fps以外で動作しているゲームは正常動作できない場合があります。 でんぺんさんへ メインループにおいてVSYNC 1とWAIT 1はほぼ同じ動作になりますが、それは60fpsで処理落ちなく動作している場合に限られます。 わずかでも処理落ちしている場合はWAIT 1はそこからさらに1フレームのウェイトが入り、VSYNC 1だとすでに前回から1フレーム経過しているためウェイトは入りません。
0そうだね
プレイ済み
返信[9]
親投稿
れい rei-nntnd
ぷちぷち氏は馬でとゴキちゃまZ氏はGなので顔が似てるのは収斂進化ではないかと。 この手のタイミングを作る時の常識、画面更新のタイミングを測定した結果、NDSのハード周りの解析結果から プチコンのVSYNCはVBlankの開始のタイミング、つまり画面更新終了のタイミングで戻ってくると思われる。 1画面更新すると、内部で割り込みがかかり、MAINCNTが1つ増え、BUTTON()が更新され、START/STOPボタンが押されてないか確認された後、「VSYNC 1」で待ってるプロセスが解放される。 レンダラは割り込み発呼後、数ライン分無駄スキャンした後、画面左上からレンダリングを開始する。 そんな感じ。
2そうだね
プレイ済み
返信[10]
親投稿
れい rei-nntnd
誰もつっこんでないから一応つっこんでおくと、 プチプチ氏の説明の2、 「VSYNCまでは何を命令しても画面に反映されない」ってのは間違い。 画面はプログラムの実行とは独立に左上から右下へ描画してる。 この描画周期が約60Hz。 プログラムから画面更新すると、最大で1/60=16.7msecほど遅れて表示されるというだけ。 画面の更新とプログラムによる更新と重なるとテアリングと呼ばれるずれが生じるのがわかる。
0そうだね
プレイ済み
返信[11]
親投稿
ちんた k.hikari118
なんだかアタマがこんがらがってきましたから、深く考えるのはもっと上達してからにします。
0そうだね
プレイ済み
返信[12]
親投稿
bread kaltouami1211
ぷちぷちさんとは全く関係無いです。 ぷちぷちさんはどう見ても我らGとは違いますよ。
0そうだね
プレイ済み