ようこそゲストさん

つーさのくーかん -再誕-

2006/02/13(Mon) HSPを使う理由

はてブ 2006/02/13 8:29 プログラミング::HSP3

自分がHSPを使う理由ってなんだろうなぁと。
デジリナを作りながら思ったことを書いていたのですが、
今は公開する意味がない気がしています。読みたい人のみ続きをどうぞ。

自分の中で、「HSPを使うことで得られるメリット」が薄れてきているというか……。
ゲーム作りを目的とするならいい気がしますが、
どうも自分が作るようなツール系アプリには不向きかなぁ、なんて思ってたのです。

wait命令とメインループ

デジリナではwaitやawaitは一切使っていません。

HSPには時間待ち命令である wait があります。
アイドル時には、「*メインループ」とかそういうラベルを作って、
waitをサンドイッチの具にグルグル回すのが(HSPユーザの中では)一般的であり、
wait命令を作った作者の用途もそんなところでしょう。

しがない1つのアプリが、アイドル時間中に何かを監視するループを回したところで、
システムにはほとんど影響がないでしょうが……
自分にはそれは「気持ち悪い」と感じられてしまうのです。
Cを使ったことがなければ疑問にも思わなかったのでしょうが。。

メインループという考え方が嫌です。
アイドル時間にwait命令でダラダラループを回すのがどうも気持ち悪くて嫌です。
何かに対応する必要があるのなら、しかるべきメッセージに対応する方向で組みます。

……現実を見ろと言われそうです。

やっぱりAPIが呼びにくい

結局細かいことやるならAPIを自分で呼ぶことになるわけです。

プロトタイプをいちいち宣言しなくちゃならんのが面倒くさいです。
だからと言って、あらかじめ全部定義したヘッダを取り込むと、
使ってない関数までリンクしてEXEが太ります。
HSPではDLLはすべて「明示的リンク」です。
なので、関数ごとにそれを読むコードがだらだらと増えてしまうのです。
速度に関してどうこう思いませんが、あからさまに無駄で気持ち悪いです。

……やっぱり現実を見ろと言われそうです。

動作が遅い

やっぱちょっと遅いかな。

どうしても速度が要るときはマシン語組むですね。
デジリナでは UTF8 <-> Shift-JIS モジュールを作りました。
マシン語でやろうかどうか迷いましたが、結局どろどろdefineスクリにしました。
その際deffuncはオーバーヘッドがキツいのでナシです。
まぁ、動作速度と安全性はトレードオフなので仕方ないですかね。

メリットについても考えてみる。

勝手に窓を作ってくれる。
ウィンドウクラスを登録する必要も各種ハンドルを管理する必要もありません。

変数に関してもメモリの管理が比較的楽。
何でも格納できたり(型変換が容易)、配列が自動的に拡張されたり。
ただ、全部グローバルスコープなのが頭痛い……
# globalなdeffuncで対応できないこともないけど。

画面描画も比較的楽。
オフスクリーンバッファが簡単に作れて、
そこに描いておけば勝手に更新してくれます。

文字列処理も割と楽。
処理用のバッファを自分で確保する必要がないとこがイイっちゃいい。

プラグインで機能拡張できますが、
できたら、プラグインは使いたくないです。

自分がプラグインを使いたくないわけ

これはあくまで個人的な事由なのですが。

「たった数KBのDLLファイルが増える」のも、なんか嫌なのかも知れませんが、
多くの場合、そのプラグインが行き届いてない場合に弄れないからです。
先日hspinetのFTPをパッシブモードにできねーかという質問がラウンジでありました。
できません。できないからプラグインはダメなんです。
たとえば、MIDI再生プラグインがあっても、
MIDIOUTデバイスのハンドルが取得できて、自分でグリグリできにゃダメなんです。
HSPを拡張するためのプラグインが拡張性に乏しいというパラドクス。

だから、例え動作が遅くても、自分で弄れるソースとして提供されるモジュールが好きです。
タイムクリティカルな仕事はモジュールにマシン語を組み込みます。
全体的に見たとき、DLLに分離する意図がよくわからなくなってしまうのです。
人が作ったモノと自分が作ったモノを混同するのがよくないんでしょうか。

ゲームでのデータファイルのあり方

少し話がスレますが。

逆に、「データ」をなんでもかんでもEXEにパックするのもあまり気が進みません。
10MBのEXEより 100KBのEXE + 9.9MBのデータアーカイブ……
……やっぱりこれも微妙ですね。
データファイルも、pic.pak bgm.pak、なんて分けましょうか。
んで、ヘッダに「オフセット」「サイズ」「ファイル名」だけ書いて、
だーっとファイルを連結するだけにしときましょうか。

「そんなんじゃ簡単にリソースを取り出されてしまうではないか」
と思われるかもしれませんが、私はそれでいい、むしろその方がいいと思います。

絵もシナリオも書けない自分が言うのも難ですが、
リソースを暗号化して保護することで「得られるメリット」が思いつかないのです。
というのは、たとえばゲーム音楽を創作のBGMにしたいなんてことよくあると思います。
リソースが簡単に取り出せたら、そういうことも簡単にしてもらえるのです。
だからといってpakしないのはだらしがなく見えるので……
そう、建前的にpakしておくのがいいなぁと思います。

その方がユーザさんにはより楽しんでもらえると思うのです。
BGMを聴いてもらえた方がいいじゃないですか?
作中の一枚絵を壁紙にして眺めてもらえた方がいいじゃないですか?
ただしお金の話が絡む場合は必ずしもこれが当てはまるとは限らないと思います。
ユーザさんの良識に任せられるとき、のみですけど。

あぁ、そうか。

なんで、自分が「HSPってどうもなぁ……」と思ってるのか。

プラグイン使いたくないわけを書いてて気づきました。
確かに表面的にはイロイロ楽ちんなHSPですが、
ちょっと深いところに入ろうと思ったときに遠回りになるんですよ。
Win32APIで使われる大きめの構造体のポインタがlparamで飛んできたときなど、
序数を調べるのに必死です。これが非生産的でとてもしんどいです。
たぶん、そんなことやってる自分に厭気がさしたのかなと。

その点ヘッダファイルが用意されてるCは楽だな、と。

いあ、こんなことダラダラ書いたところで、
やっぱり何にもならないと思うんですけどね。
次のプログラムもHSPで書き始めたらHSPで書いちゃうだろうので。

デジリナに限った話でいえば、
ツールというよりモジュールを作ってみたかったので、これはこれでいいんですが、
それのサンプル用にフロントエンドを書いたら、これがなかなか上手くできていたので。。

かゆいとこには手が届かなくても、
メモリアクセスはお世辞にも速いとは言えないけれど、
文字列処理、描画処理の手軽さのメリットは、結構大きいかなぁ。
結論としては、HSPでツールもイイかもしれませんね。

ただメインループが必要なプログラミングスタイルは断固反対ですω

1: Y+Y=M.H 2006年02月14日(Tue) 午後3時51分

まあ、つーささん位のレベルになるとHSPでは、そもそも物足りないのでしょうね~

私みたいな日曜プログラマー(そもそもHSPでプログラムをする人をプログラマーと指すことにも抵抗があります)には本当、神様みたいな言語ですけど。

なぜかと言うと、API全然使わないし、おっしゃるとおりC言語には触れたことも無いからです。

そのうえ昔から思い描いていたゲームを作ることもできるし、速度的にもそう気になりません。

メインループについては、素人にはあれほど分かりやすい構造はないですね。
ちょびっとだけJAVAを触ってみたとき(まだHSPも知らなかった頃)に、どこがメインの処理でなにがどうんっているのかさっぱり分かりませんでした(*o*)

素人目で直感的に分かりやすい、これが一番のメリットかな~と。
逆にHSPしか知らないために、まさかウィンドウを作るのに、画像を表示するのに、画像の透過処理をするのに、あんなにも面倒くさいステップが必要とは思いもしませんでした。

そういう意味でHSP最高!となるわけで
まあ、つまり手軽さ一番というところです。

それと、何でもかんでもEXEにパック、正にMoon Goddessがそうなのですが、理由としては、ごちゃごちゃとたくさんのファイルがあると素人にはどれを起動していいものか分からない、という状況に陥るからです。
私がネットを始めた頃、無料ゲームをダウンロードして解凍したらごちゃごちゃっとファイルがあって、どれをひらけばいいのか・・・?となったからです。

それもフォルダに入れて管理すればいいだけの話ですが・・・
ただ作った側から言わせれば俺の作った画像を勝手にコピーするんじゃねえ!勝手に流用するんじゃねえ!俺のモンだ!という独占的支配的征服的欲求がやっぱりある訳で・・・

Moon Goddessもそういう理由です。
でもバージョンアップのたびに全て含んだEXEをダウンロードじゃイヤになるのもまた事実。

次回作ではその当りも検討しないと!

長文になり場を汚しました、すみません

2: つーさ 2006年02月14日(Tue) 午後11時01分

ゲームに関してはいいと思うんです、HSP。

ただ、WindowsはどっちかというとイベントドリブンなOSなので、
常に、stopで止めておいて、何かアクションがあったときに
すべてgosubでジャンプさせてプログラムを組むスタイルが、
個人的に好きなだけなのでω
ボタンが押されたらどうする、何々が起きたらどうする、みたいな感じで。

あ、あくまでツールの話ですよ。
時間軸進行シーン管理が必要なゲームでこれをやると非効率以外の何物にもならないので……。
ちなみに、wait命令の中身は
設定した時間後にイベントが発生するタイマーをセットしてから、stopしてる感じだと思います。
ツールはユーザありきで、ゲームみたいに「時間」の概念が必ずしも必要じゃないはずです。
なのでここでタイマーが出てくるのはおかしいかな、と。
だからループの中にwaitを噛ますなんてのは違うなと。



> それと、何でもかんでもEXEにパック、正にMoon Goddessがそうなのですが、理由としては、ごちゃごちゃとたくさんのファイルがあると素人にはどれを起動していいものか分からない、という状況に陥るからです。
経験あるのでわかりますω
プラグインのとこで書こうと思ってて書き忘れてた事項でした。
(数KBのファイルが増える の続きとして書いてたんですが、
話の流れがわかりにくくなるので推敲したときにカットしてました。

ファイルが増えすぎるのはどれを起動していいか迷う。
実はEXEが2つあるだけでもうたくさん、だったりω
わかりやすい名前が付いてればまだいいんですけどねω

データをフォルダに入れるってのは好きじゃないですω
何百MBあるときは分けてもいいか知れませんが。。
サブフォルダが1個だけちょこんとあるのはなんか抵抗あります。
ソースを同梱するときも src.zip とかにしてから……。

だから、data.dpmにパックするのはした方がいいと思うんですね。
ただ、その時暗号化しないで、
"やろうと思えば簡単に取り出せる"んだけど、そのままでは見えない。
(ツールを使うにしても)やろうと思った人"だけ"が取り出せる状態、
が個人的に好ましいかなぁ、なんて思ってます。

まぁ、これはもし自分がゲームを作れたらの話で、
自分にそんな機会があったら(ないだろうけれど)そうしようかなと思ってる、
って感じにとらえてもらえれば。
抜き出せた人が抜き出せない人のためにリソースをばらまく危険性がないとも言えませんが、
しがないソフトウェアの立場的には、ヘルプに一言書いて後はユーザに任せるしかないので。
抜き出すためのツールを作ってばらまいてくれるのは一向に構わないのですが……ω


名前:  非公開コメント   

  • ふと つーさのくーかん - 再会 reunion - つーさ
    ちょっと行き詰まってます。モチベーション的な意味で。一度作って、未完成というか「完成度が低いながらも一応完成」させてしまった作品をリメイクとゆーのは、なかなかココロを奮い立たせるのがしんどい。リメイクするというか完成度を高めるだけでは、ゲ同魂が奮い立たない...