HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2011
1023
sakagcopy命令によるCPU使用率の増加について5解決


saka

リンク

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負荷を低減するいい方法はないでしょうか?



この記事に返信する


saka

リンク

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 〜



saka

リンク

2011/10/25(Tue) 08:09:36|NO.42633

どうやらgcopyそのものの処理の限界のようですね…
やりたいこと自体は切って貼って…という単純なコピペ動作以外の何者でもないので、
このためだけにDX関係の拡張命令入れるのも何ですし…
フレームレートは確保できているので、全部の処理を複数回のループに分けて行うとか、ごまかす方向で対処することにします

ちなみにredraw使ってないのはサンプル分ではgotoで戻ってますが、実際のソースではreturnと
gosub使ったサブルーチンのため、別の場所にあるからです。
gmode命令も各gcopyの透過率を個別にさせるために256の部分が変数で個別に変えられるようにしたため
個別に存在しています(ただし問題が起きた時点では全部数値上は不透過の256)。
説明不足ですみませんでした。



ONION software Copyright 1997-2023(c) All rights reserved.