※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

Tonyuの処理速度について



測定環境

OS       	: WindowsXP
Tonyuのバージョン	: 1.21
CPU       	: Athron64 3400+ 800MHz(2.4GHzをクロックダウン)
グラフィックカード	: 高性能


オブジェクトの実行負荷

オブジェクトを生成した場合の実行負荷
(オブジェクトの実行に要する時間をSpriteの値を基底に正規化したもの)
(値の大きいものほど負荷が高い)

オブジェクト 負荷
Sprite 1.0
Dx_基本 1.8
Dx_ScaleX=2 3.3
Dx_半透明 2.8
Text_半角 4.4
Text_全角 3.1
Panel_50*50 2.8
Panel_100*100 5.9
Panel_200*200 13.3
Secret 0.5

<負荷の算出式>
 負荷 = 1 / ( [そのオブジェクトのFPS] / ["Sprite"のFPS] )
但し、FPSは"Sprite"のFPSが60以下になるよう、オブジェクト数を増やして測定している

  • 各々”Char”を省略している
  • TextCharの項目分けは、表示するテキストの種類
 (左から、テキスト無し、半角英数字1文字、同2文字、全角1文字)
  • PanelCharの項目分けは、パネルのサイズ
memo
  • 表示されるオブジェクトは、その大きさに比して負荷が重くなる
  • オブジェクトが画面内に表示されていない場合、負荷は軽くなる
 (ex.alpha=0、座標が画面外、などの場合)
  • 測定環境により、値は大きく変わる可能性がある(未確認)



命令の処理時間

命令の実行にかかる負荷。
(命令の実行に要する時間を演算命令の値を基底に正規化したもの)

 命令 負荷
for 2.1
while 2.1
if 0.8
演算命令 1.0
a=a+b; 1.5
a++; 1.0
a+b (文字列結合) 9.0
a; 0.5
関数呼び出し 1.3
print("@") 881.3
drawText("@") 62.8
drawText("@") 49.7
drawLine_長さ10 10.4
drawLine_長さ100 10.8
fillRect_50×50 13.4
fillRect_100×100 16.9
fillRect_200×200 36.8
$panel.drawText("@") 199.0
$panel.fillRect_100×100 83.9
Array.get() 2.5
Array.set(1) 2.9
Array.set("@") 21.7
str.split() 30555.5
copyRect_50×50 40.5
copyRect_100×100 129.6
copyRect_200×200 494.8
fw.writeLn("@") 57.9
fr.readLn() 46.3
valueOf("1") 61.1
valueOf("1.0") 12.9

"@"は全角
"@"は半角
演算命令には、”算術演算”、”論理演算”、”代入”が含まれる。
算術演算の例 : a+b;
論理演算の例 : a&&b;
代入の例   : a=b;

<負荷の算出式>
 負荷 = [ その命令の実行時間 ] / [ "演算命令"の実行時間 ]

memo
  • 実際にかかる時間が知りたい場合は、演算命令の実行時間を測定し、表の値にそれを掛ければよい
  • split()は異常に重い(演算命令の実に3万倍!)。使用時は注意されたし。



FPS算出式(暫定)

FPS = 1/([命令の実行時間の合計]*10+[オブジェクトの実行時間の合計])
(時間の単位は秒)
(命令の実行時間は、描画系命令のみに影響される様に感じる。
 つまり、演算系命令の実行時間は関係ないのでは?)

[実行時間の合計]は、"命令の実行時間"の項目で解説済み。
[オブジェクトの処理時間]は、while()ループのみを行うオブジェクトを生成し、そのときのFPSを測定、そしてその逆数を取ることで求められる。
 但し、FPSは60以上にはならないので、60以下になる数のオブジェクトを生成し実行時間を求め、その時間をオブジェクトの数で割る必要がある。 "Sprite"の値さえ求めれば、"オブジェクトの実行負荷"の表の値に掛ける事で、他のオブジェクトの実行時間も求められる。

フツーに考えれば、*10は必要ないはずだが、これが無いと結果が合わない。何故?