MrLoick / emo-framework

Automatically exported from code.google.com/p/emo-framework
BSD 3-Clause "New" or "Revised" License
0 stars 0 forks source link

application crashes at sprite#load/remove #2

Closed GoogleCodeExporter closed 8 years ago

GoogleCodeExporter commented 8 years ago
emoを使用し始めた他のプログラマからスプライトのremoveで��
�ちると
報告があったのでその部分だけを切り出したスクリプトを��
�付します。
このプログラムはiPhone(エミュ)で起動させ3回画面をタッチ��
�ると
テクスチャのリリースあたりでBADアクセスで止まります。
このサンプルはパズルゲームですべてのピースを消した時��
�動作に相当します。

Original issue reported on code.google.com by sat...@gmail.com on 30 Aug 2011 at 2:46

Attachments:

GoogleCodeExporter commented 8 years ago
タッチイベント内でスプライトの load や remove 
などのリソースを食う処理を行うと落ちやすい気がしてい��
�す。show() や hide() を使った方がいいと思います。

load や remove は onDispose などで行うか、onDrawFrame 
などで行うといいと思います。

http://code.google.com/p/emo-framework/source/browse/trunk/iOS-Examples/Resource
s/modifier_rotate_example.nut

Original comment by infosia...@gmail.com on 30 Aug 2011 at 3:57

GoogleCodeExporter commented 8 years ago
show()やhide()を使うのは分かるのですがこの問題は保留にな��
�んでしょうか?
タッチした時にゲームオブジェクトが消滅しスプライトもre
moveするというのは
普通にありえる使い方ですし問題を内包したまま使用する��
�は気になります。
修正予定なのか保留もしくは放置なのかでオブジェクト管��
�方法などが
変わってきますのでどのようになるのか教えてください。

Original comment by sat...@gmail.com on 30 Aug 2011 at 5:31

GoogleCodeExporter commented 8 years ago
remove 
の件は、放置ではないですが修正の目処はついていません��
�ステータスも Accepted にしているのですが・・・

Original comment by infosia...@gmail.com on 30 Aug 2011 at 8:03

GoogleCodeExporter commented 8 years ago
了解しました。Acceptedというのは修正対象にはなるんですね
。
removeは使用するスプライトが全部消えた場合にテクスチャ��
�ソースまで
開放されますが出来ればキャッシュしておきたいのでリソ��
�スロック用に
ダミースプライトを1枚用意しそのうえでremoveを使おうと思�
��ます。
この場合ダミースプライトがあるためremoveで落ちないだろ��
�と考えてます。
回避方法が複数あるのでこの件は当分保留でも問題ないで��
�。

Original comment by sat...@gmail.com on 30 Aug 2011 at 8:31

GoogleCodeExporter commented 8 years ago
http://code.google.com/p/emo-framework/issues/detail?id=3#c5

上記 Issue の BAD ACCESS はこちらの Issue に近いと思われるので
コメントを移動しました。

> Comment 5 by sat...@gmail.com, Today (13 hours ago)
> 
> 
Line使用時のBADアクセスはLineが原因ではなくonDrawFrame内でText
Spriteを生成し
> 
load()を使用していたのが引き金になっていたようです。onLoa
dに移して解決しました。
> 念のため報告しておきます。

Original comment by infosia...@gmail.com on 31 Aug 2011 at 10:33

GoogleCodeExporter commented 8 years ago

Original comment by infosia...@gmail.com on 31 Aug 2011 at 10:39

GoogleCodeExporter commented 8 years ago
マウスイベントなどから実行すると落ちやすいと思ってい��
�したが、onDrawFrame 内で load/remove 
しても落ちるということは、スレッドなどに起因するもの��
�はないようですね。

それであれば、過負荷をかけすぎると落ちるとか、時間を��
�けすぎると落ちるとか、そういうことなのかもしれません�
��ちなみに「かわずたんたたき!」では、専用のローディン
グ画面を用意したり、タイトル裏でプリロードしたりして��
�ーム中に load/remove しないように実装しました。

Original comment by infosia...@gmail.com on 1 Sep 2011 at 3:32

GoogleCodeExporter commented 8 years ago
問題が解決したと思っていたんですがどうも不安定でBADア��
�セスが頻繁に発生します。
MenuやGameシーンへの行き来はそのつどStage().load(Menu());やStage(
).load(Game());
などのようにインスタンスを生成しています。その時スプ��
�イトのloadやremoveは
呼ばれるのですがシーン移行するのがタッチされた時やonDra
wFrame内からなので
結果としてタッチされた時にloadやremoveが走ってしまってい�
��す。

MenuもGameも先にインスタンスを生成しておく方法も確かにあ
りますがそれしか出来ないと
大量の画像を切り替えるなどのリソースの切り替えが出来��
�くなってしまいます。
これは解決しないとならない問題なので暫くこの件を調査��
�てみます。

Original comment by sat...@gmail.com on 1 Sep 2011 at 6:33

GoogleCodeExporter commented 8 years ago
なるほど。ちなみに onLowMemory は使われていますか?iPhone 
の場合、意外とすぐに onLowMemory 
が発生してそこで何も対策しないと突然落とされたり、と��
�うことがありました。

http://code.google.com/p/emo-framework/wiki/onLowMemory

また、emo 
では読み込んだテクスチャはキャッシュされるのですが、��
�はりメモリを食います。テクスチャのキャッシュは同じテ�
��スチャを使う複数のスプライトをロードする時に有効です
が、ロードがすべて終わった後は必要ないものです。onLowMem
ory 
が起こるとまずキャッシュが自動的にクリアされるのです��
�、明示的にクリアすることもできます。

http://code.google.com/p/emo-framework/wiki/Runtime#clearTextureCache

Original comment by infosia...@gmail.com on 1 Sep 2011 at 7:32

GoogleCodeExporter commented 8 years ago
調査途中で分かった事を少し書いておきます。
EmoLineDrawable::onDrawFrame内のglDrawArraysの発行で落ちるのですが
直前でglBindBuffer(GL_ARRAY_BUFFER, 
0);を発行しておくと落ちません。
また直前でGLint ret; 
glGetBufferParameteriv(GL_ARRAY_BUFFER,GL_BUFFER_SIZE, &ret);
を実行するとretに0以外が入っている事がありました。
glBindBuffer(GL_ARRAY_BUFFER, 
0);をし忘れている箇所があるかもしれません。

あとonLowMemoryはまだ使ってないです。メモリ不足については
必ず起きるものと
考えているので後でどうするか考えるつもりです。
本当にメモリに困ったらiPhone版はPVRTCも読めるよう改造をし
たり
サウンドも圧縮が効くm4aへの対応も必要かもしれないと考��
�ています。

Original comment by sat...@gmail.com on 1 Sep 2011 at 8:15

GoogleCodeExporter commented 8 years ago
検証ありがとうございます。

EmoLineDrawable 以外には glBindBuffer(GL_ARRAY_BUFFER, 0); 
が入っているように思います。いずれも描画直後にバッフ��
�をクリアしたいのですが、EmoLineDrawable 
についても直前ではなく直後に発行するとどうなりますか��
�

glDrawArrays(GL_LINES, 0, 2);
glBindBuffer(GL_ARRAY_BUFFER, 0);

こちらでも検証していますが再現できていません。
よろしくお願いします。

Original comment by infosia...@gmail.com on 1 Sep 2011 at 10:09

GoogleCodeExporter commented 8 years ago
後ろでglBindBuffer(GL_ARRAY_BUFFER, 
0);をやってもBADアクセスが出ます。
glBindBufferで全ソースにgrepを掛けると
EmoDrawable::bindVertexとEmoMapDrawable::createMeshTextureBufferの
2箇所でglBindBuffer(GL_ARRAY_BUFFER, 0);ではさんでいないので
はさんでみたところ落ちなくなりました。
今日は会社を退社しますので検証事項があればまた明日行��
�ます。

Original comment by sat...@gmail.com on 1 Sep 2011 at 11:00

GoogleCodeExporter commented 8 years ago
検証ありがとうございます。
挟む必要があるんですね。

すみませんが、二度手間になるとよくないので問題が出な��
�なったソースを添付して頂くことは可能ですか?

Original comment by infosia...@gmail.com on 1 Sep 2011 at 11:12

GoogleCodeExporter commented 8 years ago
ファイルを添付します。はさむ必要があると言うよりglVertex
Pointer関数は
バッファをバインドしてる時が引数にオフセットを指定し��
�バインドされていない時は
アドレスを指定するという風に挙動が変化するのが原因で��
�かね。
なのでglVertexPointerを実行する時にバッファがバインドされ��
�いたため落ちたと思います。
すべてVBOで設計を統一していたらもしかすると遭遇しなか��
�たかもしれませんね。

Original comment by sat...@gmail.com on 1 Sep 2011 at 11:23

Attachments:

GoogleCodeExporter commented 8 years ago
添付ありがとうございます。この修正をレポジトリにコミ��
�トしました。
Android 版の方にも同じ修正を入れました。

http://code.google.com/p/emo-framework/source/diff?spec=svn1162&r=1162&format=si
de&path=/trunk/Emo-iOS/libs/emo/EmoDrawable.m

http://code.google.com/p/emo-framework/source/diff?spec=svn1162&r=1162&format=si
de&path=/trunk/Emo-iOS/libs/emo/EmoMapDrawable.m

http://code.google.com/p/emo-framework/source/diff?spec=svn1162&r=1162&format=si
de&path=/trunk/Emo-Android/jni/emo/Drawable.cpp

iOS/Android 
両方でこの修正を適用した「かわずたんたたき!」を動か��
�てみましたところ問題なさそうでした。

Original comment by infosia...@gmail.com on 1 Sep 2011 at 12:23

GoogleCodeExporter commented 8 years ago
「かわずたんたたき」のゲーム中に Line 
をロードするテストなどを実行してみましたが、修正前、��
�正後とも落ちませんでした。

> 
サウンドも圧縮が効くm4aへの対応も必要かもしれないと考��
�ています。

すでにご存じかもしれませんが、 iOS 版の方は Audio File 
Service 
を使ってサウンドファイルを読み込んでいるため、wav 
以外のサウンドファイルにも対応しています。Android 版は 
wav のみになります。

http://developer.apple.com/library/ios/#documentation/MusicAudio/Reference/Audio
FileConvertRef/Reference/reference.html#//apple_ref/doc/c_ref/AudioFileTypeID

Original comment by infosia...@gmail.com on 1 Sep 2011 at 1:37

GoogleCodeExporter commented 8 years ago
iOSの場合対応サウンドフォーマットが増える事はAPI 
Referenceに記述されてると良いと思います。
wavしか再生出来ないなら使えないと判断されると残念です��
�。

あと一番上で添付したmain.nutで落ちる件ですが少し分かった
のがEmoImage::dealloc内の
[filename 
release];がすでに開放されたか壊れているものを開放しよう��
�して落ちて
いる感じです。上のサンプルでは最初にB.pngを開放しますが
その時はfilenameは正常で
次のA.pngを開放しようとしている時はfilenameは異常になって�
��ました。
しかしたまにA.pngと入ってくる時がありその場合は落ちませ
ん。

Original comment by sat...@gmail.com on 2 Sep 2011 at 3:59

GoogleCodeExporter commented 8 years ago
実は、API reference には書いてあるのです・・・
http://code.google.com/p/emo-framework/wiki/AudioChannel#Supported_audio_format:

[filename release] の件ですが、原因が分かりました。EmoDrawable 
の方で NSString の解放が間違っていたのが Texture 
の方に波及していたようです。

修正したものをコミットしました。これで試して頂けます��
�?
http://code.google.com/p/emo-framework/source/detail?r=1164

よろしくお願いします。

Original comment by infosia...@gmail.com on 2 Sep 2011 at 4:18

GoogleCodeExporter commented 8 years ago
まだおかしなところがあったので、さらに修正しました。

こちらを使ってください。
http://code.google.com/p/emo-framework/source/browse/trunk/Emo-iOS/libs/emo/EmoD
rawable.m?spec=svn1165&r=1165

Original comment by infosia...@gmail.com on 2 Sep 2011 at 4:49

GoogleCodeExporter commented 8 years ago
数回実行してみたところ問題無く動きました。
この件は解決でいいと思います。

>実は、API reference には書いてあるのです・・・

多分(mp3 m4a 
etc...)みたいな感じで補足が書いてあるほうがいいかなと思�
��ます。
そうすればmp3が使えるか調べたい人は「emo framework 
mp3」などで
検索して気づいてくれると思います。

Original comment by sat...@gmail.com on 2 Sep 2011 at 5:26

GoogleCodeExporter commented 8 years ago
この件とは関係ないのですがスクリプトのエラーログなど��
�文字化けしていたので
コードを少し変更して試してみました。
ちゃんと出ているようですがスクリプトのエラーではemoのTA
Gは無いほうが見やすい
と思います。

void sq_printfunc(HSQUIRRELVM v, const SQChar *s,...) {
/*
    va_list args;
    va_start(args, s);
    SQChar* str = va_arg(args, SQChar*);
    LOGI(str);
    va_end(args);
*/
    char buf[4096];
    va_list vl;
    va_start( vl, s );
    vsprintf(buf, s, vl);
    LOGI( buf );
    va_end( vl );
 }

/*
 * error function
 */
void sq_errorfunc(HSQUIRRELVM v, const SQChar *s,...) {
/*
    va_list args;
    va_start(args, s);
    SQChar* str = va_arg(args, SQChar*);
    callSqFunction_Bool_String(v, EMO_NAMESPACE, EMO_FUNC_ONERROR, str, SQFalse);
    LOGE(str);
    va_end(args);
*/
    char buf[4096];
    va_list vl;
    va_start( vl, s );
    vsprintf(buf, s, vl);
    callSqFunction_Bool_String(v, EMO_NAMESPACE, EMO_FUNC_ONERROR, buf, SQFalse);
    LOGE( buf );
    va_end( vl );
}

Original comment by sat...@gmail.com on 2 Sep 2011 at 5:51

GoogleCodeExporter commented 8 years ago
検証ありがとうございます。Audio format 
についてはもっと分かりやく書いた方がいいようですね。��
�グのタグは Android 
版と合わせた形でこのようにした気がします。コンパイル��
�プションなどでシンプルなログを表示できるようにしてみ�
��うと思います。ログの文字化けについては元々日本語を使
わないつもり(Android 
の方で問題が発生するため、Squirrelをオプションでマルチバ
イト非対応にしています)なのですが、見てみます。

Original comment by infosia...@gmail.com on 2 Sep 2011 at 7:24

GoogleCodeExporter commented 8 years ago
以前私が投稿しました修正版sq_printfunc、sq_errorfuncの件です��
�試されたでしょうか?
どうやらこの修正版でないとスクリプトのバグが分からな��
�ようです。
fontのテクスチャをXCODEに追加し忘れて原因不明のバグにハ��
�っていた方がいたので
sq_printfunc、sq_errorfuncを修正したところファイルが見つから��
�いなどの
エラーがちゃんと出でて解決出来ました。
以前はAndroidでバグの表示がおかしいと思っていたのですがX
CODEでも同様のようです。
一度確認をお願い出来ますでしょうか?

Original comment by sat...@gmail.com on 12 Sep 2011 at 7:22

GoogleCodeExporter commented 8 years ago
この修正で、 4096 
バイト以上の文字列が来ても大丈夫でしょうか?文字化け��
�修正だと思っていたのですが、私の方でスクリプトに日本�
��を入れてもやはり文字化けしていたのでそのままにしてい
ました。現在のものが問題なのは、パラメータの一番目し��
�使っていないということですね?先に全てのパラメータを�
��るように修正しようと思います。

Original comment by infosia...@gmail.com on 12 Sep 2011 at 9:57

GoogleCodeExporter commented 8 years ago
パラメータの1番目しか使っていないためエラーが分からな�
��ったという事ですね。
それなら私の上げた修正は必要なくてエラーメッセージが��
�て見えるように
なってくれればそれで結構です。日本語が文字化けするの��
�日本語を使用しないので
問題ないです。
よろしくお願いします。

Original comment by sat...@gmail.com on 12 Sep 2011 at 10:57

GoogleCodeExporter commented 8 years ago
了解です。エラーメッセージについて、 4096 
文字まで全てのパラメータを表示するようにした修正をコ��
�ットしました。

http://code.google.com/p/emo-framework/source/detail?r=1183

Original comment by infosia...@gmail.com on 12 Sep 2011 at 11:07

GoogleCodeExporter commented 8 years ago
素早い対応ありがとうございます。
今少々手が込んでまして明日出張も重なるため確認が明後��
�になってしまいます。
確認が完了次第報告いたします。

Original comment by sat...@gmail.com on 12 Sep 2011 at 11:20

GoogleCodeExporter commented 8 years ago
iPhoneでのエラー表示確認しました。
どのファイルのどの行でエラーが出ているかなど欲しい情��
�が表示されていました。
ただ試しにabc;などの不正なコードを入れてエラーを表示さ�
��るとemoのTAGも
表示されエラー表示が横に長くなり分かりにくいというの��
�気になりました。

以下にエラーの最初の数行を張りますがTAGの表示は最初だ��
�でも良いと思います。
TAGが消えるとエラーの内容やCALLSTACKの呼び出しが分かりや��
�くなり助かります。

2011-09-14 15:26:02.199 TestEmo[1973:707] EmoFramework ERROR 
AN ERROR HAS OCCURED [the index 'abc' does not exist]
2011-09-14 15:26:02.207 TestEmo[1973:707] EmoFramework ERROR 
CALLSTACK
2011-09-14 15:26:02.211 TestEmo[1973:707] EmoFramework ERROR *FUNCTION 
[onLoad()] 
/var/mobile/Applications/3B61D365-F9AA-4DEA-8ECB-F6683DD4A40C/TestEmo.app/main.n
ut line [25]
2011-09-14 15:26:02.214 TestEmo[1973:707] EmoFramework ERROR *FUNCTION [load()] 
/var/mobile/Applications/3B61D365-F9AA-4DEA-8ECB-F6683DD4A40C/TestEmo.app/runtim
e.nut line [1640]

Original comment by sat...@gmail.com on 14 Sep 2011 at 6:48

GoogleCodeExporter commented 8 years ago
確認ありがとうございます。ログの出力については、Android 
の表示と合わせたものなのですが、確かに長いので iOS 
版については次のバージョンからタグやエラーレベルの表��
�を消すオプションを付けようと思っています。

Original comment by infosia...@gmail.com on 14 Sep 2011 at 1:49

GoogleCodeExporter commented 8 years ago
オプションで消せる件了解しました。
もし可能でしたらエラー表示の実装をC++側ではなくRuntime.nut
内で実装し、
使う側が関数をオーバーライドしてダグを消すようになっ��
�いても良いかもしれません。
その場合エラーメッセージを加工したり保存したり通信で��
�ったりと色々出来そうです。
面倒であれば無視してもらって構いません。

Original comment by sat...@gmail.com on 15 Sep 2011 at 3:26

GoogleCodeExporter commented 8 years ago
現在エラーメッセージをカスタマイズする機能はありませ��
�が、実行時エラーが起きた際にカレントクラスの onError 
という関数が呼ばれるようになっています。このコールバ��
�クを実装してエラーの保存や送信を行うこともできます。�
��こで渡されるメッセージはタグやエラーレベルを含みませ
ん。

class A {
  function onLoad() {
    this_method_will_notfound();
  }
  function onError(msg) {
    // 'msg' equals: AN ERROR HAS OCCURED [the index 'this_method_will_notfound' does not exist]
    print("DO SOMETHING WITH MY ERROR: " + msg);
  }
}

Original comment by infosia...@gmail.com on 15 Sep 2011 at 8:11

GoogleCodeExporter commented 8 years ago
そんな機能があったんですね。
将来ターミナルソフトを作成しリモートから開発やデバッ��
�をしたいと考えて
いるのでその時に役立ちそうです。ちなみに私は今までそ��
�やってSquirrelでの
開発を行っていました。

Original comment by sat...@gmail.com on 15 Sep 2011 at 10:04

GoogleCodeExporter commented 8 years ago
先ほど新しいバージョンをリリースしました。

このバージョンから、ログのタグ削除ができるようになり��
�した。onLoad などで emo.Runtime.enableSimpleLog() 
を呼ぶと、ログにタグとエラーレベルが付加されなくなり��
�す。エラーレベルを表示したい場合は 
emo.Runtime.enableSimpleLogWithLevel() を使います。

API ドキュメントは以下です。
http://code.google.com/p/emo-framework/wiki/Runtime#enableSimpleLog%28enable_=_t
rue%29

Original comment by infosia...@gmail.com on 20 Sep 2011 at 4:11

GoogleCodeExporter commented 8 years ago
0.1.5 build 
19をiOSにて確認してみましたがemo.Runtime.enableSimpleLog()をonLoad�
��
呼んでもタグが付いたままのようです。
Androidのサンプルも少し動かしてみましたがこちらは問題な�
��はありませんでした。

Original comment by sat...@gmail.com on 20 Sep 2011 at 6:44

GoogleCodeExporter commented 8 years ago
タグがついたままというのは、以下のような状態ですか?

2011-09-20 16:16:05.934 EmoApp[853:207] EmoFramework INFO onLoad

emo.Runtime.enableSimpleLog() を呼ぶと、こうなっていませんか?
2011-09-20 16:14:42.274 EmoApp[817:207] onLoad

enableSimpleLog は EmoFramework INFO 
のような表示のところを消す機能で、これを実行しても日��
�やアプリ名は常に出るようになっています。

Original comment by infosia...@gmail.com on 20 Sep 2011 at 7:22

GoogleCodeExporter commented 8 years ago
そういう事でしたか。確かにそうなっています。
私は問題ないのですがSquirrel未経験者の多くが使用する予定
で
今のエラー表示だとみんなコールスタックの見方とか気づ��
�てくれないので
エラー表示をSquirrelのシンプルなもので見たかったというの
があります。

なんとなくNSLogで表示するとこうなるんだろうと分かったの
で対処方が
なければこのままで結構です。
そうのち解決法が分かればこちらでソースを修正して使用��
�る事にします。

Original comment by sat...@gmail.com on 20 Sep 2011 at 8:08