現在この問題の解決度は80%です。
【ソース】
!変数宣言は必要
WAITTIMEとは整数=0;
GET_SYSTEMTIMEとは整数=0;
FRAME_COUNTERとは整数=0;
FRAME_AVEとは配列=0;
FRAME_SUMとは実数=0;
SYSTEMTIMEとは整数=0 ;
SPENDTIMEとは整数=0;
VAL_WAITTIMEとは整数=0;
●FPS固定({値渡し}NUM)
もし、(FRAME_COUNTER==NUM)ならば、
FRAME_SUM=0;
(NUM)回
FRAME_SUM=FRAME_SUM+FRAME_AVE[回数];
ここまで
FRAME_SUM=FRAME_SUM/NUM;
FRAME_SUM=1000/FRAME_SUM
FRAME_COUNTER=0;
SPENDTIME=システム時間-SYSTEMTIME//掛けた時間
もし、(SPENDTIME<(1000/NUM))ならば、
(0)秒待つ
((SYSTEMTIME+1000/NUM)>=(システム時間))間
待機時間
ここまで
FRAME_AVE[FRAME_COUNTER]=timeGetTime()-SYSTEMTIME //ループバックしてくるまでにかかった
時間
SYSTEMTIME=timeGetTime();
FRAME_COUNTER=FRAME_COUNTER+1;
●timeGetTime() =DLL("WINMM.dll","DWORD timeGetTime(VOID)")
●待機時間
50回
VAL_WAITTIME=VAL_WAITTIME+1
VAL_WAITTIME=0
#ここまで
timeGetTime()はなでしこのシステム時間と全く同じ精度です。
待機時間という関数ではただひたすら無駄な足し算をして時間を潰します。
ところが、これには大きな問題があります。
足し算でも引き算でもどちらでもいいのですが、この計算には非常にマシンのスペックの差が出てきます。
CPUのクロック数とも強い関係があるため、ネットブックの様なライト向けのPCでは全く動作しません。
基本的に100回を1msec程度に扱いたいと思っていたのですが、ネットブックで一回の計算の評価をしたところ5msec程掛かっていました。
これは何かの間違いだとは思いますが、使用するマシンのスペックによって全く違う結果が得られるという重大な欠陥を抱えています。
しかも浮動小数点演算を含まない四則演算でこの速度の違いは頭を抱えざるを得ません。
また付随して描画速度や、描画スレッドの遅延による描画漏らし等ゲームを作る上で深刻な悩みを数多く抱えています。
このような問題点に関するアプローチが散見されないのは、過去に先人がそうした問題を丸投げしてきたからです。
あのJavaも最初は遅すぎると言われていたくらいですから、なでしこも然りです。
Tatumakiは速度向上、効率化構想を磨き上げなでしこでもゲームプログラミングができるということを証明します。
それにすこしばかりご協力ください。
尚、上記のFPS固定関数では必ず待機時間を500μsec~1msecに予め収まるように調整してからお使いください。