2017-07-17 74 views
0

我整天都在搜索大量問題,但似乎找不到解決我的問題的答案,所以我希望有人能幫助我。爲什麼多個Unity協同程序加速www圖像加載?

我想在Unity場景中顯示多個圖像流。我有幾個附帶加載腳本的GameObjects,例如

  • GameObject1與腳本Loader.cs(調用啓動協程)

  • GameObject2與腳本Loader.cs(調用啓動協程)

  • GameObject3與腳本Loader.cs(調用協程在Start)

,並通過在這個腳本協程加載我的圖片:

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

@程序員對不起,我編輯了我的問題來澄清。同一個腳本在場景中多次出現,每次調用一次協程(在協程中它會循環加載/流式傳輸) – user3647967

+0

這是一個瘋狂的事情,特別是當每個協程函數有'while'循環時,這意味着他們3個協程正在儘快更新映像。也許有更好的方法來做到這一點。流的來源是什麼?這是什麼類型的流? – Programmer

回答

0

啓動多個協程會更快地更新映像,因爲您擁有的是在不同時間從不同線程下載映像。 WWW API的本地端由線程實現。請注意,協程與Thread不同。

使用協同API和WWW API可以在訪問輸出(圖像)之前等待該請求完成。基本上,您有3個永久運行的協程。當每個人下載圖像時,另一個可能會上傳已下載的圖像到Texture2D

無論如何,這是而不是正確的方式來流圖像。用於此目的的WWW API 不能用於。它可能看起來不錯,但這是一個糟糕的黑客攻擊。

你有兩個選擇:

。使用新的統一的UnityWebRequestDownloadHandlerScript擴展。

。使用C#標準HttpWebRequest API與Thread然後將結果發送到使用this技術主線程。

無論您選擇了哪個選項,從jpeg讀取的技術仍然保持不變。

。使連接到URL

.Read從該流

.Search用於隨後字節0xFF通過0xD8

。當你找到字節0xFF,然後是0xD8,開始讀取流並保持s把它們轉換成一個字節數組/列表。

。在閱讀jpeg流時,繼續搜索字節0xFF0xD9

。當您找到字節0xFF後跟0xD9時,停止讀取。現在

。您的JPEG圖像是字節數組從0xFF構造,0xD8隨後整個byte陣列從步驟#4然後0xFF0xD9

8.最後,使用Texture2D.LoadImage將字節數組加載到Texture2D中並將其顯示到屏幕上。

.Jump回到步驟#3和不斷重複的是,由於除非服務器已關閉流沒有結束。

如果遇到問題,您隨時可以使用此答案創建的代碼創建新帖子。 Here是一個帖子,也應該讓你說。