Closed GoogleCodeExporter closed 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
show()やhide()を使うのは分かるのですがこの問題は保留にな��
�んでしょうか?
タッチした時にゲームオブジェクトが消滅しスプライトもre
moveするというのは
普通にありえる使い方ですし問題を内包したまま使用する��
�は気になります。
修正予定なのか保留もしくは放置なのかでオブジェクト管��
�方法などが
変わってきますのでどのようになるのか教えてください。
Original comment by sat...@gmail.com
on 30 Aug 2011 at 5:31
remove
の件は、放置ではないですが修正の目処はついていません��
�ステータスも Accepted にしているのですが・・・
Original comment by infosia...@gmail.com
on 30 Aug 2011 at 8:03
了解しました。Acceptedというのは修正対象にはなるんですね
。
removeは使用するスプライトが全部消えた場合にテクスチャ��
�ソースまで
開放されますが出来ればキャッシュしておきたいのでリソ��
�スロック用に
ダミースプライトを1枚用意しそのうえでremoveを使おうと思�
��ます。
この場合ダミースプライトがあるためremoveで落ちないだろ��
�と考えてます。
回避方法が複数あるのでこの件は当分保留でも問題ないで��
�。
Original comment by sat...@gmail.com
on 30 Aug 2011 at 8:31
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
Original comment by infosia...@gmail.com
on 31 Aug 2011 at 10:39
マウスイベントなどから実行すると落ちやすいと思ってい��
�したが、onDrawFrame 内で load/remove
しても落ちるということは、スレッドなどに起因するもの��
�はないようですね。
それであれば、過負荷をかけすぎると落ちるとか、時間を��
�けすぎると落ちるとか、そういうことなのかもしれません�
��ちなみに「かわずたんたたき!」では、専用のローディン
グ画面を用意したり、タイトル裏でプリロードしたりして��
�ーム中に load/remove しないように実装しました。
Original comment by infosia...@gmail.com
on 1 Sep 2011 at 3:32
問題が解決したと思っていたんですがどうも不安定で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
なるほど。ちなみに 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
調査途中で分かった事を少し書いておきます。
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
検証ありがとうございます。
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
後ろで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
検証ありがとうございます。
挟む必要があるんですね。
すみませんが、二度手間になるとよくないので問題が出な��
�なったソースを添付して頂くことは可能ですか?
Original comment by infosia...@gmail.com
on 1 Sep 2011 at 11:12
ファイルを添付します。はさむ必要があると言うよりglVertex
Pointer関数は
バッファをバインドしてる時が引数にオフセットを指定し��
�バインドされていない時は
アドレスを指定するという風に挙動が変化するのが原因で��
�かね。
なのでglVertexPointerを実行する時にバッファがバインドされ��
�いたため落ちたと思います。
すべてVBOで設計を統一していたらもしかすると遭遇しなか��
�たかもしれませんね。
Original comment by sat...@gmail.com
on 1 Sep 2011 at 11:23
Attachments:
添付ありがとうございます。この修正をレポジトリにコミ��
�トしました。
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
「かわずたんたたき」のゲーム中に 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
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
実は、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
まだおかしなところがあったので、さらに修正しました。
こちらを使ってください。
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
数回実行してみたところ問題無く動きました。
この件は解決でいいと思います。
>実は、API reference には書いてあるのです・・・
多分(mp3 m4a
etc...)みたいな感じで補足が書いてあるほうがいいかなと思�
��ます。
そうすればmp3が使えるか調べたい人は「emo framework
mp3」などで
検索して気づいてくれると思います。
Original comment by sat...@gmail.com
on 2 Sep 2011 at 5:26
この件とは関係ないのですがスクリプトのエラーログなど��
�文字化けしていたので
コードを少し変更して試してみました。
ちゃんと出ているようですがスクリプトのエラーでは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
検証ありがとうございます。Audio format
についてはもっと分かりやく書いた方がいいようですね。��
�グのタグは Android
版と合わせた形でこのようにした気がします。コンパイル��
�プションなどでシンプルなログを表示できるようにしてみ�
��うと思います。ログの文字化けについては元々日本語を使
わないつもり(Android
の方で問題が発生するため、Squirrelをオプションでマルチバ
イト非対応にしています)なのですが、見てみます。
Original comment by infosia...@gmail.com
on 2 Sep 2011 at 7:24
以前私が投稿しました修正版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
この修正で、 4096
バイト以上の文字列が来ても大丈夫でしょうか?文字化け��
�修正だと思っていたのですが、私の方でスクリプトに日本�
��を入れてもやはり文字化けしていたのでそのままにしてい
ました。現在のものが問題なのは、パラメータの一番目し��
�使っていないということですね?先に全てのパラメータを�
��るように修正しようと思います。
Original comment by infosia...@gmail.com
on 12 Sep 2011 at 9:57
パラメータの1番目しか使っていないためエラーが分からな�
��ったという事ですね。
それなら私の上げた修正は必要なくてエラーメッセージが��
�て見えるように
なってくれればそれで結構です。日本語が文字化けするの��
�日本語を使用しないので
問題ないです。
よろしくお願いします。
Original comment by sat...@gmail.com
on 12 Sep 2011 at 10:57
了解です。エラーメッセージについて、 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
素早い対応ありがとうございます。
今少々手が込んでまして明日出張も重なるため確認が明後��
�になってしまいます。
確認が完了次第報告いたします。
Original comment by sat...@gmail.com
on 12 Sep 2011 at 11:20
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
確認ありがとうございます。ログの出力については、Android
の表示と合わせたものなのですが、確かに長いので iOS
版については次のバージョンからタグやエラーレベルの表��
�を消すオプションを付けようと思っています。
Original comment by infosia...@gmail.com
on 14 Sep 2011 at 1:49
オプションで消せる件了解しました。
もし可能でしたらエラー表示の実装をC++側ではなくRuntime.nut
内で実装し、
使う側が関数をオーバーライドしてダグを消すようになっ��
�いても良いかもしれません。
その場合エラーメッセージを加工したり保存したり通信で��
�ったりと色々出来そうです。
面倒であれば無視してもらって構いません。
Original comment by sat...@gmail.com
on 15 Sep 2011 at 3:26
現在エラーメッセージをカスタマイズする機能はありませ��
�が、実行時エラーが起きた際にカレントクラスの 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
そんな機能があったんですね。
将来ターミナルソフトを作成しリモートから開発やデバッ��
�をしたいと考えて
いるのでその時に役立ちそうです。ちなみに私は今までそ��
�やってSquirrelでの
開発を行っていました。
Original comment by sat...@gmail.com
on 15 Sep 2011 at 10:04
先ほど新しいバージョンをリリースしました。
このバージョンから、ログのタグ削除ができるようになり��
�した。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
0.1.5 build
19をiOSにて確認してみましたがemo.Runtime.enableSimpleLog()をonLoad�
��
呼んでもタグが付いたままのようです。
Androidのサンプルも少し動かしてみましたがこちらは問題な�
��はありませんでした。
Original comment by sat...@gmail.com
on 20 Sep 2011 at 6:44
タグがついたままというのは、以下のような状態ですか?
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
そういう事でしたか。確かにそうなっています。
私は問題ないのですがSquirrel未経験者の多くが使用する予定
で
今のエラー表示だとみんなコールスタックの見方とか気づ��
�てくれないので
エラー表示をSquirrelのシンプルなもので見たかったというの
があります。
なんとなくNSLogで表示するとこうなるんだろうと分かったの
で対処方が
なければこのままで結構です。
そうのち解決法が分かればこちらでソースを修正して使用��
�る事にします。
Original comment by sat...@gmail.com
on 20 Sep 2011 at 8:08
Original issue reported on code.google.com by
sat...@gmail.com
on 30 Aug 2011 at 2:46Attachments: