1155967
Tonyu BBS
[再読み込み] [ホームページ] [使いかた] [ワード検索] [管理用]

おなまえ

Eメール
題  名  
コメント(http(s)://などのURLが含まれていると投稿できないことがあります)
添付プログラム
※プログラムに関する質問は、そのプログラムを添付して送ると対応が早くできます
添付方法...
削除キー (自分の記事を削除時に使用。英数字で8文字以内)
文字色
1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : ぐりーんげーむ。(p14139-ipngn2101hodogaya.kanagawa.ocn.ne.jp)
- 2012/09/08(Sat) 01:12 No.13587
 


質問では無いのですが、過去ログに情報が見当たらず
この仕様のせいで一時間近く潰されたので書き込みます。
Tonyuのバージョンは1.26です。

まず新しいプロジェクトで下記のオブジェクトを作って実行してください。

//オブジェクトその1
extends SpriteChar;
while(1) {
  print("☆");
  update();
}

//オブジェクトその2
extends SpriteChar;
while(1) {
  j=1;
  for (i=0;i<9999999;i++) {j++;}
  print("★");
  update();
}

コンソールには☆★☆★...と表示される、と思っていたのですが
いざ実行すると☆☆☆☆...となってしまいます。
どうやら、その2はfor文の途中で処理を飛ばされているようです。
これが並列処理……!!
1フレーム1オブジェクトに処理を集中させるのは止めたほうが良さそうです。

特にロードで大量のファイルを読み込むときは
読み込む前に他のオブジェクトが動き出して、予想だにしないバグができたりします。
updateとは何だったのか……
直列処理に慣れてる人は特に忘れやすい仕様だと思うので気をつけましょ〜(^o^


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : マッキー(p3063-ipbf1910sapodori.hokkaido.ocn.ne.jp)
- 2012/09/08(Sat) 05:39 No.13588
 
この仕様って厄介な時ありますよねー!

ちょっと補足しに来ました!
一応無理やりな方法ではありますが、1つのオブジェクトに処理を集中させても処理が飛ばされないようにすることができます。

ただ、この処理はめんどくさいところがあるので、
普通にやるなら、大量のファイルを読み込むときは、読み込みオブジェクトが読み終わるまで、
他のオブジェクトが待つような方法を使った方が、やりやすいと思います。
・timeStop()で他のオブジェクトを止めて、読み終わったらreleaseAll()で再開させる
・読み込み完了のフラグをたてる変数を作り、読み込み中は0、読み終わったら1にして、他のオブジェクトはその変数が1になるまで待つ
など

無理やりな方法とは、execメソッドを使った方法のことで、スーパープロセッサのReadMeでも紹介しました。
ttp://hoge1e3.sakura.ne.jp/tonyu/project/pages/viewProject.cgi?mainkey=277&

exec()はそのオブジェクトを実行させるメソッドです。
オブジェクト生成時にappearを使えば、Tonyuが自動的にオブジェクトを実行しますが、それは自動的にexec()を呼び出しているからです。
newだけでオブジェクトを生成すれば、そのオブジェクトは動作しませんが、exec()を使うと手動でオブジェクトを実行します。

ぐりーんげーむ。さんの例をexec()の方法でやるなら、下記のようになります。

//オブジェクトその1 (MainChar.tonyu)
extends SpriteChar;
while(1) {
  print("☆");
  update();
}

//オブジェクトその2 (MainChar2.tonyu)
extends SpriteChar;
if (mode == null) { // メインの処理
  
  obj = new MainChar2(); // オブジェクトを生成
  obj.mode = 1; // exec()で実行されるオブジェクトになる
  proc = new classes.lang.Process(obj, "", 1); // Processオブジェクトを生成
  
  while(1) {
    $MainChar2_j = 1; // カウントリセット
    for (i=0; i<2000; i++) {
      proc.exec(); // 2000回ずつ実行
    }
    print("★");
    update();
  }
  
} else if (mode == 1) { // 分散させる処理
  
  while (1) {
    for (i=0; i<5000; i++) {
      $MainChar2_j ++; // 5000回繰り返す
    }
    update();
  }
  
}

オブジェクトは、MainCharが1つ、MainChar2が2つ作られます。
MainChar2は自分自身をもう1つ作り2つになりますが、1つはオブジェクトを繰り返し実行させ、
もう1つはexec()で呼び出されたとき処理を実行します。
exec()はProcessオブジェクトから出ないと呼び出せないので、
ProcessにMainChar2を関連付けて、Processを生成してから、
exec()を呼び出します。

5000回プラス1するオブジェクトを2000回実行しているので、
10000000回プラス1したことになります。
(回数はバランス良く割り振らないと処理が途中で飛ばされてしまいます)
ただ、処理を途中で飛ばすことがなくなるので、
処理が返ってくるのに時間がかかり、Tonyuウィンドウに応答なしと出ることがあります。

反応が鈍くなるのを避けたいなら、普通の方法で…
どうしても処理が飛ばされないようにしたいなら、exec()の方法
というように使い分けるといいとでしょう!


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : リセッタ(ai126213005219.5.tss.access-internet.ne.jp)
- 2012/09/09(Sun) 02:20 No.13589
 
ふむふむ、なるほど。
なかなか興味深い話題ですね。
スーパープロセッサのReadMe を きちんと読めば、
表示結果は、”☆☆☆☆……☆★☆……☆☆☆……”になると。

# 処理を飛ばすを、以降キャンセルしちゃうと解釈しちゃう人もいるかもと

#  スーパープロセッサのReadMeで 少し気になった点
#「オブジェクトの処理量を増やす方法2」
#  while (1) {
#    proc.exec(); // 実行
#    proc.aobj.draw();  // 描画
#    update();
#  }
#  は、
#  function onDraw() {
#    proc.aobj.draw();  // 描画
#  }
#  じゃ、だめなの?


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : マッキー(p4117-ipbf805sapodori.hokkaido.ocn.ne.jp)
- 2012/09/10(Mon) 01:23 No.13590
 
>表示結果は、”☆☆☆☆……☆★☆……☆☆☆……”になると。
No.13588 のプログラムは、MainCharとMainChar2のオブジェクトを1つずつ作成して実行すれば
処理が重いながらも、"☆★☆★☆★…" と表示されます。

>処理を飛ばすを、以降キャンセルしちゃうと解釈しちゃう人もいるかもと
そうですね。ReadMeに書いてるように「オブジェクトの処理が後回しにされる」といった方が誤解されないかもしれません。(自分で書いておきながら忘れてた…)

function onDraw() {} で proc.aobj.draw(); を呼び出しても問題なく動きます。
ただ、onDraw()は注意が必要でこのメソッドは設計中にも呼び出されます。
設計中は、procにオブジェクトが入っていない状態で proc.aobj.draw(); が呼び出されるのでエラーが発生してしまいます。
onDraw() で呼び出すときは設計中に真を返す designMode() を使って、実行時にだけ proc.aobj.draw(); を呼び出した方がいいです。

ちなみに、onDraw() でprocにオブジェクトを生成して代入することもできますが、onDraw() は update() の後に呼ばれるので、今度は proc.exec(); でエラーになります。
if (proc) proc.exec(); と書けばエラーは無くなりますが可読性が悪くなるので、onDraw() 内ではオブジェクトを作らない方がいいです。

以下 onDraw() を使った場合の「オブジェクトの処理量を増やす方法2」のプログラム

/* MainChar.tonyu */
extends SpriteChar;

// オブジェクトとプロセスを生成
proc = new classes.lang.Process(new SubChar(100, 100, 7), "", 1);

function onDraw() {
  if (!designMode()) proc.aobj.draw(); // 描画
}

while (1) {
  proc.exec(); // 実行
  update();
}

/* SubChar.tonyu */
extends SpriteChar;

while (1) {
  x++;
  update();
}


処理を後回しにする仕様は厄介なこともありますが、プログラムミス(無限ループとか)したときに Tonyu が固まりにくい(応答なしになりにくい)という長所?もあるんですよねー
(Tonyu自体昔に作られたので、Windows 98 とかの低スペックPCでも固まらないようにそういう仕様が作られたのかも…)
実際、exec()で処理が後回しにされないようにすると、反って重くなってしまうことがあります。それに、ソースの可読性が悪くなります。
まあ、こだわりを持った中級者・上級者向けの方法だと思ってください(^^;


1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : リセッタ(ai126213147065.5.tss.access-internet.ne.jp)
- 2012/09/10(Mon) 14:15 No.13591
 
返信ありがとうございます。
描画は、描画タイミングでやりたかったもので。

キッチリ作るとすると こうかな?

function onDraw() {
// super.onDraw();  // “onDraw()”メソッドが定義済のクラスを継承している場合のみコメントを外す……やりすぎ?
  // デザインモードではなく、かつ、“proc”が定義済なら 描画
  if (!designMode() && proc) proc.aobj.draw();
}


Re: 1フレーム内の処理限界によるオブジェクトの動作のスキップ 投稿者 : マッキー(p1070-ipbf908sapodori.hokkaido.ocn.ne.jp)
- 2012/09/11(Tue) 21:57 No.13592
 
>  if (!designMode() && proc) proc.aobj.draw();
なるほど! この条件式の方がエラーになりにくくより安全ですね。

そういえば言い忘れてたことがありました…
ReadMeにも書くの忘れていましたが、appearを使わないで生成したオブジェクトは、
die() を使っても消えてくれません。あと、wait() も無視されます。

生成時にappearを使った時は、Tonyu内部で die(), wait() を呼び出したときの管理を自動的に行ってくれるのですが、
appearを使わないと自動管理の対象外になります。

appearを使わないときは、wait() は updateEx() で代用し、
die() は _pProc.kill(); と呼び出して代用できます。
_pProc はPlainCharクラス(SpriteChar,DxChar,TextChar,PanelChar,SecretChar 等の親クラス)の隠し変数で、自分を動かしてくれるProcessオブジェクトを指しています。

[オブジェクトの待機・削除ができるように]
/* MainChar.tonyu */
extends SpriteChar;

// オブジェクトとプロセスを生成
proc = new classes.lang.Process(new SubChar(100, 100, 7), "", 1);

function onDraw() {
 //super.onDraw();  // “onDraw()”メソッドが定義済のクラスを継承している場合のみコメントを外す……やりすぎ?
  // デザインモードではなく、かつ、“proc”が定義済なら 描画
  // 追加:proc.aobjが死ぬと変数の値が0になりエラーになるので proc.aobjも判断
  if (!designMode() && proc && proc.aobj) proc.aobj.draw();
}

while (1) {
  
  if (proc) proc.exec(); // 実行
  if (getkey(88)) wait(60); // Xキー:1秒待つ
  if (getkey(86)) die();    // Vキー:消す
  update();
}

/* SubChar.tonyu */
extends SpriteChar;

function onDie() {
  _pProc.kill(); // kill()だけだとオブジェクト変数がゼロクリアされないので、一応die()を呼び出すようにする
}

while (1) {
  x++;
  if (getkey(90)) updateEx(60); // Zキー:1秒待つ
  if (getkey(67)) die();        // Cキー:消す
  update();
}


ちなみに、他のオブジェクトのオブジェクト変数やグローバル変数に、消したいオブジェクトが参照されていると、そのオブジェクトは完全には消えません。
://hoge1e3.sakura.ne.jp/tonyu/wiki/index.php?%A5%AC%A5%D9%A1%BC%A5%B8%A5%B3%A5%EC%A5%AF%A5%BF

「ツール」→「オブジェクト一覧」ウィンドウを見ると、オブジェクトが残っているかどうか見れます。
設計中の画面で作られたオブジェクトは「$MyChar, $MyChar_1, $MyChar_2, …」のようにグローバル変数ができてしまうため、
die() を呼び出しても、グローバル変数がオブジェクトを参照しているため、一覧に残りっぱなしになります・・・

ページ切替しても、一覧に残りっぱなしでどんどんたまっていきますし…
何回もページ切替すると一覧から消えることもありますが、その割にはメモリ使用量減らないし…

kill() 使ってたらもしかしてメモリリークを防げるんじゃないかと思い、またスーパープロセッサのように Kernel を改造してたので、返信遅れました… (^^;;
結局、知らない変数からもオブジェクトが参照されているようで、設計中の画面で作られたオブジェクトは完全には消えてくれませんでした…
(やっぱり、メモリリークからは逃れられない・・・(--;) )

終了時エラー 投稿者 : 雲プリン(20.4.87.61.ap.yournet.ne.jp)
- 2012/09/04(Tue) 22:48 No.13580
 


11996
のような
(抜粋)
ランタイムを作成して出来たゲームを起動させ、終了させようとする(或いはウィンドウを閉じようとする)と
「Player.exeのアドレス 004CF67 でアドレス 00000000」というエラーが出てしまいます。

と同じ現象が起きてしまいます。
これはやはり画面サイズを変える以外に対処法はないのでしょうか・・・


自己解決? 投稿者 : 雲プリン(20.4.87.61.ap.yournet.ne.jp)
- 2012/09/05(Wed) 01:05 No.13581
 
ちゃんとした対処法がわからないのですが、
とりあえず、回避ができたので回避方法を記載します
あくまでも11996にあるサイズ変更と別の対処法です。

@画面サイズをコードで固定させない。
A終了後に対象のオブジェクトを殺すように指定する。(実際にどのタイミングで殺してるかは知りませんが…)

Aの手順として かなりめんどくさいかもしれないけど
怪しいオブジェクトを見つける作業に入ります。
逆に考えると、怪しいオブジェクトがいなければ
ランタイムを作成後対象の画面では正常に終了するはずです

もし、怪しいオブジェクトがいれば
そいつを監視してもし死んだらそいつを殺す
って入れました・・・



aクラス(原因)、
while(1){
update();
}

bクラス、
while(1){
if($a.isDead() == 1)$a.die();
}

もしかして最初から配置してあるオブジェクトにだけ起きるのかな?・ω・`


こんなの絶対におかしいよ


Re: 終了時エラー 投稿者 : リセッタ(ai126194007208.1.tss.access-internet.ne.jp)
- 2012/09/07(Fri) 13:35 No.13586
 
記事 11996 ですが、自分の環境では正常終了しました。
・tonyuSystem - Ver. 1.24
・Windows XP Ver. 2002 S.P. 3

ただ、11996の場合ですが幾つか気になる点があります。

・“start”クラスが、初めに実行される事を前提に構成されている。
 フレーム(プロジェクト)マネージャの“onStart()”メソッドで定義するべきでは?
・画面サイズの設定前に“$window.sizeable”に“1”を設定していない。

現象が出ないので効果は不明ですが・・・・・・

推薦記事: 11996

質問です 投稿者 : 三角絞め(s226050.dynamic.ppp.asahi-net.or.jp)
- 2012/09/06(Thu) 11:42 No.13582
 


extends SpriteChar;
while(1) {
  
 if ($map.getAt(x,y)==$pat_Maze+1){
  if (getkey(39)>0 && x<$screenWidth ) x+=3; 
  if (getkey(37)>0 && x>0 ) x-=3; 
  if (getkey(40)>0 && y<$screenHeight ) y+=3;
  if (getkey(38)>0 && y>0 ) y-=3;
}
 update();
}

マップを障害物にしようとしたのですが、プレイヤーがくっついてしまいます。
どう修正したら良いのでしょうか。


めりこみだね 投稿者 : リセッタ(ai126194035161.1.tss.access-internet.ne.jp)
- 2012/09/07(Fri) 00:07 No.13583
 
まぐねさんのHP「TonyuアクションRPG( ttp://www.tonyu-arpg.com/ )」内、
[サンプルプログラム]-[自機の移動]-[左右移動]にヒントがあります。


Re: 質問です 投稿者 : S.Percentage(p25167-ipngn1401souka.saitama.ocn.ne.jp)
- 2012/09/07(Fri) 00:08 No.13584
 
はじめまして。

マップの当たり判定は移動方向で別にしたほうがいいのではないかと思います。
ちょっと長くなりますが、
if(getkey(39) > 0 && x < $screenWidth && $map.getAt(x + 16, y) == $pat_Maze+1) x += 3;
とすると多分うまくいきます。多分。
あと、めり込みを防ぐために、当たり判定を行う位置をキャラクタの端っこで行う必要があります。このめり込みのあたりはチュートリアルにあったはずなのでよく読んでみて下さい。


Re: 質問です 投稿者 : 三角絞め(s226050.dynamic.ppp.asahi-net.or.jp)
- 2012/09/07(Fri) 01:01 No.13585
 
移動方向ごとにしたら上手くいったようです。
ありがとうございました。

無題 投稿者 : kazz(ntchba123237.chba.nt.ngn2.ppp.infoweb.ne.jp)
- 2012/08/23(Thu) 23:27 No.13579
 


Hogeさん(このサイトの管理者)はまだ現役なんでしょうか?
もし見てくれているのならwikiの編集を一般にも可能、tonyu systemの本体のソースの公開をして欲しいです

検索・置換機能 投稿者 : *tak(203-179-207-160.ppp.bbiq.jp)
- 2012/08/19(Sun) 17:13 No.13578
 


検索・置換機能についてですが調子がいい時は使えるのですが
たまに「unmatch separater」とコンソールに表示されて使えなくなります

どうしたら使えるようになるのでしょうか?

.
[直接移動] [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22] [23] [24] [25] [26] [27] [28] [29] [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] [60] [61] [62] [63] [64] [65] [66] [67] [68] [69] [70] [71] [72] [73] [74] [75] [76] [77] [78] [79] [80] [81] [82] [83] [84] [85] [86] [87] [88] [89] [90] [91] [92] [93] [94] [95] [96] [97] [98] [99] [100] [101] [102] [103] [104] [105] [106] [107] [108] [109] [110] [111] [112] [113] [114] [115] [116] [117] [118] [119] [120] [121] [122] [123] [124] [125] [126] [127] [128] [129] [130] [131] [132] [133] [134] [135] [136] [137] [138] [139] [140] [141] [142] [143] [144] [145] [146] [147] [148] [149] [150] [151] [152] [153] [154] [155] [156] [157] [158] [159] [160] [161] [162] [163] [164] [165] [166] [167] [168] [169] [170] [171] [172] [173] [174] [175] [176] [177] [178] [179] [180] [181] [182] [183] [184] [185] [186] [187] [188] [189] [190] [191] [192] [193] [194] [195] [196] [197] [198] [199] [200] [201] [202] [203] [204] [205] [206] [207] [208] [209] [210] [211] [212] [213] [214] [215] [216] [217] [218] [219] [220] [221] [222] [223] [224] [225] [226] [227] [228] [229] [230] [231] [232] [233] [234] [235] [236] [237] [238] [239] [240] [241] [242] [243] [244] [245] [246] [247] [248] [249] [250] [251] [252] [253] [254] [255] [256] [257] [258] [259] [260] [261] [262] [263] [264] [265] [266] [267] [268] [269] [270] [271] [272] [273] [274] [275] [276] [277] [278] [279] [280] [281] [282] [283] [284] [285] [286] [287] [288] [289] [290] [291] [292] [293] [294] [295] [296] [297] [298] [299] [300] [301] [302] [303] [304] [305] [306] [307] [308] [309] [310] [311] [312] [313] [314] [315] [316] [317] [318] [319] [320] [321] [322] [323] [324] [325] [326] [327] [328] [329] [330] [331] [332] [333] [334] [335] [336] [337] [338] [339] [340] [341] [342] [343] [344] [345] [346] [347] [348] [349] [350] [351] [352] [353] [354] [355] [356] [357] [358] [359] [360] [361] [362] [363] [364] [365] [366] [367] [368] [369] [370] [371] [372] [373] [374] [375] [376] [377] [378] [379] [380] [381] [382] [383] [384] [385] [386] [387] [388] [389] [390] [391] [392] [393] [394] [395] [396] [397] [398] [399] [400] [401] [402] [403] [404] [405] [406] [407] [408] [409] [410] [411] [412] [413] [414] [415] [416] [417] [418] [419] [420] [421] [422] [423] [424] [425] [426] [427] [428] [429] [430] [431] [432] [433] [434] [435] [436] [437] [438] [439] [440] [441] [442] [443] [444] [445] [446] [447] [448] [449] [450] [451] [452] [453] [454] [455] [456] [457] [458] [459] [460] [461] [462] [463] [464] [465] [466] [467] [468] [469] [470] [471] [472] [473] [474] [475] [476] [477] [478] [479] [480] [481] [482] [483] [484] [485] [486] [487] [488] [489] [490] [491] [492] [493] [494] [495] [496] [497] [498] [499] [500] [501] [502] [503] [504] [505] [506] [507] [508] [509] [510] [511] [512] [513] [514] [515] [516] [517] [518] [519] [520] [521] [522] [523] [524] [525] [526] [527] [528] [529] [530] [531] [532] [533] [534] [535] [536] [537] [538] [539] [540] [541] [542] [543] [544] [545] [546] [547] [548] [549] [550] [551] [552] [553] [554] [555] [556] [557] [558] [559] [560] [561] [562] [563] [564] [565] [566] [567] [568] [569] [570]
- 以下のフォームから自分の投稿記事を修正・削除することができます -
処理 記事No パスワード

- Joyful Note -