28523


■やりたいこと  
UnityのC#にてリソースが複数入ったTarファイルをダウンロードし、  
展開し保存するという処理を書いているのですが  
レスポンスで受け取ったデータをMemoryStreamに書き込む時  
５Mのファイルを書き込み終わるのに４０秒近くかかっており、  
どうにかして高速したく調査しています。

Tarファイルは全部で８０個で５００Mほどあり、  
リソースを全て落とすのに１時間ほどかかっています。

この処理はダウンロード中非同期に動作させたいので  
別スレッドで動作しています。

Androidでは、これほど時間がかからず１０分程で完了しており  
iOSでのみ起こっているので、他にも原因があるかもしれないのですが  
まずはログを貼って判明したこの現象からつぶしていきたいと思っています。

■質問  
・貼り付けたソースのdo～whileで回しているところで５Mのファイルのバイナリーを  
MemoryStreamに書き込んでいるのですが、このループを抜けるまでに４０秒ほど  
掛かっています。  
コピーの仕方のまずい点を指摘していただけないでしょうか？

・count = st.Read(buffer, 0, buffer.Length);の戻り値のcountが  
16384になり16kバイトづつしか読めてないようなのですが、  
このサイズは何を基準算出されるのでしょうか？

●ソースコードを抜粋しています。

[code]

    using (HttpWebResponse wres = (HttpWebResponse)req.GetResponse())
    {
    
        using (Stream st = wres.GetResponseStream())
        {
            sw.WriteLine("ストリーム書き込み前：" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
            //Debug.Log("GetResponseStream");
            using (MemoryStream memoryStream = new MemoryStream())
            {
                //Debug.Log("MemoryStream()");
                byte[] buffer = new byte[1048576];
                int count = 0;
                do
                {
                    sw.WriteLine("ストリーム書き込み０：" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
                    // レスポンスデータからread
                    count = st.Read(buffer, 0, buffer.Length);
                    sw.WriteLine("ストリーム書き込み１：" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
                    memoryStream.Write(buffer, 0, count);
                    sw.WriteLine("ストリーム書き込み２：" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
    
                } while (count != 0);
    
                memoryStream.Position = 0;
    
                sw.WriteLine("ストリーム書き込み後：" + ((TimeSpan)(DateTime.Now - startTime)).TotalMilliseconds.ToString() + ",");
    
                Tar解凍メソッドへ(memoryStream, false);
            }
        }
    }
    
[/code]

■開発環境  
Unity5.4.0f3  
MacOsX10.11(EL Capitan)

■実行環境  
iPhone5S  
iOS8.4


CC BY-SA 3.0
2016-08-26T15:52:24.550
28518
2016-08-27T05:43:38.713
2016-08-27T05:43:38.713
5261
5261
question
ios c# unity3d
通信レスポンスのStreamからMemoryStreamへ高速にコピーするには


> コピーの仕方のまずい点を指摘していただけないでしょうか？

.NET Framework 4.0以降であれば[Stream.CopyTo()メソッド](https://msdn.microsoft.com/ja-
jp/library/dd783870\(v=vs.110\).aspx)が使えます…が、コピーの仕方が原因ということはないでしょう。WebRequestクラスがそもそも遅いのかもしれません。[UnityWebRequestクラス](http://docs.unity3d.com/ja/current/Manual/UnityWebRequest.html)は使えないでしょうか？

> このサイズは何を基準算出されるのでしょうか？

一般にStreamは一度に読み出せる量に保証がありません。結果的に16KBとなったとしか言いようがありません。


CC BY-SA 3.0
2016-08-27T03:29:00.280
28523
2016-08-27T03:29:00.280
4236
28518
answer