【问题标题】:Unity3D freezing main thread when i using www (load texture)当我使用 www(加载纹理)时 Unity3D 冻结主线程
【发布时间】:2015-04-27 06:53:50
【问题描述】:

你好我加载纹理这段代码: settingSplit 这是字符串数组。

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 秒)。 我该如何解决这个问题? 谢谢!

【问题讨论】:

    标签: c# unity3d unity-web-player


    【解决方案1】:

    我不知道你是否解决了这个问题,但我遇到了同样的问题。有问题的行是

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

    因为 Sprite 的创建需要一段时间并在主线程中运行,这会导致您的游戏冻结。

    我的解决方案是使用 RawImage 而不是 Image 来显示加载的纹理,只需删除提到的行并替换

    decal.sprite = spr;
    

    decal.texture = www.texture;
    

    并设置您要使用的其余属性/值。

    我希望这对遇到此问题的人有所帮助。

    【讨论】:

    • 老兄,你甚至不知道你的建议对我有多大帮助! :-D 非常感谢你!
    【解决方案2】:

    WaitForEndOfFrame 在帧结束处恢复。我相当肯定,如果你在帧结束时让步,在帧结束时,你仍然不会进入下一帧。只需 yield 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多