我正在为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()函数并将新图片附加到禁用的球体。