stackオーバーフローにも質問したのですが、
できれば色々な方の意見をお聞きしたくこちらでも質問いたしました。
スタックオーバーフローでの質問
■やりたいこと
UnityのC#にてリソースが複数入ったTarファイルをダウンロードし、
展開し保存するという処理を書いてます。
レスポンスで受け取ったデータをMemoryStreamに書き込む時
5Mのファイルを書き込み終わるのに40秒近くかかっており、
どうにかして高速したく調査しています。
Tarファイルは全部で80個で500Mほどあり、
リソースを全て落とすのに1時間ほどかかっています。
この処理はダウンロード中、非同期に動作させたいので
別スレッドで動作しています。
Androidでは、これほど時間がかからず10分程で完了しており
iOSでのみ起こっているので、他にも原因があるかもしれないのですが
まずはログを貼って判明したこの現象からつぶしていきたいと思っています。
■質問
・貼り付けたソースのdo~whileで回しているところで5Mのファイルのバイナリーを
MemoryStreamに書き込んでいるのですが、このループを抜けるまでに40秒ほど
掛かっています。
コピーの仕方のまずい点を指摘していただけないでしょうか?
・count = st.Read(buffer, 0, buffer.Length);の戻り値のcountが
16384になり16kバイトづつしか読めてないようなのですが、
このサイズは何を基準算出されるのでしょうか?
●ソースコードを抜粋しています。
C#
1using (HttpWebResponse wres = (HttpWebResponse)req.GetResponse()) 2{ 3 4 using (Stream st = wres.GetResponseStream()) 5 { 6 sw.WriteLine("ストリーム書き込み前:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 7 //Debug.Log("GetResponseStream"); 8 using (MemoryStream memoryStream = new MemoryStream()) 9 { 10 //Debug.Log("MemoryStream()"); 11 byte[] buffer = new byte[1048576]; 12 int count = 0; 13 do 14 { 15 sw.WriteLine("ストリーム書き込み0:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 16 // レスポンスデータからread 17 count = st.Read(buffer, 0, buffer.Length); 18 sw.WriteLine("ストリーム書き込み1:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 19 memoryStream.Write(buffer, 0, count); 20 sw.WriteLine("ストリーム書き込み2:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 21 22 } while (count != 0); 23 24 memoryStream.Position = 0; 25 26 sw.WriteLine("ストリーム書き込み後:" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ","); 27 28 ExtractTarByEntry(memoryStream, false); 29 //Debug.Log("End"); 30 // 処理の完了したURL削除 31 Chronus.Lib.AssetFileSys.Manager.DownLoadManager.Instance.DeleteUrlTargetIndex(0); 32 isWorking = false; 33 } 34 } 35} 36
■開発環境
Unity5.4.0f3
MacOsX10.11(EL Capitan)
■実行環境
iPhone5S
iOS8.4
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。