+  oZone3D.Net Forums
|-+  Our Softwares» Demoniak3D - French Forums» Wish List» Container pour objet ?
Username:
Password:
Pages: [1]
  Print  
Author Topic: Container pour objet ?  (Read 1456 times)
0 Members and 1 Guest are viewing this topic.
Steph3D
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« 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
Quote
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 ?  gratgrat  hat
Logged

Steph
JeGX
Global Moderator
Capo Bastone
*****
Posts: 1847



View Profile WWW
« 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:

Code:
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:

Code:
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
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« 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  lol

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#msg767

gestion des collisions simplifiées avec le décor, déplacement avancé du véhicule. Maintenant j'attaque le système de tire  Cool
Logged

Steph
Steph3D
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« 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


Code:
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

Code:
id_objet= HYP_Object.Clone("Roquette");
SetFireContainer(id_objet, speed, impact);

pour recup les données

Code:
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  mrgreen
« Last Edit: February 15, 2008, 06:32:50 AM by Steph3D » Logged

Steph
JeGX
Global Moderator
Capo Bastone
*****
Posts: 1847



View Profile WWW
« 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
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« Reply #5 on: February 15, 2008, 11:47:11 AM »

Ok, j'ai netoyé les tableaux comme ça
Code:
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  roll

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  confused mais il y a encor des résidus indésirable en memoire  neutral

Allé, encor quelques fonctions et optimisations, et ça sera plus un probleme pour faire des gros jeux  Cool tu pourra foutre la paté à microsoft et son XNA  lol
Logged

Steph
JeGX
Global Moderator
Capo Bastone
*****
Posts: 1847



View Profile WWW
« Reply #6 on: February 15, 2008, 02:24:07 PM »

oui c'est nil la valeur pour lua, je confond avec le php  coop

Sinon en LUA, tu as la fonction collectgarbage():

Code:
collectgarbage("collect");
pour nettoyer la memoire
et
Code:
bytes_allocated = collectgarbage("count");
qui te donne l'occupation courante de la memoire par LUA.

Logged

Steph3D
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« 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 Wink )

Tu verra vitte, au début ça carbure à 60 img/s, puis doucement les fps vont chuter, et la ram méchamment augmenter  Cry

tu dois avoir un problème avec les clones  neutral

Code:
<?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

Steph
JeGX
Global Moderator
Capo Bastone
*****
Posts: 1847



View Profile WWW
« 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  Wink
Logged

Steph3D
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« Reply #9 on: February 26, 2008, 09:38:14 AM »

Enorme probleme meme  med

Cool, on vas enfin pouvoir faire des jeux de shoot, des particules ou des forets en clones sans que ça rame  kimouss
Logged

Steph
JeGX
Global Moderator
Capo Bastone
*****
Posts: 1847



View Profile WWW
« 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
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« 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

Steph
shadow
Moderator
Capo Regime
*****
Posts: 278



View Profile WWW
« Reply #12 on: February 26, 2008, 08:14:12 PM »

Quote
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.  transpi
Et comme le vertex shader n'est exécuté que pour les... vertex (wow, je suis fort moi çe soir  transpi2), il a beaucoup moins d'impact sur les perfos qu'un pixel shader, à complexité d'algo égale.
Logged

3D, photos panoramiques : http://www.shadows.fr
Steph3D
Administrator
Capo Regime
*****
Posts: 325



View Profile WWW
« 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 ? mrgreen

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

Steph
Pages: [1]
  Print  
 
Jump to: