Author Topic: Container pour objet ?  (Read 14763 times)

0 Members and 1 Guest are viewing this topic.

Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Container pour objet ?
« 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:

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Re: Container pour objet ?
« 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: [Select]
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: [Select]
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.

Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Re: Container pour objet ?
« 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  8)

Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Re: Container pour objet ?
« 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: [Select]
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: [Select]
id_objet= HYP_Object.Clone("Roquette");
SetFireContainer(id_objet, speed, impact);

pour recup les données

Code: [Select]
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 »

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Re: Container pour objet ?
« 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.

Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Re: Container pour objet ?
« Reply #5 on: February 15, 2008, 11:47:11 AM »
Ok, j'ai netoyé les tableaux comme ça
Code: [Select]
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  8) tu pourra foutre la paté à microsoft et son XNA  :lol:

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Re: Container pour objet ?
« 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: [Select]
collectgarbage("collect");
pour nettoyer la memoire
et
Code: [Select]
bytes_allocated = collectgarbage("count");
qui te donne l'occupation courante de la memoire par LUA.


Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Re: Container pour objet ?
« 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  :neutral:

Code: [Select]
<?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>

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Re: Container pour objet ?
« 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  ;)

Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Re: Container pour objet ?
« 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:

JeGX

  • Global Moderator
  • Capo Crimine
  • *****
  • Posts: 2385
    • oZone3D.Net
Re: Container pour objet ?
« 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).

Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Re: Container pour objet ?
« 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 ?

shadow

  • Capo Regime
  • ***
  • Posts: 353
Re: Container pour objet ?
« 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.
3D, photos panoramiques : http://www.shadows.fr

Steph3D

  • Capo Regime
  • ***
  • Posts: 399
Re: Container pour objet ?
« 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.