前に購入したMeowbitですが、色々いじっているとエラーが出てくる事があります。
そのエラーは決まってエラーコード「021」となっています。
原因を探るため、Microsoft MakeCode Arcadeのページを探していたら該当ページを見つけました。
当たり前ですが全文英語だったので【渡り鳥のてけとー翻訳】で乗り切ります。
021: Out of memory: too many objects
エラーについてのページの2つ目にエラーコード「021」についての説明が書かれていました。
タイトル
タイトルには「021: Out of memory: too many objects」と書かれていて、「Out of memory」は「メモリー不足」です。
「メモリー不足」と言っているのでメモリーが不足しているのでメモリーを増やす(ハードウェアからのアプローチ)かメモリーの使用を減らす(ソフトウェアからのアプローチ)かしないといけません。
タイトル後半の「too many objects」は「非常に多くのオブジェクト」となり、「非常に多くのオブジェクトによるメモリー不足」が起こっていた事が分かりました。
ちなみに今回のエラー発生はMeowbitにチュートリアル「Galga」で作ったプログラムを入れて子供が遊んでいたときに発生しました。
そのエラーが発生する直前は敵の数がものすごく多く存在していたのでそれが原因だったようです。
内容
タイトルだけで終わってしまっては真因がわからないままになってしまうので内容も確認していきます。
This error occurs when the device runs out of memory for objects.
This can occur pretty easily on hardware since the devices that run these games often have much less memory than a computer.
For example, the minimum RAM expected to run an Arcade game is only 96 kilobytes and each screen-sized image is already almost 10 kilobytes just by itself.
【渡り鳥のてけとー翻訳】
デバイスがオブジェクトによりメモリーを使い果たす時にこのエラーが起こる。
ゲームを動かすデバイスのハードウェアは多くの場合コンピューターより小さいメモリを持つためにかなり容易に起こる。
例えば、アーケードゲームを動かすことを期待されている最小RAMはほんの96キロバイトであり、各スクリーンサイズのイメージはそれだけですでに約10キロバイトである。
当たり前の事でMakeCode Arcadeが動作するデバイスのメモリは普段使うコンピューターのメモリと比較にならないほど小さい物なので結構簡単に起こるエラーみたいですね。
例に書かれているように最小RAMの構成が96キロバイトに対してスクリーンサイズのイメージだけで約10キロバイトも消費するため、オブジェクトが多くなるとそれだけメモリを使い果たす事が容易に想像できますね。
再現プログラム
内容の下には再現させるためのプログラムが添付されていました。
プログラムの内容は200ms毎にランダムな四角形(オブジェクト)を作り続けていつかメモリー不足を引き起こさせる物になっています。
ただ、Meowbitに入れて動かしてみたのですが2時間程度放置してもエラーは発生せずに動き続けていました。
僕の理解が間違ってるのかな?
詳細説明と提案
ページの下の方には詳細説明と提案が書かれています。
(「てけとー」な)翻訳しながら内容を確認してみましょう。
In the example above, every time the background image is changed, the image is stored in an array.
This will likely behave fine on your computer, but will probably crash almost immediately on your device.
This is because modern computers typically have RAM measured in gigabytes, each of which is one million kilobytes.
【渡り鳥のてけとー翻訳】
上の例では、背景イメージが変更されるたびに、イメージは「array」に蓄えられる。
これはあなたのコンピューターではたぶん動くがあなたのデバイスではほとんど直ちに壊れる。
これは現代のコンピューターは一般的に測定されたRAMはギガバイトを持ち、それぞれ100万キロバイトである。
コンピューター上のシミュレーターはRAMの容量が大きいためメモリー不足を起こさないがデバイスではRAMの容量が小さいためメモリー不足によるエラーが発生すると書かれています。
Meowbitへ入れて動かしてもエラーとならなかったのは翻訳が「てけとー」過ぎて間違っているのかも?
Fixing this error will depend upon the capabilities/capacities of the device you are creating the game for, as well as what exactly is taking up too much memory.
Often, this will be due to the creation of too many sprites or images at any one time.
【渡り鳥のてけとー翻訳】
このエラーは固定されるだろう。作ったゲームはデバイスの能力/容量を頼るうえで、ちょうどよく多くのメモリーを取り入れる。
これはしばしば一度に非常に多くの「sprites」または「images」の作成に起因する。
チュートリアルと違って訳すのが難しい単語が多いのと長文だらけで翻訳が間違ってる可能性大きいかも・・・
このエラーはデバイスのメモリーを超えるような「sprites」や「images」を作ると発生するようです。
実際エラーが発生したのはチュートリアル「Galga」で作ったプログラムをMeowbitへ入れて遊んでいた時でエラーの直前には画面内に大量の敵と弾(いずれもSprite)が表示されていて動きもカクカクしていました。
一度に大量の「Sprite」を作り、デバイスのメモリーを使い果たした事は想像できますね。
There are a few general guidelines to minimize the memory footprint of your games:
【渡り鳥のてけとー翻訳】
ゲームのメモリー使用量を最小にするためにほんの少しの一般的なガイドラインがある:
ここから下でガイドラインを示してくれています。
Compute is cheap:
you might have the choice to store a value created in your program or recomputing it as needed.
You should consider how long it takes to recreate the values you store (and test it!) – processors on the devices are often powerful enough to recreate these images fairly quickly.
That could easily save 10% of the device’s entire memory per image with no noticeable performance penalty.
【渡り鳥のてけとー翻訳】
安価な計算:
あなたはプログラムにおいて作られた値を蓄えるために、再計算が必要かもしれない。
あなたはそれを作り直すためにどのくらいの値を蓄えるのか検討すべきである。(そしてそれをテストしなさい!) – デバイスのプロセッサはこれらのイメージをかなり迅速に作り直すためにしばしば十分に強力である。
それは重要な性能の損失無くイメージあたりデバイス全体のメモリーの10%を容易に保存できるだろう。
「sprite」や「image」の事を言っていると思うのですがメモリーをどれくらい使う必要があるのかを考えてプログラムを直してみなさいとのこと。(「image」はメモリー全体の10%(訳10キロバイト)も使う)
Prefer pre-drawn images:
if you draw the image in the image editor rather than modifying it when the game is running, the image will be stored with the code in flash memory and won’t take up as much space at runtime.
For example, if you want the image in the player sprite to switch from green to red, consider changing the color in the image editor and storing it as a separate image. Less runtime memory is needed using this method instead of using clone and change color in picture from .. to …
【渡り鳥のてけとー翻訳】
イメージをあらかじめ描くほうが良い:
もしゲームが動いている時にそれを修正するというよりもあなたがイメージエディタのイメージを描くならば、イメージにはフラッシュメモリのコードを供給し、ランタイムで多くのスペースとしてとるわけではない。
例えば、もしあなたがプレーヤースプライトのイメージが緑色から赤に切り換えてほしいならば、イメージエディタの色を変更し、別個のイメージとしてそれを蓄えることを考慮しなさい。
少ないランタイムメモリーを使う代わりに「clone」と「change color in picture from .. to ..」を使う必要がある。
まだチュートリアルの途中なので「clone」や「change color in picture from .. to ..」ブロックがどんな役割を果たすのか不明ですが「image」は事前に必要な分だけ準備して「image」の入れ替えをすることで改善が見込めると言っているのでしょうか。
ここら辺はまだ理解できていないですが分かった時にはまた記事にしようと思います。
Leave it behind:
if an object won’t be used anymore, get rid of it!
This is often easier done in JavaScript than in blocks, but the easiest thing to do is make sure sprites are destroyed when they’re no longer needed.
Setting the auto destroy SpriteFlag can be a good first step as it will get rid of the sprite when it goes off screen.
【渡り鳥のてけとー翻訳】
それを置いていきなさい:
もしオブジェクトがもう使われないならそれを処分しなさい!
これはしばしばブロックよりJavaScriptが容易にできるが、最も簡単なことは「sprites」を作り、もうそれが必要ではない時に破壊される。
最初のステップはスクリーンを外れた時に「sprite」を処分する「auto destroy」「SpriteFlag」をセットすると良い。
僕はまだJavaScriptを使っていないのでここに関しても理解不足がありそうですが「sprites」は作りっぱなしにしておかず、不要になったらしっかり処分しろってことですね。
「auto destroy」や「SpriteFlag」はまだチュートリアルに出てきていないのでこの働きを僕はまだ理解できていませんが内容から推察すると画面外に出た「sprite」を自動で処分してくれるものらしいですね。
と言うことは「Sprite」は画面外に出ても勝手に無くなることなく生き続けるとしたら「Galga」はメモリーを食い続けるゲームとなってしまいますね。
まとめ
今回発生したチュートリアル「Galga」にてエラーとなる現象は恐らく「sprite」の作りすぎ(不要な「sprite」を処分していない)だと思います。
エラーページ後半に示された提案のうち「auto destroy」「SpriteFlag」を使う事でもしかしたら解決できるかもしれません。
とりあえず現状ではチュートリアルは学ぶために使った物で完成作品をブラッシュアップして行こうとは思っていないのでとりあえずは放置しておきます。
「auto destroy」「SpriteFlag」がどんな物か分かり、解決しそうな事が分かれば別途記事にでもしようと思います。
「sprite」「image」の作成はほどほどにしておかないとメモリー不足でエラーとなる事を今後は気を付けていきましょう。
コメント