1

你好我加载纹理这段代码: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 秒)。我该如何解决这个问题?谢谢!

4

2 回答 2

2

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

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;

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

我希望这可以帮助遇到这个问题的人。

于 2016-12-27T11:12:43.297 回答
0

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;
}
于 2015-02-25T18:02:15.127 回答