2017-01-10 1 views
0

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++; 
    } 

} 
+1

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

+0

Mais vous êtes supposé appeler LoadImages une fois dans la fonction Démarrer. Pourquoi appelez-vous de nouveau à partir de la fonction FixedUpdate? – Programmer

+0

Parce que je veux que les images soient actualisées avec de nouvelles. – user3538263

Répondre

0

Merci pour les réponses que je résolu le problème en divisant la méthode LoadImages() en deux et faire le chargement de texture une seule fois, puis traînant juste les textures et les mettre au jeu des objets toutes les dix secondes, comme cela a été suggéré.

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"); 
    //files = System.IO.Directory.GetFiles (path, "*.png"); 
    //ShuffleArray(files); 

    Debug.Log (files [1]); 

    StartCoroutine (TextureStuff()); 
    Debug.Log ("Texture stuff done"); 
    LoadImages(); 

    //StartCoroutine (LoadImages()); 
    //LoadImages(); 
} 

void FixedUpdate() 
{ 
    //Debug.Log (targetTime); 
    targetTime -= Time.fixedDeltaTime; 

    if (targetTime <= 0.0f) 
    { 
     Debug.Log ("Update!"); 
     targetTime = refresh; 
     //StartCoroutine (LoadImages()); 
     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 void LoadImages() 
{ 
    //load all images in default folder as textures and apply dynamically to plane game objects. 
    ShuffleArray(textList); 

    int dummy = 0; 

    for(int i = 0; i < gameObj.Length;i++) { 

     gameObj[i].GetComponent<Renderer>().material.mainTexture = textList [dummy]; 

     dummy++; 
    } 

} 
private IEnumerator TextureStuff(){ 
    Debug.Log("In texture"); 
    textList = new Texture2D[files.Length]; 

    int dummy = 0; 
    Debug.Log(gameObj.Length); 
    for(int i = 0; i < gameObj.Length;i++) { 
     string pathTemp = pathPreFix + files[i]; 
     Debug.Log (pathTemp); 
     WWW www = new WWW (pathTemp); 
     yield return www; 
     Texture2D texTmp = new Texture2D (1024, 1024, TextureFormat.DXT1, false); 
     www.LoadImageIntoTexture (texTmp); 

     textList [dummy] = texTmp; 

     //gameObj[i].GetComponent<Renderer>().material.mainTexture = texTmp; 

     dummy++; 
    } 

} 

}