HSPのデータはメモリをどれだけ使うか


2018年 5月14日
 
 
 ここ 2ヶ月くらいマップ戦略要素でつまずいてずっと考える日々なんだけど、一つにはメモリの使用量をどう抑えるかというのがある。

 最大 25のプレイヤーがそれぞれ最大のユニット数やアイテム数を数千持っていて、さらにその 1つ〃がデータを 40とか 60持ってるので、データ量が多くなってメモリ的にどうなんだろうというのでいかにデータ量を使わないかで思考錯誤してた。

 いずれにせよ初めてやるプログラム要素なので、一度やった事のあるプログラムは応用が効いて有る程度コピペでいけるが、やった事の無いのは思考錯誤で時間がかかる。

 HSPの変数定義におけるメモリの使用量ってそもそもいくつくらいなんだろう?

 と言う所にきて、調べてみたので書いておく。
 
 

1、そもそもバイトとかビットって何?

 そもそも 1ビットというのはコンピューターのもっとも基本的な電気信号単位で、たぶん電圧の HIGH(高い)LOW(低い)で出来てる。

 Hi=1を現し、Lo=0を現すので、コンピューターで扱ってるのは元は 0と 1の 2つだけだ。

 この 0か 1かで表す一つの最小単位データを 1ビットと言う。

 これを複数組み合わせると、大きな数字の単位を表せる、これを 2進数という。

 1ケタだと 0と 1の2つの違いを表せる。

 2ケタの場合の組み合わせは 00、01、10、11で 4つの違いを表せる、つまり 0~3を表せる。

 3ケタの場合の組み合わせはは 000、001、010、011、100、101、110、111の 8種、0~7を表せる。

 こんな感じで 1つビットが増えると、表せる違いは 2倍になっていき、つまり表せる数量は 1ビット事 2倍になって行く。

 つまり 4ビットで表せる違いの量は 2 × 2 × 2 × 2で =16となる。

 8ビットの場合は 2 × 2 × 2 × 2 × 2 × 2 × 2 × 2で =256となる。

 1バイトと言うのは 1ビットをいくつかまとめた単位で、2008年に 8ビットで 1バイトと言う事に決めたらしいが、実際はには 5~16ビットくらいで様々らしい。

 まあたぶんウインドウズでは 8ビットではないかと思われるので、ともかく 1バイト=8ビットで構わないだろう。
 
 

それじゃあ 1kバイトってそもそもいくつなの?

 1KB(キロバイト)ってコンピューターでよく見る単位だと思う。

 しかし普段考えないで使ってるので、1KBがどういう単位なのかいまいち分からない。


 
 
 1Kは 1000の単位だから、1KB=1000バイトと言う事になる。
(コンピューターでは 1K=1024とする事が多い)

 つまり 1バイトは 8ビットだから、たぶん 1KB=8000ビットと言う事になる。

 そして 1バイトは 255までの数字を表すので、たぶん 1KB=255までの数字を 1000コ扱える単位、という事になると思う。

 ちなみに 1MB(メガバイト)=1000Kだから、1MB=1000000(百万)バイトという事になる。

 ビットだと 8百万ビットだね。

 う~ん、つまり 1MBだとメモリシリコンの 1ビット素子が 8百万個と言う事でいいのかな?
 
 

本題、HSPの変数は何バイト?

 これはたぶんマニュアルに書いてあるとは思うんだけど、実測してみる。

font "",20

n1=1 ; 変数
dim n2,1 : n2(0)=1 ; 配列変数

repeat  32
 b=cnt/8+1 : f=cnt\8 : x=(b-1)/2*250 : y=(b-1)\2*220
 if f=0 : pos 20+x,20+y : mes ""+b+" バイト"
 pos 30+x,50+y+f*20 : mes "変数 "+n1+"  配列 "+n2(0)

 n1=n1*2
 n2(0)=n2(0)*2
loop

 これは変数を倍にして行き 1ビット事にどこまでが最大か計測したもの。

 4バイト目の最後、32ビット目が -(マイナス)の値になってる。

 これは最後の 32ビット目は 0なら +(プラス)の値、1なら -(マイナス)の値というフラグとして使用しているからだと思う。

 31ビット目の数は、それまでの数を全部足して「2147483648」、つまり 31ビット ALL 1で 2147483648が最大の正の数で、32ビット目が 1になる事で -2147483648になってるんだと思う。

 つまり -1の場合のビットは「1000・・・・・0001」と言う風になってるんだと思う。

 これ以上の数字は 0になるみたいなので「HSPで扱う変数のバイトは 4バイト」という事になる。
 
 
 と言う事はどういう事かと言うと「1000個変数データを使うと 4K」という事になる。

 つまり 250データで 1Kだね。

 つまり HSPの場合、データ使用数の 4倍バイトがメモリ使用量という事になる。
 
 
 タスクマネージャーで使用メモリを実測してみる。

 まずはHSPスクリプトに dim a,1とだけ書いて実効する

 2744Kというのはデバッグウインドウ、最初の最低限で 2728Kだ。
 
 
 dim a,1000

 2732K、1000データで 4K増えてるね。
 
 
 dim a,10000

 2756K、なぜか 28Kほど。
 
 
 dim a,100000

 388K増、ほぼ 400Kだ。
 
 
 dim a,1000000

 3908K増、ほぼ 4000K、この値は 4M(メガ)と言う事になる。

(実数が少ないのは、実際には1K=1024バイトだからではないかと推測する)

 という訳で 25万データで 1MB(メガバイト)メモリを使用するという事になる。

 変数データは思ったより沢山使っても大した事無いみたい。
 
 

それじゃあ hextrategy(製作中のゲーム)で使用するデータの量は?

 今の所変数データ無し、グラフィックまでの実行で、38,596K(38メガ)。

 最大データ設定で、50,276Kだった。

 内訳は 25勢力 × 最大ユニット数 370 × ユニットデータ数 60

 25勢力 × 最大アイテム数 800 × アイテムデータ数 40

 その他キャラデータやアイテムデータ etc.

 これも思考錯誤してかなり削った数字だけど、このメモリ使用量を多いと見るか少ないと見るか。

 たぶん、何100MBくらは使っても平気そうだから、気にするほどでもなくて、気兼ねなく使った方が良いのかもしれないけど、どうなんだろうね。
 
 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です