|
|
2011/10/23(Sun) 23:42:47|NO.42611
*Main<\n>
await 1
gsel 0<\n>
pos 0,0 : gmode 3,,,128 : gcopy 6,0,0,,800,600<\n>
pos 0,0 : color 255,0,255 : gmode 4,,,256 : gcopy 2,0,0,800,600<\n>
gmode 4,,,256 : gcopy 3,0,0,800,600<\n>
gmode 4,,,256 : gcopy 5,0,0,800,600<\n>
gmode 4,,,256 : gcopy 4,0,0,800,600<\n>
goto *main<\n>
上記のように、screen 0に対して複数の画像を重ね張りするような形のスクリプトを<\n>
組んでいるのですが、それだけでCPU使用率が50%を超えてしまいます。<\n>
一つ一つチェックしたところ、複雑な(全体的に色が多かったりする写真などの)画像を<\n>
貼りつけているgcopy命令で大量のCPU負荷が発生しているようです。<\n>
該当する命令の行を;で無効化するだけでCPU使用率が4%前後になります。<\n>
画像データによる画面の初期化を行なっているので画像データを使わない(boxfなどで塗りつぶす)<\n>
という選択肢が取れないのですが、CPU負荷を低減するいい方法はないでしょうか?
|
|
2011/10/23(Sun) 23:44:04|NO.42612
あ、すいません 文中の<\n>は無視してくださいorz
|
|
2011/10/24(Mon) 03:31:16|NO.42617
問題がある部分はredrawを使ってない
awaitで待つ場合はCPU使用率はあてにならない
タスクマネージャで4%でも実際は秒間60フレームぎりぎりの可能性もある
そもそも800*600の画像を何枚もgcopyするのは限界がある
特に透明色付き半透明合成コピーは重い(ブレンド率256でも)
描画全体にかかる時間を計るようにしたもの
#include "d3m.hsp"
screen 0,800,600
repeat 6,1
buffer cnt,800,600
loop
repeat
redraw 0
gsel 0
pos 0,0
gmode 3,,,128
gcopy 6,0,0,800,600
pos 0,0
color 255,0,255
gmode 4,,,256: gcopy 2,0,0,800,600
gmode 4,,,256: gcopy 3,0,0,800,600
;gmode 4,,,256: gcopy 5,0,0,800,600
;gmode 4,,,256: gcopy 4,0,0,800,600
pos 0,0:color
mes "秒間60フレーム時のCPU使用率="+cpu+"% 処理時間="+(ms)+"ms"
redraw 1
tim2 = d3timer()
ms=tim2-tim1
msf+ms
if (cnt\60)=0{cpu=msf/10:msf=0}
await 1
tim1 = d3timer()
loop
自分のPCではこのまま実行して表示されるCPU使用率は77%前後
タスクマネージャ上のプロセスhsp3.exeのCPU使用率は0〜3%
|
|
2011/10/24(Mon) 17:45:20|NO.42621
横からすみません。
あまりhspの各命令の実行速度については詳しくないのですが、
gmode 4,,,256 : gcopy 〜
gmode 4,,,256 : gcopy 〜
gmode 4,,,256 : gcopy 〜
gmode 4,,,256 : gcopy 〜
というような記述の場合、gmode命令はひとつで良い気がします。
gmode 4,,,256: gcopy 〜
gcopy 〜
gcopy 〜
gcopy 〜
とは言うものの、gmode命令だけを100万回実行させて
実行にかかった時間を測定してみたところ、
65ミリ秒しか掛かりませんでしたのでこの件はあまり関係ないとは思いますが・・・。
ただ、私が以前速度で詰まったとき、こういった細かな修正を加え続けて
なんとか実用に至る速度になったことがありますので、
無駄を極限まで減らすことが大事なのかもしれませんということをお伝えしたかった次第です。
「そんなことは分かってるんだけど・・・」と思われるかもしれませんが、お節介で投稿してみました。
|
|
2011/10/24(Mon) 17:48:46|NO.42622
すみません、盛大にズレました。
gmode 4,,,256: gcopy 〜
gcopy 〜
gcopy 〜
gcopy 〜
|
|
2011/10/25(Tue) 08:09:36|NO.42633
どうやらgcopyそのものの処理の限界のようですね…
やりたいこと自体は切って貼って…という単純なコピペ動作以外の何者でもないので、
このためだけにDX関係の拡張命令入れるのも何ですし…
フレームレートは確保できているので、全部の処理を複数回のループに分けて行うとか、ごまかす方向で対処することにします
ちなみにredraw使ってないのはサンプル分ではgotoで戻ってますが、実際のソースではreturnと
gosub使ったサブルーチンのため、別の場所にあるからです。
gmode命令も各gcopyの透過率を個別にさせるために256の部分が変数で個別に変えられるようにしたため
個別に存在しています(ただし問題が起きた時点では全部数値上は不透過の256)。
説明不足ですみませんでした。
|
|