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


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
0728
きのよー変数の数とかメモリの上限とか7解決


きのよー

リンク

2014/7/28(Mon) 02:28:11|NO.63143

とても不健康な時間に質問させていただきます。すみません。
現在、ノベルゲームエンジンを作っていて、気になっていることがあります。
それが、変数の数、メモリの上限です。
HSPは文字列変数などの上限が自動的に変化するので、テキストファイルの読み込みなどもとても簡単ですが、
常にそれを行っていると、いつかメモリが溢れてしまいそうな気がします。
もちろんメモリ量の上限はハードウェア的に決まってきますが、
HSPのシステム上、確保できる上限や利用できる変数の数などの上限がどうなっているのかがよく理解できていません。
ソフトウェア的にメモリ量の上限が決まっている事実が、HSPにあるのでしょうか?
ご教授をお願いします……。



この記事に返信する


Tetr@pod

リンク

2014/7/28(Mon) 02:43:11|NO.63144

こちらの環境では
sdim a, 0x5EEEFFC8
がエラーにならないギリギリのサイズでした。
およそ1.5GiBになります。
ただし、通常のプログラムではメモリリークを起こさない限り
1.5GiBも使うとは考えられません。

ノベルゲームエンジンでは、ファイルなどを一度に読み込まずに
必要になったとき(あるいはその少し前)に読み込み不要になり
次第メモリを解放するように作れば問題ないかと思います。
独自でアーカイブを作成するなど巨大なファイルを扱う場合は、
ファイルの一部だけを随時読み込むようにすれば良いでしょう。

なお、メモリ解放は
dim 変数
などで行えます。



skyblue

リンク

2014/7/28(Mon) 09:02:14|NO.63146

マニュアルに書いていましたソフトウェア的な制限は
実質、メモリが許す限りの環境依存となっています。
詳細はhspprog.htmのHSPシステムの許容範囲の項目を見てください。



Tetr@pod

リンク

2014/7/28(Mon) 09:47:44|NO.63148

あーたしかにそう書いてありますね。

>メモリバッファは、Windowsが許す限りのメモリを扱うことができ、上限はありません。

ただ、このWindowsが許す限りというのは2GB(32ビットアプリケーションで
LARGE_ADDRESS_AWAREなしのとき)なので、実質2GBが上限となります。



あり

リンク

2014/7/28(Mon) 10:11:55|NO.63150

使い方に癖がありますが、モジュール変数を使うと
手動で変数の削除及び変数で使用したメモリの開放が可能なので
変数の無駄使いが気になるなら使ってみるのもありでしょう。

もっとも、ノベルゲームのテキスト量は多くても数十MB程度ですし
(ゲームのデータ容量の殆どは画像と音楽)
変数は基本的に上書きして使用されるものですので
今時のPCでゲーム中に使用した変数の容量過多による
問題が起こる事はまずないと思います。



きのよー

リンク

2014/7/30(Wed) 18:44:43|NO.63209

返信が遅くなってしまい申し訳ないです。

Tetr@pod様
>>sdim a, 0x5EEEFFC8
なるほど、この方法で確認ができるのですね。
早速こちらの環境で実験したところ、
sdim a, 0x3bfdffc8
がギリギリでした。
4GBのメモリを積み、空きが1.8GBの状態で実験した結果、
だいたい1GBほどメモリが消費され、800MBほどが残っていました。
続いて
sdim a, 0x3bfdffc8
sdim b, 0x20000000
このコードも実行してみたところ、エラーが出ませんでした。
dim a,251625458
配列変数もこのサイズが限界のようです。
>>ノベルゲームエンジンでは、ファイルなどを一度に読み込まずに
>>必要になったとき(あるいはその少し前)に読み込み不要になり
>>次第メモリを解放するように作れば問題ないかと思います。
現在考えていますが、利便性を考えると読み込みと破棄の動作を別々にしたいと思っています。
そのため一時的には大きな容量が必要になってくるはずなので、注意していきたいと思います。

skyblue様
>>実質、メモリが許す限りの環境依存となっています。
確かに、Tetr@pod様の環境と私の環境では宣言できるサイズが異なるので、
実質的に環境依存かもしれません。
私の環境では1GB+500MB程度でシステムエラーが発生しているので、
もっと低スペックなパソコンだともっと低いかもしれないですね(そもそも動くかどうか心配ですが)

あり様
>>使い方に癖がありますが、モジュール変数を使うと
>>手動で変数の削除及び変数で使用したメモリの開放が可能
モジュール変数……ですか。意識していなかった分野です。
モジュール機能のドキュメントをひと通り読みましたが、これはローカル変数という認識でいいかと思います。
現在のところ、
#define deldim(%1) sdim %1,1
を使って要らなくなった変数を随時小さくしている次第ですが、
ローカル変数を用いれば完全に破棄することができそうですね。

極力変数を再利用したり、いろいろな方法でメモリを開放したり、
いろいろとあがいてみることにします。
皆様ほんとうにありがとうございました。



check

リンク

2014/7/30(Wed) 21:00:32|NO.63210

もう解決しているようだが、
HSPで動的メモリ確保、廃棄を行うというのはいささか大変。
なので他の方法でお茶を濁しているに過ぎない。

本気でやりたければC言語等を使ったほうが断然楽(メモリの確保、破棄は)だが、
メモリリークやアクセス違反等別の問題に当たると思ってまず間違いない。

自らの腕と相談だな。



きのよー

リンク

2014/7/31(Thu) 00:10:55|NO.63215

check様、解決済みなのにご回答をありがとうございます。

>>本気でやりたければC言語等を使ったほうが断然楽(メモリの確保、破棄は)だが、
>>メモリリークやアクセス違反等別の問題に当たると思ってまず間違いない。
>>自らの腕と相談だな。
もちろん、C言語やC++でDLLを作り、それで管理をすればとても簡単にできることは承知しています。
ただ、画面描画や文字列関連の処理が備わっているHSPをあえて使っています。
自分の技量が足りないことがまずいちばんの問題ですが……。
将来的には逆ポーランド計算や文字列の結合処理などをDLLで組もうとは思っているので、
その時になってから考えようかと思います。



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