Je travaille actuellement sur la création d'une gallerie photo de type carousel.
Tout va bien sauf que je n'arrive pas a faire apparaître les photos au compte goutte (comme on le vois sur les galleries android/IOS) sans faire freezer mon app.
En gros j'ai une premiere fonction qui crée les GameObjects avec Component UI.Image contenant juste une couleur noire (pour un temps de chargement quasi instantané).
Ensuite une deuxième fonction se charge de loader les textures sur chaque game Object respectifs.
Ci dessous mon code,
Est ce que je m'y prend de la bonne manière ?
Est-il possible de charger une texture dans monopoliser 100% des procs/freezer le programme ?
Code : Tout sélectionner
function displayCarousel(numeroImageEnCours:int)
{
//On met a jour localement le numero de slide en cours
numeroSlideEnCoursCarousel = numeroImageEnCours;
//On parcours le tableau une premiere fois pour generer les images carousel avec une couleur noire
for(var i:int=0; i < gestionGallerieJS.files.Length; i++)
{
//Si l'image en cours est l'image sur laquelle on a cliqué...
if (i == numeroImageEnCours)
{
//On crée l'instance avec le focus
generateBlackInstanceOfCarouselImage(i, true);
}
else
{
//On crée l'instance sans le focus
generateBlackInstanceOfCarouselImage(i, false);
}
}
//On parcours le tableau une deuxieme fois pour inserer les textures (au fur et a mesure)
for(var i2:int=0; i2 < gestionGallerieJS.files.Length; i2++)
{
yield StartCoroutine(uploadCarouselTrueTexture(i2));
}
}
function generateBlackInstanceOfCarouselImage(numeroImageEnCours:int, isOnActivated:boolean)
{
// On crée les component
var imageGameObject:GameObject;
var componentImage:UI.Image;
var componentToggle:UI.Toggle;
var componentLayoutElement:UI.LayoutElement;
// On crée un nouveau GameObject
imageGameObject = new GameObject();
//On l'ajoute a notre tableau pour pouvoir le réutiliser plus tard :
listeCarouselGameObjects.Add(imageGameObject);
imageGameObject.transform.name="imageCarousel"+numeroImageEnCours; //On renomme le gameObject
imageGameObject.layer=LayerMask.NameToLayer("UI"); //On definit le layer UI pour ce gameObject
//On le ratache à un canvas
imageGameObject.transform.SetParent(contentCarouselGallerie.GetComponent(RectTransform), false);
// On rajoute le componentImage
componentImage = imageGameObject.AddComponent(UI.Image);
//On met une couleur noire a l'image (en attendant qu'elle recoive ensuite sa vraie texture)
componentImage.color = Color.black;
componentImage.preserveAspect=true;
// On rajoute le componentToggle
componentToggle = imageGameObject.AddComponent(UI.Toggle);
componentToggle.interactable = false;
componentToggle.transition = Selectable.Transition.None;
componentToggle.group = toggleGroupImageCarousel;
//Uniquement sur l'ImageCarousel de lanvement, on met le toggle sur On
componentToggle.isOn = isOnActivated;
//////////////////////////////
//Ajout d'un Layout Element//
////////////////////////////
// On rajoute un LayoutElement pour definir la longueur de l'image
componentLayoutElement = imageGameObject.AddComponent(UI.LayoutElement);
//A la création on definit la largeur du rect "contentCarouselGallerie"
var scaleFactor:float = canvasGallerie.scaleFactor;
componentLayoutElement.preferredWidth = fileDialog.GetComponent(RectTransform).rect.width;
componentLayoutElement.preferredHeight = fileDialog.GetComponent(RectTransform).rect.height;
//Pour eviter un bug de transparence, on masque et réaffiche notre gameObject
imageGameObject.SetActive(false);
imageGameObject.SetActive(true);
}
function uploadCarouselTrueTexture (numeroImageEnCours:int)
{
///////////////////////
//Ajout de l'image ://
/////////////////////
//On recupere le chemin de l'image en cours
var cheminImage:String = gestionGallerieJS.files[numeroImageEnCours];
// On charge l'image en mémoire. On rajoute "file:///" car www en a besoin pour savoir que c'est un fichier local. Selon la plateforme, cela peut etre aussi : "file://" (a tester)
var www:WWW = new WWW("file:///"+cheminImage);
yield www; // On attend que l'image soit completement chargée (on laisse l'appli tourner pendant ce temps)
var widthImageOri = www.texture.width;
var heightImageOri = www.texture.height;
// On crée la Texture 2D
var imageTexture:Texture2D = new Texture2D(www.texture.width, www.texture.height, TextureFormat.RGB24, false);
//On injecte l'image dans la texture 2D
www.LoadImageIntoTexture(imageTexture);
//On injecte la Texture 2D dans le sprite
var spriteImageCarousel:Sprite = Sprite.Create(imageTexture, new Rect(0,0,widthImageOri, heightImageOri), new Vector2(0.5,0.5));
//On injecte la texture 2D dans notre imageCarousel en cours
listeCarouselGameObjects[numeroImageEnCours].GetComponent(UI.Image).sprite = spriteImageCarousel;
//On met une couleur blanche a l'image (pour que la textrue soit visible)
listeCarouselGameObjects[numeroImageEnCours].GetComponent(UI.Image).color = Color.white;
}
Bonne soirée !
Edit :
Pour résumer http://www.LoadImageIntoTexture freeze l'application le temps de l'opération (et comme je loop toutes mes images et bin....).
Même si j'espace ma loop de 2 secondes, je vais freezer quand même toutes les 2s.
Donc y aurait il un moyen de donner une priorité de calcul plus basse ou quelque chose comme ça ?
http://WWW.threadPriority n'a l'air de rien changer :
http://docs.unity3d.com/400/Documentati ... ority.html
Pas plus que :
Thread.CurrentThread.Priority = System.Threading.ThreadPriority.Lowest;
ou
Application.backgroundLoadingPriority = ThreadPriority.Low;