[戻る] 最新記事| 前後の記事|

- 以下は、記事NO. 12618 に関する 返信フォーム です -
長時間プレイは不向き? 投稿者 : OceanLight(nthkid191180.hkid.nt.ftth.ppp.infoweb.ne.jp)
- 2010/01/11(Mon) 22:23 No.12618
 


最近作っているゲームで長時間のプレイをしたところ、
「○○○:参照カウントが負になりました」
と突然エラーが出て、ファイルの読み込みがおかしくなったり、
時々デバッグウィンドウのような画面が出て最悪ファイルが何故か書き換えられ壊れてしまったりしました。

Tonyuでは長時間のプレイには向いてないのでしょうか・・・?


Re: 長時間プレイは不向き? 投稿者 : Triangle Ld.(softbank219014238038.bbtec.net)
- 2010/01/13(Wed) 19:14 No.12620
 
Tonyuは以前ガーベージコレクタ(GC)の問題が指摘されていて、それが関係しているようです。
ガーベージコレクタが不全だと、長時間動かしているうちにメモリリークに達します。(dieしてもメモリは解放されないようです。)

Windowsから見ればページ違反になるので、ふつうはWindowsのエラーで強制終了するはずです。が、Windowsはエラーを出さないようです(原因は不明)。

Windowsアプリケーションのメモリ管理は、基本自分でやるものなので、Tonyuもそれに対応してくれたらいいと思います。


Re: 長時間プレイは不向き? 投稿者 : OceanLight(nthkid191180.hkid.nt.ftth.ppp.infoweb.ne.jp)
- 2010/01/13(Wed) 20:29 No.12621
 
現在作っているゲームはセーブロードの量が多くオブジェクトの変数の数もかなり多いので、これが原因でメモリ不足になるようですね。
(単純にセーブロードを2〜3回繰り返すだけでもエラーが起きる・・・)

エラーを吐かないのはTonyuが止めているからのようで、メッセージ欄に表示されるだけで強制終了はされないようです。


$system.setStackSize()でスタックサイズを減らしたりすれば少しはマシになるでしょうか・・・?

ちなみにページは1つしか使ってません。


Re: 長時間プレイは不向き? 投稿者 : 111(flh1aau061.gif.mesh.ad.jp)
- 2010/01/13(Wed) 23:42 No.12623
 
このエラーは私もたまに出ていて、困っていました。
出る時と出ない時があるので・・・

自分の処理がまずいせいだと思っていましたが、豆乳側だったのでしょうか?
OceanLightさんのように、デバック画面が出たことはありませんが・・・


Re: 長時間プレイは不向き? 投稿者 : OceanLight(nthkid191180.hkid.nt.ftth.ppp.infoweb.ne.jp)
- 2010/01/14(Thu) 12:22 No.12626
 
Arrayオブジェクトが無限に増え続けているようで、
そのためかArrayの関数に対してのみエラーを出しているようです。

またappearで、実行したクラスと同じクラスを増やすとGCが一切行われず使用メモリがどんどん増えていくようです。


Ctrl+F10でデバッグウィンドウを出して、GCと書かれたボタンを押すとGCが行われるようですが、
これでも全く改善されませんね。


Re: 長時間プレイは不向き? 投稿者 : Triangle Ld.(i218-47-199-1.s06.a011.ap.plala.or.jp)
- 2010/01/15(Fri) 16:04 No.12627
 
$System.setStackSize()は、オブジェクトの一時変数(引数やvar宣言の変数など)を格納する領域を設定します。
これの値を大きくしすぎるとこれもページ違反になります。

Windowsでいうページとは、メモリを4KBに分割したうちの一つがページです。

ページ違反とは、アプリケーション1つが自由に使えるページを、すべて使い切ってしまい、システムやほかのアプリケーションのページ領域を圧迫しそうになるとWindowsが自動で出すエラーです。

Arrayが無限に増えるということは、forかwhileの中でnewしているのでしょうか?


Re: 長時間プレイは不向き? 投稿者 : Triangle Ld.(i218-47-199-1.s06.a011.ap.plala.or.jp)
- 2010/01/15(Fri) 16:08 No.12628
 
アプリケーションが自分でエラーを制御していると、質問のようなことが起きます。Windowsとの間で干渉が起きているようです。

「参照カウントが負になりました。」は、おそらくWindowsが
勝手にガーベージコレクタ的なこと(おそらくメモリの小さな空きを詰める作業)をして、適当に長時間使われなかったメモリを開放してしまったんだと、私は思います。

Windowsがもっとましになってくれれば、こんなことはおきないはずです。

連投失礼。


Re: 長時間プレイは不向き? 投稿者 : Triangle Ld.(softbank219014238038.bbtec.net)
- 2010/01/16(Sat) 13:15 No.12629
 
でもプログラムでもガーベージコレクタがすることはできるんですよね。

たとえばオブジェクト変数ですが、以下のようなプログラムは長時間プレイに向いていません。
Script:
hoge = 12;
print(hoge);
piyo = 5;  //(1)
print(piyo);

(1)の時点で、hogeは使われなくなるので、うまくガーベージコレクタが働いていれば
変数hogeを解放し、その領域をpiyoに使うはずです。

でもこう(↓)すれば、ガーベージコレクタは必要なくなるのです。
Script:
hoge = 12;
print(hoge);
hoge = 5; //piyo=>hoge(hogeの使いまわし)
print(hoge);

このスクリプト内で不要になる変数はないので、例のスクリプトより長時間プレイできます(でも出来上がっているものから変数を使いまわすのは、プログラムの流れを何通りも読まないと難しいです)。

参考まで。


おなまえ
Eメール
タイトル
メッセージ
推薦記事
添付File
削除キー (自分の記事を削除時に使用。英数字で8文字以内)
文字色