【CoR】配列のお話【フリーズ問題】
投稿者: 光楼(114) 投稿日:2021/02/28 19:45
まずはこれ↓を実行してみて欲しい。これでも良いよ。
長さ50万の配列を連続で生成するプログラムですが、数十回でフリーズすると思います。
特にエラーもなく、何の前触れもなく止まります。これは困りました……。
え?
こんなに配列作らないから自分は関係ないって!?
……そうですか。
では今度はこれ↓を実行して見てください。
配列を初期化する処理を入れてみました。
これもフリーズしてしまいます。
初期化したつもりでも、実は残ってるんでしょうね。
つまり、ループ内で配列を生成するといつかフリーズしてしまう!
……配列が長ければ長いほど、多ければ多いほど、フリーズまでの時間は早くなる( ノД`)シクシク…
この問題が急に現実味を帯びてきたでしょう?(笑)数万ループなんてCoRなら一瞬ですよ。
ちゃんと「削除」すればいいんじゃないの?ってことで、以下のプログラムを用意してみました。
配列の最後尾を抜き出し、配列からは削除するpopメソッドを配列の長さ分ループさせることにより、全要素を削除しています。
ちょっと時間掛かりますが、実行して見てください。
こ れ も フ リ ー ズ す る で し ょ ?
CoRのドキュメントに配列を削除する方法はこれ以上書かれていないので、「Ruby 配列 削除 すべて」でググってみました。
そしたら、clearメソッドというのが出てきました。これを使ってみましょう!
早速実行してみてください。
どうです?今度は止まらないでしょう?
CoRのドキュメントに書かれてない方法なので動作の保証は出来ませんが、フリーズを避けるためには現状こうするしかないと思います。
このゲームがフリーズしてしまう問題を抱えてるんですが、この方法で直るといいなぁ……。
フリーズの原因が他にもあるんじゃないかと思って、テキストスプライトを大量に生成してみました。
これは確か7万個超生成したあたりでフリーズしたんですが、destroyで消せば大丈夫そうでした。
なので、フリーズは生成した配列が全部残ってる事が原因かなと思ってます。
以上!
ツイート
scene 'start' do i = 0 update do # 配列生成 arry = [0]*500000 i += 1 debug_log "配列生成回数:#{i}" end end # シーンを開始する start_scene "start"
長さ50万の配列を連続で生成するプログラムですが、数十回でフリーズすると思います。
特にエラーもなく、何の前触れもなく止まります。これは困りました……。
え?
こんなに配列作らないから自分は関係ないって!?
……そうですか。
では今度はこれ↓を実行して見てください。
scene 'start' do i = 0 update do # 配列生成 arry = [0]*500000 i += 1 debug_log "配列生成回数:#{i}" # 配列削除 arry = [] # <= 追加箇所 end end # シーンを開始する start_scene "start"
配列を初期化する処理を入れてみました。
これもフリーズしてしまいます。
初期化したつもりでも、実は残ってるんでしょうね。
つまり、ループ内で配列を生成するといつかフリーズしてしまう!
……配列が長ければ長いほど、多ければ多いほど、フリーズまでの時間は早くなる( ノД`)シクシク…
この問題が急に現実味を帯びてきたでしょう?(笑)数万ループなんてCoRなら一瞬ですよ。
ちゃんと「削除」すればいいんじゃないの?ってことで、以下のプログラムを用意してみました。
scene 'start' do i = 0 update do # 配列生成 arry = [0]*500000 i += 1 debug_log "配列生成回数:#{i}" # 配列削除 arry.each do |item| # <= 追加箇所↓ arry.pop end # <= 追加箇所↑ end end # シーンを開始する start_scene "start"
配列の最後尾を抜き出し、配列からは削除するpopメソッドを配列の長さ分ループさせることにより、全要素を削除しています。
ちょっと時間掛かりますが、実行して見てください。
こ れ も フ リ ー ズ す る で し ょ ?
CoRのドキュメントに配列を削除する方法はこれ以上書かれていないので、「Ruby 配列 削除 すべて」でググってみました。
そしたら、clearメソッドというのが出てきました。これを使ってみましょう!
scene 'start' do i = 0 update do # 配列生成 arry = [0]*500000 i += 1 debug_log "配列生成回数:#{i}" # 配列削除 arry.clear # <= 追加箇所 end end # シーンを開始する start_scene "start"
早速実行してみてください。
どうです?今度は止まらないでしょう?
CoRのドキュメントに書かれてない方法なので動作の保証は出来ませんが、フリーズを避けるためには現状こうするしかないと思います。
このゲームがフリーズしてしまう問題を抱えてるんですが、この方法で直るといいなぁ……。
フリーズの原因が他にもあるんじゃないかと思って、テキストスプライトを大量に生成してみました。
これは確か7万個超生成したあたりでフリーズしたんですが、destroyで消せば大丈夫そうでした。
なので、フリーズは生成した配列が全部残ってる事が原因かなと思ってます。
以上!
コメントする
コメントするには、ログインする必要があります。
外部関数で作られた配列も
関数を抜けただけでは削除されずに残るようです
↓フリーズする
↓フリーズしない(その1)
↓フリーズしない(その2)
自分で消す処理を書かないといけないみたいですね。