okiami1983のブログ

クオリティーが低い記事はあとで書き直します。。

プチコン3号 VSYNCの効果

  • プチコン3号にVSYNCという命令がある。
  • VSYNC命令を呼び出すと、つぎの1/60secのタイミングまで待つ。
  • 画面更新のタイミングが1/60secごとなので、1/60ごとに画面を更新するために使う命令。

と書かれているけど、よくわからないのでプログラムを作って動作を考察した。

 

 

作るもの:VSYNCの効果を確かめるために作るプログラム

  • 無限ループのなかで、MAINCNT*1の値を画面に表示させる。
    ループが1回が実行されるたびにMAINCNTの値がコンソールに表示されます。
  • 無限ループ中にVSYNCを入れた時と入れなかったときでタイマのカウント値を比較。

     

作ったプログラム:VSYNCあり

f:id:okiami1983:20150816111054j:plain 

実行結果:VSYNCあり

f:id:okiami1983:20150816111105j:plain

  • 無限ループの最後でVSYNCがあり、このVSYNCで次の1/60secまで待機する。
  • 次の1/60secがきたら、VSYNCを抜けて次のループが実行される。
  • 結果、画面に表示されるMAINCNTの値は1ずつ増える。

 

作ったプログラム:VSYNCなし

f:id:okiami1983:20150816111042j:plain 

実行結果:VSYNCなし 

f:id:okiami1983:20150816111026j:plain

  • 無限ループの最後にVSYNCがないので、ループはどこにも待ち時間が発生せずできる限り高速にくるくる回る。
  • 1/60secの間に何回もループが回るので、画面にMAINCNTの値が同じ値で何回も表示される。

 

まとめ

  • ループの中でVSYNC使わなかった場合は、画面に出ているだけで27回くらい表示されてますね。。
    つまり、1/60secのなかで少なくとも27回はループが実行されています。
  • ループの中でVSYNCを使った場合は、1/60secで1回だけループが実行されています。
  • New Nintendo 3DSと旧Nintendo 3DSは載っているCPUが違うので、VSYNCを使わずにループ処理した場合はNewの方がループ回数が多くなります。VSYNCを使えばどちらもきっちり1/60ごとに処理を実行させることができます。

 

*1:プチコン起動してから1/60secタイミングの発生回数をカウントしているシステム変数