|
Steph3D
|
 |
« on: February 14, 2008, 04:40:12 AM » |
|
J'aurais besoin de stocker des infos variables dans un objet, style Speed = 5; Force = 20; etc... Vouis, il y a les tableaux, mais la c'est pour mes clones variables dans le temps et qui sont donc basé sur un objet de référence, les données sont initialisées au clonage, mais après chaque clone à des données différentes et une durée de vie indéfinie. Dans C4D, je peux créer des zones de stockage pour les variables propre à chaque objet, style SetContainer(Mon_Objet, id, valeur); Pour un truc comme ça Nb= HYP_Object.GetNumChildren( "Layer1" ); Index=3; i=0;
while (i<Nb) do
ID = HYP_Object.GetChildByIndex( "Layer1", i ); Live=GetContainer(ID,Index);
if(Live==0) then HYP_Object.RemoveChild( "Layers1",ID); Nb=Nb-1; end
i=i+1;
end A moins qu'il existe une autre methode de taf aussi efficace ? 
|
|
|
|
|
Logged
|
|
|
|
|
JeGX
|
 |
« Reply #1 on: February 14, 2008, 12:44:52 PM » |
|
le plus simple est de faire quelque chose en LUA pour gérer tes containers: function newContainer( object_id, speed, force ) local container = { m_id=object_id, m_speed=speed, m_force=force}; return(container); end
id = HYP_Object.GetChildByIndex( "Layer1", i ); myContainer = newContainer(id, 5.0, 20.0);
et après tu accèdes directement aux variables membres d'un container: local speed = myContainer.m_speed;
Bon ce code serait plus élégant avec une structure plus orienté objet. Dès que la math lib sera dispo, tu pouras t'en inspirer pour coder en objet avec LUA.
|
|
|
|
|
Logged
|
|
|
|
|
Steph3D
|
 |
« Reply #2 on: February 14, 2008, 05:11:05 PM » |
|
Oki, je vais expérimenter le truc, à 1er vue ça risque quand même d'être lourds comme je disais avec les tableaux, la ta déjà prédéfini à l'avance l'emplacement. Mais si j'ai des objets de type différents avec chacun une 10e de containers, ça en fait des trucs à prédéfinir. Si en plus je crée des centaines de milliers de clones pendant la session avec une durée de vie courte, vas falloirs nettoyer aussi les tableaux, car la c'est pas très propre. C'est effectivement plus simple en objet, faudrait certainement définir une class objet avec ses propre containers. Puis faire create ma_classe_objet et destroy ma_classe_objet. Mais en LUA, je sais pas trop comment ça marche, surtout que ça semble pas être un vrai langage objet, mais de la bidouille. Pis faut que je me rappelle comment en programme en objet, j'ai plus fait ça depuis 10ans sur Delphi2  Enfin bon, j'ai déjà fait pas mal de p'tites fonctions, encor un peu, et j'aurais un moteur de jeu. Pour le moment j'en suis la http://forum.steph3d.net/index.php/topic,349.msg767.html#msg767gestion des collisions simplifiées avec le décor, déplacement avancé du véhicule. Maintenant j'attaque le système de tire 
|
|
|
|
|
Logged
|
|
|
|
|
Steph3D
|
 |
« Reply #3 on: February 15, 2008, 05:53:56 AM » |
|
Le vraie code pour des chaines d'objets multiple et variable, c'est avec un tableau à deux dimentions function SetFireContainer( id, speed, impact ) if( f_container==nil) then f_container = {}; end f_container[id] = {c_speed=speed,c_impact=impact}; end pour mémoriser l'objet dans la chaine id_objet= HYP_Object.Clone("Roquette"); SetFireContainer(id_objet, speed, impact); pour recup les données ID = HYP_Object.GetChildByIndex( "Layer", i ); local FireSpeed=f_container[ID].c_speed; local Impact=f_container[ID].c_impact; Reste qu'un truc à trouver, comment effacé des entrées dans un tableau ? en même temps que l'objet associé, histoire de pas remplir la mémoire pour rien avec un tableau énorme aussi bien rangé que mon bureau à la fin 
|
|
|
|
« Last Edit: February 15, 2008, 06:32:50 AM by Steph3D »
|
Logged
|
|
|
|
|
JeGX
|
 |
« Reply #4 on: February 15, 2008, 09:37:07 AM » |
|
cool ta petite video. Dès que tu en as une nouvelle, tiens nous informé.
Souvent pour suuprimer un objet en LUA, il suffit de lui affecter la valeur null. Le garbage collector de lua se chargera de nettoyer la memoire.
|
|
|
|
|
Logged
|
|
|
|
|
Steph3D
|
 |
« Reply #5 on: February 15, 2008, 11:47:11 AM » |
|
Ok, j'ai netoyé les tableaux comme ça f_container[ID]=nil; Testé avec le gestionnaire des taches, la ram se remplis effectivement moins vitte quand je crée et detruit des clones en rafale, au depar j'etait vitte passé de 50Mo à 300, comme je m'en doutais  Mais meme avec ça, la ram continue à augmenter quand je lance les clones, alors je sais pas si c'est le LUA, ou ton RemoveChild  mais il y a encor des résidus indésirable en memoire  Allé, encor quelques fonctions et optimisations, et ça sera plus un probleme pour faire des gros jeux  tu pourra foutre la paté à microsoft et son XNA 
|
|
|
|
|
Logged
|
|
|
|
|
JeGX
|
 |
« Reply #6 on: February 15, 2008, 02:24:07 PM » |
|
oui c'est nil la valeur pour lua, je confond avec le php  Sinon en LUA, tu as la fonction collectgarbage(): collectgarbage("collect");
pour nettoyer la memoire et bytes_allocated = collectgarbage("count");
qui te donne l'occupation courante de la memoire par LUA.
|
|
|
|
|
Logged
|
|
|
|
|
Steph3D
|
 |
« Reply #7 on: February 15, 2008, 09:11:05 PM » |
|
Tiens, essaye mon script, c'est un clonage en rafale ( pis un debut de sprite 3d pour shadow  ) Tu verra vitte, au début ça carbure à 60 img/s, puis doucement les fps vont chuter, et la ram méchamment augmenter  tu dois avoir un problème avec les clones  <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?> <hyperion version="1.0">
<scene name="training_scene" display_fps="TRUE" show_ref_grid="TRUE" > <window_size width="800" height="600" /> <background_color r="0.0" g="0.0" b="0.0" /> </scene>
<camera name="my_camera" navigation_mode="FLY" fov="50.0" > <position x="0.0" y="50.0" z="150.0" /> </camera>
<light name="my_light" type="OMNI" render="FALSE" > <position x="0.0" y="100.0" z="100.0" /> <diffuse r="1.0" g="1.0" b="1.0" a="1.0" /> </light> <gizmo name="Main_Gizmo" render="FALSE" ><position x="0.0" y="100.0" z="0.0" /></gizmo> <mesh name="my_torus" render="TRUE" shape_type="TORUS" lighting="TRUE" auto_spin="TRUE" polygon_mode="SOLID" average_normals="TRUE" >
<position x="0.0" y="0.0" z="0.0" /> <torus radius="10.0" vertex_density="10" section_radius="5.0" />
<attach_material name="mat_torus" /> <vertices_color r="1.0" g="1.0" b="1.0" a="1.0" /> <spin_values x="0.0" y="0.0" z="0.0" /> </mesh> <script name="updateScene" run_mode="EXECUTE_EACH_FRAME" > <raw_data><![CDATA[
clone_id=HYP_Object.Clone("my_torus");
local _x=math.random(-200.0,200.0); local _y=-100; local _z=math.random(-200.0,200.0);
HYP_Object.SetPosition( clone_id, _x, _y, _z); HYP_Scene.RemoveObject(clone_id); HYP_Object.AddChild("Main_Gizmo", clone_id ); Nb= HYP_Object.GetNumChildren( "Main_Gizmo"); i=0; while (i<Nb) do local ID = HYP_Object.GetChildByIndex( "Main_Gizmo", i );
local _x, _y, _z = HYP_Object.GetPosition( ID ); HYP_Object.SetPosition( ID, _x, _y+2, _z); if(_y>150) then HYP_Object.RemoveChild("Main_Gizmo",ID); Nb=Nb-1; end i=i+1; end
]]></raw_data> </script>
</hyperion>
|
|
|
|
|
Logged
|
|
|
|
|
JeGX
|
 |
« Reply #8 on: February 26, 2008, 09:04:38 AM » |
|
Je viens d'ajouter la fonction HYP_Object.Destroy(). Avec une très légère modif de ton code, la demo tourne à 300 FPS en permance sans perte de mémoire... Merci pour avoir souvelé ce pb 
|
|
|
|
|
Logged
|
|
|
|
|
Steph3D
|
 |
« Reply #9 on: February 26, 2008, 09:38:14 AM » |
|
Enorme probleme meme  Cool, on vas enfin pouvoir faire des jeux de shoot, des particules ou des forets en clones sans que ça rame 
|
|
|
|
|
Logged
|
|
|
|
|
JeGX
|
 |
« Reply #10 on: February 26, 2008, 10:06:20 AM » |
|
Bon faut tout de même pas pousser. La gestion de l'instancing est super naze dans Demoniak3D. Je viens de coder du vrai instancing (la demo sera sur mon blog aujourd'hui) et Demoniak3D est à la masse sur ce sujet. Tu pourras cloner des objets dans une limite raisonnable mais c'est tout (genre une foret d'une centaine d'arbres...). Je vais améliorer le support de l'instancing dans Demoniak3D mais un peu plus tard (manque de temps pour le moment).
|
|
|
|
|
Logged
|
|
|
|
|
Steph3D
|
 |
« Reply #11 on: February 26, 2008, 08:01:22 PM » |
|
Par grave, d'ici à se que je digère bien le code et les shader, ta le temps avant que j'en arrive aux démos serieuse, c'est un boulot monstre tout ça ! Si déjà je peux faire des tires, sans que ça rame au bout de 3 minutes, je peux déjà avancer, pareil pour la recherche de clonage des plantes
Et ça marche comment avec les vertex shaders, si je déforme un objet en vertex shader, et que je le clone une 20e de fois, ça va ramé je suppose ?
|
|
|
|
|
Logged
|
|
|
|
|
shadow
|
 |
« Reply #12 on: February 26, 2008, 08:14:12 PM » |
|
Et ça marche comment avec les vertex shaders, si je déforme un objet en vertex shader, et que je le clone une 20e de fois, ça va ramé je suppose ? Non, c'est comme pour les pixel shaders : tout dépend des perfos du shader.  Et comme le vertex shader n'est exécuté que pour les... vertex (wow, je suis fort moi çe soir  ), il a beaucoup moins d'impact sur les perfos qu'un pixel shader, à complexité d'algo égale.
|
|
|
|
|
Logged
|
|
|
|
|
Steph3D
|
 |
« Reply #13 on: February 26, 2008, 08:35:23 PM » |
|
Hum, oui ça dépend, si l'objet et complexe, alors il y a beaucoup de vecteurs, de plus, j'ai l'impression qu'une déformation bouffe bien plus qu'une simple colorisation par vertex :? J' peu pas dir que mon test de hiegfield soit un modèle de performance par rapport à l'original, et ça serait bien que ça s'exécute pas en permence pour une déformation fixe, ces cons de shader non aucune mémoire. Faut que je regarde se qui se passe quand je stop la fonction par LUA, mon GPU va explosé ? une fracture vers la 4e dimension ?  Bon pour les clones, faut voir si le vertex shader et cloné, ou si ça s'applique pour chaque clone, sais pas se que ça peu donner... Sinon mon eclairage par vertex serait plus rapide qu'un en fragment ? mais toute maniere, comme ça finit par un remplissage par pixel, donc hors du cas de la simple deformation, je ne pense pas.
|
|
|
|
|
Logged
|
|
|
|
|