Last Update : 2007/09/xx
HSP(Hot Soup Processor)のいろいろなプログラミングTips。v(ーoー)v
ただ単に動作スピード・動作パフォーマンスを落とすだけの無駄な処理を行っていませんか? 見た目は特に何もないけれど、裏側ではHSPがせっせと無意味な処理をしていることがあります。ループ中に同じ命令を何度も呼ぶような「ダメダメ〜」な例をいくつか挙げませう。
命令 | コメント |
objmode命令 | font命令で指定した任意のフォントを、オブジェクトに反映させる命令です。何度も呼び出す必要はありません。 |
font命令 | 内部では、「フォントファイルの読み込み→論理フォントの生成」という処理が行われるため、若干時間を要します。呼び出した分だけの論理フォントが作成されるので、必要ないのに何度も呼ぶと、動作スピードにモロに響くばかりか、無駄なフォントデータをどんどん作成するだけです。 |
sysfont命令 | 上のfont命令のようなフォント生成処理はありませんが、何度も呼び出す必要がありません。 |
randomize命令 | rnd命令・rnd関数の乱数発生パターンを不定にする命令ですが、1度だけ呼んでおけばいいものです。また、何度も呼ぶと逆にパターンが一定状態になってしまう場合があります。 |
cls命令 | 画面のクリア(クリアスクリーン)以外に、変数やフォントやカラーやオブジェクトなどなど、ありとあらゆるウィンドウ内のデータを初期化する処理が行われます。そういう目的以外ではくれぐれも使いませぬよう。ループ内で何度も呼ぶのはもってのほかです。画面が「ちらつく」のはこれが原因であることが多いです。 単純な描画の消去や背景色の変更はboxf命令+color命令の塗りつぶしで、オブジェクトの消去はclrobj命令で、メモリ上のデータはmemset命令やsdim命令で。 |
picload命令 | 内部では、「画像ファイルを読み込んで画像データ取得→画像の描画」という2段階の処理を行っています。呼び出すたびに、ハードディスクにあるファイルにアクセスするので、同じ画像ファイルを何度も呼ぶような処理になっていると、動作スピードにモロに響きます。 あらかじめ画像ファイルを仮想ウィンドウ(buffer命令)にすべて読み込んでおき、必要な時に必要な大きさの画像をbcopy命令などでコピーしてきます。 |
bload命令 | 内部では、「ファイルの読み込み→ファイルデータの取得→メモリ上にデータを展開」という処理を行っています。呼び出すたびに、ハードディスクにあるファイルにアクセスするので、全く同じファイルを何度も呼ぶのは、ものすごい無駄です。 あらかじめファイルの全体(または必要な一部)をすべて読み込んでおき、利用したいデータは、memcpy命令やpeek関数・wpeek関数・lpeek関数を使って切り出します。 |
bsave命令 | 内部では、「ファイルデータの取得→ファイルに書き込み」というような処理を行っています。呼び出すたびに、ハードディスクにデータがファイルとして書き出されるので、動作スピードに響きます。 memcpy命令やpoke命令・wpoke命令・lpoke命令を使って、メモリ上でデータの書き込みを行い、最後に一度だけファイルとして出力するためのbsave命令を呼ぶ処理にします。 |
on〜命令 | onexit命令、onkey命令、onclick命令。1度だけ呼んでおけばいいものなので、何度も呼ぶような処理にしませぬよう。 ラベルジャンプを一時的に無効or有効に切り替えるには、それぞれの命令の第1パラメータに数値を指定します。 |
オブジェクト類 | ループ内でbutton命令、chkbox命令、input命令、mesbox命令、combox命令、listbox命令を何回も呼びだし、cls命令でオブジェクトを削除しては、再設置を繰り返すような処理。何度も呼ぶ形になっていて(限界数1024個の警告エラー)、実はオブジェクトがオブジェクトの真上に重なって大量に設置されていた、なんてな事例がよくあります。 オブジェクトの設置は一度でいいので、それぞれのオブジェクトの制御は、objprm命令を使います。オブジェクトをクリアしたければclrobj命令を。オブジェクトのクリアのみが目的の時に、くれぐれもcls命令を使いませぬよう。 |
表面上ちゃんと動いているようなものもありますが、ダメダメ〜な処理をあえて書いてみーる。
; ダメダメ スクリ1 (乱数を表示?) ; [→ randomize命令を何度も呼ぶ、cls命令で画面がちらつく、無駄にフォント生成] *main cls randomize a = rnd (10) font "MS Pゴシック", 100 mes a wait 10 goto *main
; ダメダメ スクリ2 (ボックスの数値アップ?) ; [→ cls命令によるちらつき、実質的な入力ボックスの大量設置] *main cls a++ input a wait 10 goto *main
; ダメダメスク3 (ボックスの数値アップ?) ; [→ まんま入力ボックスの大量設置] *main a++ pos 0, 0 input a wait 10 goto *main
HSP 3.1の「HSP3スクリプトエディタ」から検索&置換機能のモードに「正規表現」機能が実装されてます。特殊な意味を持つ記号を組み合わせることで、キーワード文字を検索する効率がアップしますが、慣れないとちょっと難しいです。以下、正規表現について扱っているページ。
ちなみに、HSPのスクリプトで正規表現を利用したい場合は、VBScriptのRegExpを利用した方法があります(IE5.0以降)。付属サンプルに、検索の「sample\comobj\comtest8.hsp」と置換の「sample\comobj\comtest9.hsp」が用意されてます。
また、Tatsuo Babaさん製作の正規表現ライブラリ「BREGEXP.DLL」を利用する方法もあります。(HSP3用モジュールはGoogle検索)
// WSH VBScript 正規表現検索 (by Kpan) onexit *exit newcom oReg, "VBScript.RegExp" oReg("Global") = 1 // 最初に一致したものか、全部か ; oReg("IgnoreCase") = 0 // 大文字・小文字の区別 sdim data, 2048 sdim pattern, 128 data = {"Hot Soup Processor(ホットスーププロセッサ、略称HSP)は、プラット フォームが持つ機能をより手軽にダイレクトな形で引き出すためのツールとして、 1994年から開発が開始され1996年以降フリーウェアとして公開されている プログラミングツールです。 BASIC言語をベースに、アマチュア向けのツールとして広いユーザー層と、認知度を 得ています。主として個人用、オンラインソフトのゲームやツール開発に利用する ことができ、目的が商用、非商用にかかわらずライセンス料や、サポート費用は 必要なく無料で使うことができます。"} pattern = "[ -~]+" // パターン (半角文字のみ) mesbox data, 600, 100 input pattern, 600, 22 button "検索", *search stop *search oReg("Pattern") = pattern comres result oReg->"Execute" data repeat result("Count") oMatch = result("Item", cnt) ; インデックス、文字数、ヒットした文字 mes ""+oMatch("FirstIndex")+" "+oMatch("Length")+" "+oMatch("Value")+" loop delcom oMatch delcom result stop *exit delcom oReg end
自身のホームページ上に、ソースコード(スクリプト)をそのまま貼り付けたい場合、HTMLで「preタグ」(<pre>〜</pre>)を利用すると便利です。タブスペースが再現されます。当サイトでもそれを利用してソースコードを掲載しています。
// HSPソース mes "PREタグ" stop
HTMLソースでは下のような感じ。
// HTMLタグ <pre> mes "PREタグ" stop</pre>
スタイルシートを使って「preタグ」内の表示色などを変更するー。
// HSPソース mes "PREタグ" stop
// HTMLタグ <pre clas="code"> mes "PREタグ" stop</pre>
// スタイルシート (例) PRE.code { font-size:12px; //フォントサイズ line-height:130%; //行の高さ padding:7px; //領域内の余白幅 background:#0000FF; //背景色 color:#FFFFFF; //文字色 }
<< HSP Tips 12 || HSP Tips 14 >>
Copyright © 2005-2012 Kpan. All rights reserved.