J'essaie d'obtenir des images aléatoires d'un dossier et ensuite de les utiliser comme texture sur un mur qui change à un intervalle donné. Le code fonctionne, mais il y a un énorme succès quand on appelle LoadImages()
, puisqu'il est en VR, il est très visible et rend l'application inutilisable.Optimiser les textures changeantes dans Unity C#
Existe-t-il un meilleur moyen de modifier les textures pour qu'elles soient moins intenses en termes de performances?
using UnityEngine;
using System.Collections;
public class PhotoViewer : MonoBehaviour
{
GameObject[] gameObj;
Texture2D[] textList;
string[] files;
string[] filesShort;
string pathPreFix;
public float refresh = 10.0f;
public float targetTime = 10.0f;
// Use this for initialization
void Start()
{
Debug.Log (targetTime);
//Change this to change pictures folder
Debug.Log(Application.dataPath);
string path = @"" + Application.dataPath + "/Images";
pathPreFix = @"file://";
gameObj = GameObject.FindGameObjectsWithTag ("Pics");
files = new string[gameObj.Length];
files = System.IO.Directory.GetFiles (path, "*.jpg");
//ShuffleArray(files);
StartCoroutine (LoadImages());
//LoadImages();
}
void FixedUpdate()
{
Debug.Log (targetTime);
targetTime -= Time.fixedDeltaTime;
if (targetTime <= 0.0f)
{
Debug.Log ("Update!");
targetTime = refresh;
LoadImages();
//Start();
}
}
public static void ShuffleArray<T>(T[] arr){
Debug.Log ("In Shuffle");
for(int i = arr.Length - 1; i > 0;i--){
int r = Random.Range(0,i);
T tmp = arr[i];
arr[i] = arr[r];
arr[r] = tmp;
}
}
private IEnumerator LoadImages()
{
//load all images in default folder as textures and apply dynamically to plane game objects.
ShuffleArray(files);
textList = new Texture2D[files.Length];
int dummy = 0;
for(int i = 0; i < gameObj.Length;i++) {
string pathTemp = pathPreFix + files[i];
WWW www = new WWW (pathTemp);
yield return www;
Texture2D texTmp = new Texture2D (1024, 1024, TextureFormat.DXT1, false);
www.LoadImageIntoTexture (texTmp);
textList [dummy] = texTmp;
gameObj[dummy].GetComponent<Renderer>().material.mainTexture = texTmp;
dummy++;
}
}
Le chargement des ressources est préférable. Si vous le faites lors du chargement de votre jeu, tout ce que vous avez à faire est d'appeler la collection qui contient les assets et vous n'aurez pas à gérer les vitesses de lecture du disque dur. Si vous avez trop de textures et que cela provoque des exceptions OutOfMemory, prenez en compte les espaces réservés de faible résolution que vous appelez en premier et appelez les images de haut-rez sur un thread séparé (niveau de détail, fondamentalement). – CDove
Mais vous êtes supposé appeler LoadImages une fois dans la fonction Démarrer. Pourquoi appelez-vous de nouveau à partir de la fonction FixedUpdate? – Programmer
Parce que je veux que les images soient actualisées avec de nouvelles. – user3538263