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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0219
K6レンダリングの加速10解決


K6

リンク

2008/2/19(Tue) 18:58:07|NO.13642


repeat 255 col=cnt repeat 48 cny=cnt repeat 64 color 0,0,col boxf 10*cnt,10*cny,10*(cnt+1),10*(cny+1) pos 0,0 color 255,255,255 mes col loop loop loop

ソースを見てのとおり10*10の正方形のブロックを縦48個、横64個並べて
640*480に画面を塗りつぶし、これを255回繰り返すプログラムなのですが、
当方の環境
CPU PEN43GhzHT, MEM 1024MB, GPU nVidia FX5700 128MBVRAM
なのですが、処理が完了するまでにredraw使用で2分19秒
不使用で3分前後もかかってしまいます。
早い話がわずか1.8fpsしか描写できないわけです。

これから作ろうとしているものにエクセルのような表を描写したいのですが
この速度ではセル1つ1つ描写してるようでは間に合いそうにないです。
セルに本来入力可能な字数をオーバーしたとき、例えば「板」という字で
反の部分が隣のセルに行ったときmes命令だけでは次のセルの内容と干渉してしまいます。
木の部分だけ元のセルに残り、超えた反の部分だけ消すために
boxfで隣のセルをクリアしようとしたのですが、この処理速度では到底無理なようです。
しかし「板」という字ごと消せばいいというわけにはいかない事情がありまして…

処理を高速化するいい方法はありませんでしょうか?



この記事に返信する


begriff

リンク

2008/2/19(Tue) 19:12:43|NO.13644

気持ち的にチョイ早い・・・?

buffer 3 gsel 0 repeat 255 redraw 0 col=cnt repeat 48 cny=cnt repeat 64 gsel 3 color 0,0,col boxf 10*cnt,10*cny,10*(cnt+1),10*(cny+1) pos 0,0 color 255,255,255 mes col loop loop gsel 0 pos 0,0 gcopy 3,0,0,ginfo_winx,ginfo_winy redraw 1 await 0 loop



K6

リンク

2008/2/19(Tue) 20:10:13|NO.13646

ほんと気持ち的に・・・ですね。
このプログラムは処理速度の測定、ベンチマーク目的で作ったのですが、
実際には罫線を引きまくったり箱書いて文字書いたりと複雑になります。
やっぱ全部書き直すんじゃなくて条件に合う部分だけとか変更された部分だけとか
やるしかないんでしょうかね?


ところで、ゲームのプログラムとかはしたことないんでわかりませんが、
こんなんでRPGのマップのレンダリングは間に合うんでしょうかね?
たかだか1000個前後の正方形をコピーするだけで1秒もかかるんじゃ
コマ落ちがひどくなりそうな・・・



f

リンク

2008/2/19(Tue) 20:20:51|NO.13647

少なくとも、家では素の状態で27秒、redraw併用で8秒なのだが・・・
どうやらその機械がかなり遅いように思われるのだが、どうか。

・・・とはいえ、3Gか・・・。
家は2.66Gだし、この処理でグラフィックボードと言うほどの話にもなるまいし・・・。



ほげ

リンク

2008/2/19(Tue) 21:11:44|NO.13649

boxfは遅いので、セルをバッファに用意してgcopyで描画してみる。
セルをまとめて描画できればもっと速くなるかも?


repeat 255 buffer 2,10,10,0 color 0,200,cnt :boxf 0,0,10,10 gsel 0 redraw 0 repeat 48 cny = cnt repeat 64 pos cnt*10,cny*10 gcopy 2,0,0,10,10 loop loop pos 0,0 :mes cnt redraw 1 await loop



K6

リンク

2008/2/19(Tue) 21:11:54|NO.13650

そんなバカな!

でも思い当たることが二つ。
1、CPU熱暴走対策のためBIOSレベルでリミッターが掛かっている。
2、MS−VISTA

repeat 255 repeat 48 repeat 64 loop loop loop
これだけなら27ミリ秒で終わりましたけど当然だな。

ちなみにタスクマネージャで観測したところwait、redrawなしでもCPUは50%程度でした。




K6

リンク

2008/2/19(Tue) 21:16:04|NO.13651

お、50fpsにもあがりました。
全部バッファに入れたほうがいいようですね。
でもそーすると複数のサイズのセルがあるときにどうしたらいいのか・・・

考えるか。



ANTARES

リンク

2008/2/19(Tue) 21:36:57|NO.13653

>少なくとも、家では素の状態で27秒、redraw併用で8秒なのだが・・・
家は41秒 Pen4 2.8GHz

>例えば「板」という字で
>反の部分が隣のセルに行ったときmes命令だけでは次のセルの内容と干渉してしまいます。
>木の部分だけ元のセルに残り、超えた反の部分だけ消すために
 bufferにmesして10×10ドットだけgcopyするとか?
ほげさんとかぶってるようなかぶってないような……?



FM-7

リンク

2008/2/19(Tue) 22:05:45|NO.13655

参考になるかどうか...。
ちなみに、Celeron 400MHzのノートで試して
10秒位で終了するみたい。

screen 0,640,480 repeat 255 color 0,0,cnt redraw 0 repeat 48 cny=cnt repeat 64 boxf 10*cnt,10*cny,10*(cnt+1),10*(cny+1) loop loop redraw 1 title " "+cnt await loop



K6

リンク

2008/2/19(Tue) 23:08:10|NO.13657

やっぱりソースコード次第のようですね。
ここでboxfを使ったのはgcopyと描写速度は等しいという前提のつもりでしたけど
gcopyとぜんぜん速度違うというのは驚きでした。

思ったんですが、
短い時間に画面バッファを数百とか数千とか書き換えるのはいいもんでしょうか?
実用的なものしかほとんど作ってこなかったからscreen命令しかあまり使わないので。
使ってもせいぜい2〜3でしたし。
ウィンドウを生成するときはAPIを呼んでますけど
バッファなら関係なくバックで生成したって構わないですか?



K6

リンク

2008/2/20(Wed) 21:05:36|NO.13677

どーもあとは最適化の技術次第のようです。
日々精進します。

皆様どうもありがとうございました。



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