Forums Développement Multimédia

Aller au contenu

pré-chargement (de textures toujours...)

Director

3 réponses à ce sujet

#1 elran

    Ceinture Orange

  • Members
  • PipPipPip
  • 31 messages

Posté 05 April 2010 - 18:27 PM

et voici l'instant que je redoutais le plus (mais qui n'était au final qu'un instant parmi tant d'autres... ;) ):

le pré-chargement!!
autant je sais faire pour des acteurs, autant pour des textures et shaders, ben, humm, voilà quoi...

ce qu'il y à de compliqué (pour moi):

j'ai une scène 3D, mon portfolio, une sorte d'ardoise numérique
côté pile le menu, côté face, les vignettes.

le menu vient pré-chargé (les objets du menu et leurs textures ont étaient exportés depuis max)

les vignettes, par contre, sont chargées dynamiquement sur un mouseup.

dans le mouseup, je fais d'abord appel à une fonction qui me renvoi le nom de l'objet 3D sur lequel je viens de cliquer
et en fonction de son nom, j'appel une 2nd fonction qui elle charge les textures correspondantes, et finalement je fais tourner mon ardoise(3ème fonction).

l'ennui c'est que tout se passe au moment du clique, qu'il faut environ 2 secondes pour chargé les différentes textures, et qu'en suite je fais tourné mon ardoise pour affiché mes vignettes, et que mon ardoise se retourne elle en 1 seconde.
(déjà je pensais que l'animation de mon ardoise ne se déclencherais qu'après le chargement des textures: j'ai eu torts!)

j'ai fouillé sur les forum à la recherche de preload en "mode 3D", mais n'ai trouvé que très peut de réponses, si ce n'est que c'est assez compliqué à faire...

à ce stade là, et fonction de mes compétences, j'envisage 2 solutions (aucune des deux ne me satisfait vraiment...):

1ère soluce: j'utilise un timer dans le mouseup, entre le moment où je charge mes textures et le moment où je lance l'animation de mon ardoise
bon, au moins l'animation sera fluide, et je pourrais à la rigueur faire s'afficher un petit "chargement en cours..." pendant ce temps.
au moins mon portfolio restera dynamique et je pourrais assez facilement, par le suite, lui ajouter du contenu (sous forme de texture), voir même passé à du XML pour aller récupérer mes textures, titres et descriptions.

2ème soluce: ben je gère tout ça directement depuis max, là au niveau du "rendu final", je suis sur que tout ira bien, mais bon, c'est vraiment pas la solution vers laquelle je voulais me tourné (et que je me gardais en tête en dernier recours)

faut avouer que même si ça me rendrait bien service, c'est pas très dynamique comme solution...

et voilà (comment faire un long discours...)

et là je me tourne, une fois de plus, vers vous:

auriez vous une 3ème solution plus "élégante" à me proposé?


et pour info, voici le code utilisé pour ces différentes parties:



on mouseUp me
  checkObject
  if menu_Displayed = true then
    if member("messages").text = "model(" & QUOTE & "3D" & QUOTE &")" then
      --Load_Textures_3D
    end if
    if member("messages").text = "model(" & QUOTE & "Dessins" & QUOTE &")" then  
      --Load_Textures_Dessins
    end if
    if member("messages").text = "model(" & QUOTE & "Photos" & QUOTE &")" then  
      --Load_Textures_Photos
    end if
    if member("messages").text = "model(" & QUOTE & "Vidéo" & QUOTE &")" then
      --Load_Textures_Video
    end if
    flip
    menu_Displayed = false
  else
    show       --ça c'est pour plus tard faire animer mes vignettes en direction de la caméra
  end if
  if member("messages").text = "model(" & QUOTE & "back2menu" & QUOTE &")" then
    flipback
    menu_Displayed = true
  end if
end

je remplacerais à l'occasion le membre messages par une variable...

et voici les fonctions checkObject Load_Textures_3D et flip:


on checkObject
  tOffset = point(sprite(1).left, sprite(1).top)
  spriteToWorld = sprite(1).camera.spriteSpaceToWorldSpace(the mouseLoc - tOffset)
  gModelsClicked = sprite(1).camera.modelUnderLoc((the mouseLoc - tOffset))
  if gModelsClicked = VOID then    
    member("messages").text = ""
  else
    member("messages").text = gModelsClicked
  end if
end

on Load_Textures_3D
  lCount = castLib(2).member.count
  lWorld = member(1)
 
  repeat with inc = 1 to lCount
    lTextureName = "3D_" & inc
    textures_3D = lWorld.texture(lTextureName)
    if voidp(textures_3D) then
      textures_3D = lWorld.newTexture(lTextureName , #fromCastMember, castLib(2).member[inc])
    end if
   
    textures_3D.image = castLib(2).member[inc].image
   
    lModel = lWorld.model("vignette_" & inc)
    if voidp(lModel) then
--      put "oups"
    else
      lModel.shader.texture = textures_3D
    end if
  end repeat  
end

on flip
  member(1).model("ardoise").keyframeplayer.play("ardoise-Key", 0, 0, 825, 1)
  member(1).model("3D").keyframeplayer.play("3D-Key", 0, 0, 825, 1)
  member(1).model("Dessins").keyframeplayer.play("Dessins-Key", 0, 0, 825, 1)
  member(1).model("Photos").keyframeplayer.play("Photos-Key", 0, 0, 825, 1)
  member(1).model("Vidéo").keyframeplayer.play("Vidéo-Key", 0, 0, 825, 1)
  member(1).model("back2menu").keyframeplayer.play("back2menu-Key", 0, 0, 825, 1)
 
  repeat with inc = 1 to 16
    member(1).model("Vignette_" & inc).keyframeplayer.play("Vignette_" & inc &"-Key", 0, 0, 825, 1)
  end repeat
 
end
 


et ben avec tout ça, si il y en à qui ont lu jusqu'ici BRAVO! ;) ou merci!...

#2 papwal

    Ceinture Noire

  • Members
  • PipPipPipPipPipPipPip
  • 201 messages

Posté 05 April 2010 - 22:23 PM

Quelques suggestions:

- Pour simplifier certaines parties de ton code, faire une boucle qui parcourt un tableau avec tous les noms de textures : ["3D","dessins",...]

- Tu peux décomposer ton application en states ou au moins en routines finies pour gérer plus proprement l'enchainement des étapes: chargement, etc

#3 elran

    Ceinture Orange

  • Members
  • PipPipPip
  • 31 messages

Posté 12 April 2010 - 22:55 PM

merci pour tes suggestions...
faudra que je m'y mettes oui aux tableaux...

en attendant, j'ai trouver une petite solution qui fonctionne très bien, si l'animation provient d'un éditeur externe (3ds max dans mon cas) mais surtout si et uniquement si l'animation à jouer n'est pas très (trop) longue:

c'est tout simple, je décoche dans les propriétés de mon animation le fait qu'elle se joue en boucle.
puis dans ma scène, je fais en sorte que l'animation se joue une fois avant d'apparaitre, suffit de la masquer pendant le temps nécessaire (donc dans les propriétés décocher premier plan), 10 secondes dans mon cas, ça fait office de "préchargement", et après l'animation se joue sans saccade...

bah c'est un "préchargement" après tout! ;)
à noter que mon problème provenait de textures assez lourdes (1024 x 768) au nombre de 10 et qui provoquait une saccade de l'animation.

c'est un peu système D mon truc, mais pour des débutants comme moi qui se trouvent dans des conditions similaires, ça permet de passer à autre chose... (quitte à y revenir un de ces jours...)

Modifié par elran, 12 April 2010 - 22:57 PM.


#4 glurp

    Modérateur

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 1260 messages

Posté 13 April 2010 - 00:45 AM

Voir le messageelran, le 12 April 2010 - 22:55 PM, dit :

à noter que mon problème provenait de textures assez lourdes (1024 x 768) au nombre de 10 et qui provoquait une saccade de l'animation.
Attention à respecter les puissance de 2 pour les dimensions des textures si tu ne veux pas ramer sur certaines configuration et/ou dégrader la qualité d'affichage de la texture.

Donc soit tu utilises des textures de 1024*1024, soit tu découpes ta texture en plusieurs morceaux (1024*512 et 1024*256)



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP