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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
1207
さーすemes命令を使わず縁取り文字を表示したい8未解決


さーす

リンク

2015/12/7(Mon) 02:04:59|NO.73481

質問ばかり申し訳ないです
スクリプトの軽量化を図っているのですが、
emes命令の処理が特に重いです
なんとかemes命令を使わずに文字の縁取りができないかと機能を単純にしたモジュールを作ってみたりしたのですが


#module #deffunc emes2 str string cx = ginfo_cx : cy = ginfo_cy color 0,0,0 pos cx - 2 , cy :mes string pos cx + 2 , cy :mes string pos cx , cy + 2 :mes string pos cx , cy - 2 :mes string color 255,255,255 pos cx,cy:mes string return #global


結局、mes命令を多用している分元のemes命令と処理速度は変わりませんでした
どうにかemes命令を使うより軽く、文字を縁取りして表示することはできないでしょうか・・・



この記事に返信する


KA

リンク

2015/12/7(Mon) 05:55:37|NO.73482

こういう方法は?

font "",60,1 color 0,0,0 pos 50,50 mes "A" font "",60,0 color 250,250,250 pos 50,50 mes "A"
あとは、元々太字のフォントと細字のフォントを組み合わせたり。



空気

リンク

2015/12/7(Mon) 11:36:26|NO.73483

このスレで774さんが教えてくださった、
「D.WinAPIを利用してみる」が一番高速です。(HSP3DishやHGIMG3,4では使えませんが)
http://hsp.tv/play/pforum.php?mode=all&num=72768



さーす

リンク

2015/12/7(Mon) 12:08:53|NO.73485

ありがとうございます!
フォントサイズをずらす方法では、文字のずれが生じてしまうようでした
なるほどWinAPIですか!理解するのに時間がかかりそうですがなんとか出来次第試してみたいと思います



774

リンク

2015/12/7(Mon) 19:36:44|NO.73492

速度なら「画像で用意しといてコピー」が最速です。
ノベルのような大量のテキストを表示するものなら、
バッファにテキストだけの画像を描画していき毎回コピーする感じですね。
gmode7でも7倍ほど速いです。


余談ですが…
ウチの化石PCですら、速度差計るのに数千回描かせてるような状況ですので
emes自体が重いという事は無さそうな気がします。
重いと感じるのは何か別の原因ではないでしょうか。

有りがちなのは、プログラムのループ内で
buffer, font, cls, オブジェクト生成辺りを繰り返してる…とか。



さーす

リンク

2015/12/7(Mon) 21:24:21|NO.73497

774さん!ありがとうございます!
画像にしてコピーしたほうが早いのですね

boxfやbufferは使っていないのですがfont命令も重さの原因になるんですね・・・

目から鱗です。もう一度スクリプトを見直してみます



774

リンク

2015/12/7(Mon) 22:40:07|NO.73500

すみません、font命令に関しては私の勘違いっぽいです^^;
全く影響無い訳でも無いですが、他程極端な影響は無いです。

ただ、フォントによって結構描画速度が変わりますね。
ひょっとして極端に描画が遅くなるフォントがあったりするんでしょうか…



さーす

リンク

2015/12/7(Mon) 23:40:37|NO.73504

試してみたところMSゴシック等解像度の高いフォントは結構重くなってしまうようでした。
ドット絵調の解像度低めのフォントを使用することでだいぶ速度は改善されてきました

あとは774さんのWINAPIを使った縁取り文字描画のモジュールをなんとか使えるようにがんばってみます!



774

リンク

2015/12/8(Tue) 19:34:31|NO.73516

相変わらず見難い書き方してますね…私。
実際はがんばる程の内容じゃないですよ。

・CreatePen
HSPだと線の太さを設定出来ないので、APIで太目の"ペン"を作ります。
実際は内側にも半分めり込むので、縁の2倍の太さで作ってるみたいです。

・SelectObject
デバイスコンテキスト(hDC)に先程の"ペン"を割り当ててます。
hDCはAPIで描画する際に扱う場所(?)で、HSPのscreenやbufferみたいなモンです。
この時の戻り値statが元のペン(のハンドル)なので取っときます。

・BeginPath 〜 EndPath
この区間で描画した内容が"パス"になるっぽいです。
HSPのmesで済ませちゃってますが、普通に"パス"になるようです。

・StrokePath
"パス"の輪郭を"ペン"でなぞるAPIです。実質これに丸投げです。

・SelectObject
元のペンに戻します。

・DeleteObject
APIで作った"ペン"はもう要らないので削除します。

こんだけです。各APIの引数等はMSDNとかで調べてみて下さい。

あのサンプルは処理結果を見てもらう為の物で汎用性は全く考慮してません。
アレを使おうとするよりは、新たにモジュール作っちゃった方が良いと思いますよ。

ついでに…MSDNの場合は英語版ページをお勧めします。
日本語版は構造体なんかへのリンクが切れてますし、
日本語だから読むだけで解る、というものは極稀です。
(むしろ珍妙な日本語で混乱します



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