2章.処理性能(画面書き換えの限界速度)
1999.7.26

高性能なグラフィックボードを積んでいるのに、秒間フレーム数(1秒間に画面を書き換える回数。TVゲーム等で「秒間60フレーム」とか歌い文句にしているあれです。)が上がらないという事を悩んでいる方はおられないでしょうか?
高性能なグラフィックボードを使えば、三角形なら1秒間に数十〜数百万個は表示できるはずなのに「たった1個の三角形を表示しているだけなのに、1秒間に80回しか画面の更新ができない」というような現象です。

同条件のプログラムを載せますので動かしてみてください。左上に1秒間に画面の書き換えた回数を表示します。(少し時間を置くと数字が平均化してきます)(ESCで終了)


//画面設定
CH1=G@SETUP(640,480,16,2)                  //要素4=3でウイント゛ウモート゛を3Dで使用

//アンビエント光源を配置
LT1=G3@LIGHTMAKE(0,65536,65536,65536)      //要素1は光源種別、要素2〜4は光源の各RGB色(但し,ウイント゛ウモート゛は白黒のみ)
G3@ADD(LT1,0)                              //光源を配置

//メッシュの作成
MS=G3@MESHMAKE( )                          //メッシュを作成
G3@VERTEXADD( MS ,  0  , -0.5, 10.0 )      //頂点0を追加
G3@VERTEXADD( MS , -0.5,  0.5, 10.0 )      //頂点1を追加
G3@VERTEXADD( MS ,  0.5,  0.5, 10.0 )      //頂点2を追加
G3@FACEADD3(  MS ,  0  ,  1  ,  2   )      //ポイントを組み合わせてポリゴンを登録

//フレームの作成
FM=G3@FRMMAKE()                            //フレームを作成
G3@ADD(MS,FM)                              //メッシュをフレームに登録
G3@ADD(FM,0)                               //フレームを画面に配置
G3@FRMSETPOS(FM,-12000,-12000,65536)       //フレームの位置を設定
G3@FRMSETROTAUTO(FM,0,0,65536)
G3@FRMSETCOLOR(FM,65536,0,0)

TM = SYSTIME( )
LOOP    
  G@CHRCLEAR( CH1 )
  G3@RENDER()                              //3D描画
  G@PRINT( CH1 , 0 , 0 , STR(CN/(((SYSTIME()-TM)/1000)+1)))
  G@FLIP()                                 //画面切り替え
  CN = CN + 1
ENDLOOP


3D対応のグラフックボードを積んでいても60〜200程度の数字しか出ないはずです。
次に三角形の数を10倍の10個に増やしてみます。ちなみに赤いところが三角形の数の指定です。


//画面設定
CH1=G@SETUP(640,480,16,2)                  //要素4=3でウイント゛ウモート゛を3Dで使用

//アンビエント光源を配置
LT1=G3@LIGHTMAKE(0,65536,65536,65536)      //要素1は光源種別、要素2〜4は光源の各RGB色(但し,ウイント゛ウモート゛は白黒のみ)
G3@ADD(LT1,0)                              //光源を配置

//メッシュの作成
MS=G3@MESHMAKE( )                          //メッシュを作成
G3@VERTEXADD( MS ,  0  , -0.5, 10.0 )      //頂点0を追加
G3@VERTEXADD( MS , -0.5,  0.5, 10.0 )      //頂点1を追加
G3@VERTEXADD( MS ,  0.5,  0.5, 10.0 )      //頂点2を追加
G3@FACEADD3(  MS ,  0  ,  1  ,  2   )      //ポイントを組み合わせてポリゴンを登録

//フレームの作成
FOR I = 1 TO 10
  FM=G3@FRMMAKE()                                //フレームを作成
  G3@ADD(MS,FM)                                  //メッシュをフレームに登録
  G3@ADD(FM,0)                                   //フレームを画面に配置
  X = RAND()*10-163840 
  Y = RAND()*10-163840 
  Z = RAND()*10+65536
  G3@FRMSETPOS(FM,X,Y,Z) //フレームの位置を設定
  G3@FRMSETROTAUTO(FM,0,0,65536)
  G3@FRMSETCOLOR(FM,RAND(),RAND(),RAND())
NEXT

TM = SYSTIME( )
LOOP    
  G@CHRCLEAR( CH1 )
  G3@RENDER()                              //3D描画
  G@PRINT( CH1 , 0 , 0 , STR(CN/(((SYSTIME()-TM)/1000)+1)))
  G@FLIP()                                 //画面切り替え
  CN = CN + 1
ENDLOOP


どうです、画面の書き換えか回数に変化はありましたか?
ほとんどの環境では回数に変化はないはずです。「10倍の仕事をさせているのだから画面の書き換え回数は10分の1に減るはず」と思われるかもしれませんが、そうではありません。

では、なぜ画面の書き換え回数に変化が無いのでしょう。実は書き換え回数が少ないのは、グラフィックボードの描画速度に問題があるわけではなく、モニターのリフレッシュレートに依存しているのです。
モニターは全画面を1秒間に数十回の速度で書き換えを行っています。アニメーションや映画は少しずつ異なる画像を高速に交換しながら表示する事で止まっている絵が動いて見えるように、同じ原理でモニターも高速に画面を書き換えているのです。この時の画面の書き換えを「リフレッシュ」といい、書き換えの回数を「リフレッシュレート」といいます。

描画した画像を画面に表示するにはG@FLIP関数を使用しますが、同関数はリフレッシュのタイミングと同期を取っており、リフレッシュが終わるまで、G@FLIP関数の次へプログラムは進みません。ですから、どう頑張ってもモニターの書き換え数以上のプログラムを作る事はできないのです。
ちなみに、リフレッシュレートの指定は、「コントロールパネル」の「ディスプレイの設定」ダイアログにある「リフレッシュレート」で行います。

ただし、Window画面表示モードでは、リフレッシュレートの束縛なしに画面の書き換えを行えるので、リフレッシュレート以上の性能を出す事があるそうです。しかし、Window画面表示モードを使うと、ほとんどのグラフィックボードは、ハードウェアでの描画は行わず、CPUで描画を行うので、高速なCPUを載せていない限り、性能は落ちます。