Unity Android和iOS在运行时处理纹理

时间:2017-02-21 17:16:30

标签: c# android ios unity3d textures

我正在为Android开发一个移动应用程序,使用Unity来显示全景图像。

下载图像并将其保存在设备的本地存储中。一幅图像约为5mb到10mb。

我在应用开始时使用WWW.LoadImageIntoTexture。但如果我有七个以上的图像应用程序崩溃。我发现LoadImageToTexture创建了RGBA32格式的图像。所以每个纹理大约有100mb。因此崩溃是由完全记忆引起的。

我尝试过Texture2d.Compress()但它只压缩到DXT1或DTX5。 Android无法处理DXT格式。

新想法是预先加载我想要查看的图像。 (只能看到一个图像) 我试着用Coroutine加载纹理。但是在使用WWW.LoadImageIntoTexture大约一秒时,应用程序停滞不前。所以我尝试了线程。但是WWW.LoadImageIntoTexture不能在unity-main-thread之外执行。

有没有办法执行WWW.LoadImageIntoTexture异步?我尝试从AssetStore使用UniRX:

public void StartPreloadPanorama(string targetid){
    preloadFinished = false;
    StartCoroutine (PreloadHandler ());
}

IEnumerator PreloadHandler(){
    var preload = Observable.FromCoroutine(PreloadPanorama)
        .Subscribe();

    while (!preloadFinished) {
        yield return null;
    }
}

IEnumerator PreloadPanorama(){
    //texture is a public string
    WWW preloadTexturer = new WWW("file://"+texture);
    Texture2D texTemp = new Texture2D (8192, 4096, TextureFormat.RGBA32, true);
    preloadTexturer.LoadImageIntoTexture(texTemp);
    preloadFinished = true;

    //edit - there is some more code after that:

    //preloadRenderer is a public Renderer attached to the gameobject displaying the panorama image
    preloadRenderer.material.mainTexture = texTemp;

    Resources.UnloadUnusedAssets();
    Debug.Log("FINISHED");
    yield return null;
}

但我仍然坚持......

有什么想法吗?谢谢!

编辑:根据这里的评论是我的设置:

我有两个球体,一个是活动的,一个是残疾的。 (GameObject.SetActive(假)) 我的相机在球体内。相机和两个球体的位置为0,0,0 - 您可以通过陀螺仪移动相机。 球体内部放置了一些按钮。如果您按住某个按钮2秒钟,则会禁用活动球体,并激活另一个球体。通过启动凝视,调用StartPreloadPanorama()函数并将新图片附加到禁用的球体。

0 个答案:

没有答案