2017-07-17 20 views
0

私は一日中たくさんの質問を通して自分のやり方を尋ねましたが、私の問題に答える答えが見つからないようですので、誰かが私を助けてくれることを願っています。複数のUnityコルーチンがwww画像の読み込みを高速化するのはなぜですか?

Unityシーンに複数の画像ストリームを表示したいとします。私はローディングスクリプトが添付された複数のGameObjectを持っています。スクリプトLoader.csと

  • GameObject1スクリプトLoader.csと

  • GameObject2(スタートでコルーチンを呼び出す)スクリプトLoader.csと

  • GameObject3(スタートでコルーチン()呼び出しコルーチンを呼び出します

と、このスクリプトでコルーチンを経​​由して、私のイメージをロード)を起動中:

IEnumerator Load() 
{ 
    Texture2D tex = new Texture2D(4, 4, TextureFormat.DXT1, false); 
    while (true) 
    { 
     WWW www = new WWW(url); 
     yield return www;     
     www.LoadImageIntoTexture(tex); 
     img.texture = tex; 
    } 
} 

(ここで、img.textureはシーン内の画像で、urlはロード元のURLです)。

これはイメージのロードには問題ありませんが、より多くのコルーチンを開始するとイメージのロード/ストリームが高速になります。明確にするために、私は1つの画像ストリームを持っている場合、それは特定の速度で画像を更新していますが、もしあれば、例えば、 3つの画像ストリーム(それぞれ読み込み用のコルーチンを有する)は、3つのストリームすべてが突然1つのストリームよりも速く画像をロードする。

コルーチンの終わりにyield return new WaitForFixedUpdate();を追加しようとしましたが、助けにならなかったので、新しい画像を読み込む際にどのように規則的なペースを達成するのか分かりません。 ? 私はそれが何を意味し、何か助けに感謝していることは間違いないと思います!

+1

あなたの質問は不完全です...マルチコルーチンはどこですか?あなたは 'Load'をフレーム内で何度も呼び出すことを意味していますか? – Programmer

+0

@Programmer申し訳ありませんが、私は明確にするために私の質問を編集しました。同じスクリプトが何度もシーン内にあり、それぞれがコルーチンを一度呼び出します(コルーチンでは画像の読み込み/ストリーミングをループします) – user3647967

+0

これは、それぞれのコルーチン関数がwhileループであるときに特に気をつけています3つのコルーチンはできるだけ早く画像を更新しています。おそらくこれを行うためのより良い方法があります。ストリームのソースは何ですか?これはどのような種類のストリームですか? – Programmer

答えて

0

複数のコルーチンを起動すると、異なるスレッドから別の時間に画像をダウンロードしているため、画像がより高速に更新されます。 WWW APIのネイティブ側はスレッドで実装されています。コルーチンは、Threadと同じではありません。

WWW APIでのコルーチンの使用は、出力(画像)にアクセスする前にそのWWWリクエストが完了するのを待つことができます。実際には、3つのコルーチンが永久に実行されます。それぞれがイメージをダウンロードしている間、もう1つは既にダウンロードしたイメージをTexture2Dにアップロードする可能性が高いです。

これにかかわらず、これはではなく、の正しいストリーム方法です。 WWW API は、をこの目的に使用できません。それはあなたによく見えるかもしれませんが、それは悪いハックです。

は、2つのオプションがあります。

.USE新しいユニティの UnityWebRequestその DownloadHandlerScript拡張子を持ちます。 Thread

.USE C#の標準HttpWebRequest APIその後、this技術を使用して、メインスレッドに結果を送信します。

どのオプションを選択しても、jpegから読み取る方法は同じです。

0xD8

.Whenあなたに続くバイト0xFFため、そのストリームからURL

.Readへ.Make接続

.Searchにバイト0xFFの後に0xD8が見つかると、ストリームの読み込みが開始され、それらをバイト配列/ Listにトラッキングします。

jpegストリームを読み取っている間は、バイト0xFF0xD9を探してください。

0xFFに続いて0xD9というバイトが見つかった場合は、読み上げを停止します。

.Your JPEG画像は、現在0xFFから構築からバイト配列、ステップ#4、次いで0xFF0xD9から全体byteアレイ続い0xD8あります。

8.最後に、Texture2D.LoadImageを使用して、バイト配列をTexture2Dに読み込んで画面に表示します。

バック.Jumpは#3ステップと、サーバがダウンしている場合を除きストリームので、端を持っていないことを繰り返し続けることができます。

問題が発生した場合は、この回答で作成したコードでいつでも新しい投稿を作成できます。 Hereは、あなたもまたあなたに言わせてくれる投稿です。

関連する問題