首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当我使用www (加载纹理)时Unity3D冻结主线程

当我使用www (加载纹理)时Unity3D冻结主线程
EN

Stack Overflow用户
提问于 2015-02-25 18:15:01
回答 2查看 1.4K关注 0票数 1

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

代码语言:javascript
复制
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秒)。我该怎么解决这个问题呢?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2016-12-27 19:12:43

我不知道你是否解决了这个问题,但我也面临着同样的问题。有问题的一行是

代码语言:javascript
复制
spr = Sprite.Create(texTmp, new Rect(0, 0, texTmp.width, texTmp.height), Vector2.zero, 50);

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

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

代码语言:javascript
复制
decal.sprite = spr;

使用

代码语言:javascript
复制
decal.texture = www.texture;

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

我希望这对有这个问题的人有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2015-02-26 02:02:15

WaitForEndOfFrame在帧的末尾恢复。我相当确定如果你在帧的末尾让步,在帧的末尾,你仍然不会前进到下一帧。只需生成null,您将继续下一帧。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28716318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档