2015-02-25 1 views
0

Привет, я загружаю текстуру этого кода: settingSplit это строковый массив.Unity3D замораживание основной нити, когда я использую www (load texture)

IEnumerator DownloadLogos() 
{ 
    WWW www = new WWW(settingsSplit[0]); 
    while (www.progress < 1) 
    { 
     slider.GetComponent<UISlider>().value = www.progress; 
     if (slider.GetComponent<UISlider>().value > 0.880f) 
     { 
      slider.GetComponent<UISlider>().value = 1; 
     } 
     yield return new WaitForEndOfFrame(); 
    } 
    yield return www; 

    if (www.error == null) 
    { 
     fadein = true; 
     model.GetComponent<Animation>().Play(); 
     texTmp = www.textureNonReadable; 
     spr = Sprite.Create(texTmp, new Rect(0, 0, texTmp.width, texTmp.height), Vector2.zero, 50); 
     spr.texture.wrapMode = TextureWrapMode.Clamp; 
     mat.mainTexture = spr.texture; 
     decal.sprite = spr; 
     yield return new WaitForEndOfFrame(); 
     slider.SetActive(false); 
     float multipier = 1; 

     if (settingsSplit[2] != null) 
     { 
      multipier = float.Parse(settingsSplit[2]); 
     } 

     decal.transform.localScale = new Vector3(decal.transform.localScale.x * multipier, 
      decal.transform.localScale.y * multipier, decal.transform.localScale.z); 
     BuildDecal(decal); 
    } 

Работа хорошо, но Когда текстура нагрузки MainThread остановки в течение некоторого времени (1-2 секунды). Как я могу это исправить? Спасибо!

ответ

0

WaitForEndOfFrame возобновляется в конце кадра. Я уверен, что если вы уступите в конце кадра, в конце кадра вы все равно не перейдете к следующему кадру. Просто введите null, и вы вернетесь к следующему кадру.

while (www.progress < 1) 
{ 
    slider.GetComponent<UISlider>().value = www.progress; 
    if (slider.GetComponent<UISlider>().value > 0.880f) 
    { 
     slider.GetComponent<UISlider>().value = 1; 
    } 
    yield return null; 
} 
1

Я не знаю, решили ли вы это, но я столкнулся с той же проблемой. Проблематичная линия

spr = Sprite.Create(texTmp, new Rect(0, 0, texTmp.width, texTmp.height), Vector2.zero, 50); 

Поскольку создание Sprite занимает некоторое время, и работает в основном потоке, что приводит к вашей игре, чтобы заморозить.

Мое решение было использовать RawImage вместо изображения для отображения загруженной текстуры, просто удалить указанную строку и заменить

decal.sprite = spr; 

с

decal.texture = www.texture; 

и установите остальные свойства/значения, которые вы хотите использовать.

Я надеюсь, что это поможет кому-то, имеющему эту проблему.

Смежные вопросы