Re: Android版 ( No.10 ) |
- 名前:ギウ 日時:2017/07/08 05:57
ご対応有難うございます!
>もしかしたらAPI呼び出しでエラーが発生した際に何かメモリリーク的なものが発生してそれが蓄積されているのかもしれません
なるほど、それな感じがします。
最新版の方、現在Log無しで試し中です。
また書き込みます。
|
Re: Android版 ( No.11 ) |
- 名前:ギウ 日時:2017/07/08 20:11
大丈夫かなと安心してたら、4、5時間後に止まりました;
しかもLog.txtの無しの方なので、詳しくは分かりません。。
今、Log.txtの状態で数時間やってますが、まだエラーは出力されてないです。
一先ず状況報告ということで。
P.S
ゲーム側で、同じ音を鳴らさないような処理を加えれば、もっと延命できるかなとは思いますが、まずはこの状態でデバッグしておきます。
|
Re: Android版 ( No.12 ) |
- 名前:ギウ(解決) 日時:2017/07/08 21:54
Log.txtが有効だと、止まったりエラーが出力されたりはしないのかもしれません。
試しに、効果音鳴らしまくるプログラムも実行してみましたが大丈夫でした。
なのでこの件は一先ず大丈夫ということにして(すみません;)、ゲーム側の音処理が少なくなるように調整しておこうと思います。
もしまた止まった時はお知らせします!
ご対応有難うございました。
|
Re: Android版 ( No.13 ) |
- 名前:管理人(解決) 日時:2017/07/10 00:00
お試しいただきありがとうございます
すみません、駄目でしたか…
ログが有効だと止まらないのは、謎です…
> もしまた止まった時はお知らせします!
よろしくお願いします m(_ _;m
あと、今更で申し訳ありません
No.3 のお話ですが
> こちらの処理は、
> 読み込む際、データが有る時は、
> StopSoundMem
> DeleteSoundMem
> を行った後、
> LoadSoundMemByMemImage
> を実行してます。
こちらについてもう少し詳しく教えていただけないでしょうか
「読み込む際、データが有る時」とは、どのような状況でしょうか?
再生処理を配列のようなもので管理していて、サウンドデータを読み込もうとした
スロットに既に有効なサウンドハンドルが存在する場合、
StopSoundMem, DeleteSoundMem を行うということでしょうか?
> 試しに、効果音鳴らしまくるプログラムも実行してみましたが大丈夫でした。
お試しされたのは、No.3 のお話と同じような方式( データが既にあったら
StopSoundMem, DeleteSoundMem を行った後 LoadSoundMemByMemImage を実行する )で
効果音を鳴らしまくられたのでしょうか?
|
Re: Android版 ( No.14 ) |
- 名前:ギウ 日時:2017/07/10 22:02
>再生処理を配列のようなもので管理していて、サウンドデータを読み込もうとした
>スロットに既に有効なサウンドハンドルが存在する場合、
>StopSoundMem, DeleteSoundMem を行うということでしょうか?
そうです。
配列にサウンドハンドルを入れておいて、それが0以外なら、StopSoundMem, DeleteSoundMemを実行した後、読み込む感じです。
なので、再生中かどうかに関係なく、StopSoundMemを呼んでます。
>StopSoundMem, DeleteSoundMem を行った後 LoadSoundMemByMemImage を実行する )で
>効果音を鳴らしまくられたのでしょうか?
それも使いましたが(1フレームに2回くらい)、主に読み込み済みのを PlaySoundMem しまくりました。
|
Re: Android版 ( No.15 ) |
- 名前:管理人 日時:2017/07/11 02:40
ご返答ありがとうございます
教えていただいたご情報を元に PlaySoundMem しまくるテストプログラムを組んでみたところ、
手元の環境でもエラーが発生しました!
手元の環境ではログが無効でもエラーが発生しました
また、まだはっきりとは確認できていませんが、StopSoundMem, DeleteSoundMem を使用せず
PlaySoundMem を実行するだけでもエラーが発生した可能性も…( エラーになったタイミングを
目撃できていないので、まだ確証は得られていません… )
一度のテストに時間が掛かるので、修正には時間が掛かるかもしれませんが、修正ができたら
お伝えします m(_ _;m
|
Re: Android版 ( No.16 ) |
- 名前:ギウ 日時:2017/07/11 08:32
おお! 再現できたとのことで良かったです。
よろしくお願いいたします。
|
Re: Android版 ( No.17 ) |
- 名前:ギウ 日時:2017/07/11 11:50
別件でGoogleのサポートの方とやり取りをしてるのですが、
色々あってAPIレベルを18以上にすることになりました。
APIレベルがどういうものかイマイチ分かってないのですが(DirectXでいうバージョン番号みたいな感じ?)、
もし昔のAPIのバグが直るとかなら、今回のも関係するのかなと思いましたので一応書きこんでおきます。
尚、APIレベルの変更方法は、AndroidManifest.xml 内を、
↓な感じにすれば18以上になるようです。
<uses-sdk android:minSdkVersion="18" android:targetSdkVersion="19"/>
|
Re: Android版 ( No.18 ) |
- 名前:ギウ 日時:2017/07/11 13:47
APIレベルについて、
「古いAPIのバグが直るというわけではなく、単純に配信対象が上位のAPIになるだけですので、バグ自体はそのまま残ります」
とのことでした; 残念。
|
Re: Android版 ( No.19 ) |
- 名前:管理人 日時:2017/07/13 01:29
未だ原因究明中です( StopSoundMem, DeleteSoundMem, LoadSoundMemByMemImage の処理を行うと
比較的すぐにエラー終了して、PlaySoundMem だけを使用すると数時間はエラー終了しないということが
分かりました、現在原因かもしれない箇所を少し変更して実行テスト中です… )
> APIレベルがどういうものかイマイチ分かってないのですが(DirectXでいうバージョン番号みたいな感じ?)、
>
> 「古いAPIのバグが直るというわけではなく、単純に配信対象が上位のAPIになるだけですので、バグ自体はそのまま残ります」
> とのことでした; 残念。
ご情報ありがとうございます
APIレベルが上がると使用できるAPIや引数のタイプが増えたり仕様が変わったりという感じです
Windowsで言うなら『UpdateLayeredWindow という Win32 API は Windows2000 以降であれば使用できます』みたいな感じです
DirectX はバージョンが上がると使用する API も全部変わってしまうので、DirectX では例えることが
できないかもしれません…
|
Re: Android版 ( No.20 ) |
- 名前:ギウ 日時:2017/07/13 18:24
あ、確かにDirectXはまた違いますね。
>未だ原因究明中です( StopSoundMem, DeleteSoundMem, LoadSoundMemByMemImage の処理を行うと
なるほど、こっちの方が止まりやすいんですね。
では一先ずこちらは、「なるべく予め読み込んでおく」感じで調整しておきます。
>現在原因かもしれない箇所を少し変更して実行テスト中です…
おお。止まりませんように!
|
Re: Android版 ( No.21 ) |
- 名前:管理人 日時:2017/07/14 01:40
> おお。止まりませんように!
4〜5時間は大丈夫だったのですが、朝起動したまま出かけて、夜帰ってきたら終了していました
ただ、他の電子機器も画面がONになっていたりと何やら違和感があって、停電か何か発生した可能性があります
なのでエラー終了かどうかは分かりませんでした…
そんなわけで今しがたテスト実行を再度開始したところなので、結果は明日に持ち越しとなりました (_ _;;
|
Re: Android版 ( No.22 ) |
- 名前:ギウ 日時:2017/07/15 08:18
如何でしょうか。
こちらは昨日、1回止まりました。(LOG無し。延命効果は出てる感じしてます)
私の方でも実行チェックしますので、必要でしたら途中状態でもアップしてくださいませ^^
--
あとPS系の方にも書き込みしました。
|
Re: Android版 ( No.23 ) |
- 名前:管理人 日時:2017/07/15 14:53
ご情報ありがとうございます
こちらも再テストでも止まってしまい、現在更に処理を変更して再度テスト中です
( StopSoundMem, DeleteSoundMem, LoadSoundMemByMemImage を行うテストで2時間弱問題なく
動作しているので、今度こそ直せたかもしれません )
結果が出ましたら追記します
> あとPS系の方にも書き込みしました。
すみません、昨日は疲れていたので帰宅後ご返信することができませんでした
後ほどご返信しますので少々お待ちください
|
Re: Android版 ( No.24 ) |
- 名前:管理人 日時:2017/07/16 01:00
|
Re: Android版 ( No.25 ) |
- 名前:ギウ(解決) 日時:2017/07/16 08:15
お疲れ様です!
DLしました。
こちらでも普通にまわしてみます。
(もし何かあればまた書き込みます)
有難うございました。
|
Re: Android版 ( No.26 ) |
- 名前:管理人(解決) 日時:2017/07/16 22:28
> こちらでも普通にまわしてみます。
> (もし何かあればまた書き込みます)
ありがとうございます、よろしくお願いします m(_ _)m
とりあえず手元では32時間経過してもエラー終了しませんでした
|
Re: Android版 ( No.27 ) |
- 名前:ギウ(解決) 日時:2017/07/17 07:47
おお。完璧ですね^^
こちらも全く問題ありません。
ではサウンド関連は完全解決ということで! 良かったです。
|
Re: Android版 ( No.28 ) |
- 名前:りんご 日時:2018/10/26 11:39
突然失礼致します。
当方趣味でAndroidでゲーム開発をしている者です。
今現在本スレッドと同様の問題を抱えており、ここでは解決しているようなのですが、
OpenSL ESの使い方で誤っていた点、原因は何だったか等差し支えなければ教えていただけないでしょうか。
DXライブラリも見させていただき、レス内容からStopSoundMem等の処理を変更なさった(?)ようですが、内部処理を追うことができませんでしたので、
質問させていただきました。
差し支えない範囲で構いませんので何卒よろしくお願い申し上げます。
|
Re: Android版 ( No.29 ) |
- 名前:管理人 日時:2018/10/28 22:20
ご返信が遅くなり申し訳ありません
原因は同時に行ってはいけない処理を同時に行ってしまうという、マルチスレッド処理における初歩的なバグでした
なので、クリティカルセクションを使用して処理が衝突しないようにしたところ問題が発生しなくなりました
ちなみに当時修正ができたかどうかをテストするために使用していたプログラムは以下の通りです
#include "DxLib.h"
#include <string.h>
#define NUM (16)
#define STOPNUM (64)
int android_main(void)
{
int FileHandle ;
int StartTime ;
int Time ;
int PlayCount ;
int LoadCount ;
int i ;
SetOutApplicationLogValidFlag( FALSE ) ;
if( DxLib_Init() == -1 ) return -1 ;
StartTime = GetNowCount() ;
PlayCount = 0 ;
LoadCount = 0 ;
SetDrawScreen( DX_SCREEN_BACK ) ;
int Sound[NUM] = { 0 };
FileHandle = FileRead_fullyLoad( "test.wav" ) ;
while( ProcessMessage() == 0 )
{
ClearDrawScreen() ;
if( GetRand( 100 ) > 20 )
{
int ind = GetRand( NUM - 1 ) ;
if( Sound[ ind ] == 0 )
{
Sound[ ind ] = LoadSoundMemByMemImage( FileRead_fullyLoad_getImage( FileHandle ), FileRead_fullyLoad_getSize( FileHandle ) ) ;
LoadCount ++ ;
}
else
{
if( GetRand( 100 ) < 40 )
{
StopSoundMem( Sound[ ind ] ) ;
DeleteSoundMem( Sound[ ind ] ) ;
Sound[ ind ] = LoadSoundMemByMemImage( FileRead_fullyLoad_getImage( FileHandle ), FileRead_fullyLoad_getSize( FileHandle ) ) ;
LoadCount ++ ;
}
}
PlaySoundMem( Sound[ ind ], DX_PLAYTYPE_BACK ) ;
PlayCount ++ ;
}
Time = GetNowCount() - StartTime ;
DrawFormatString(
0, 0,
GetColor( 255,255,255 ),
"Time %02d:%02d:%02d PlayCount:%d LoadCount:%d",
Time / ( 1000 * 60 * 60 ),
Time / ( 1000 * 60 ) % 60,
Time / 1000 % 60,
PlayCount,
LoadCount
) ;
ScreenFlip() ;
}
DxLib_End();
return 0;
}
とりあえず30分ほど実行してみた限りでは強制終了は発生しませんでした
よろしければりんごさんの環境では上記プログラムで強制終了が発生してしまうかお試しいただけないでしょうか? m(_ _)m
|