Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 12:22

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Partikelsystem langsam
BeitragVerfasst: Sa Jul 26, 2008 17:24 
Offline
DGL Member

Registriert: Di Mai 27, 2008 17:07
Beiträge: 21
Hallo! Ich habe in Python einen Partikelfilter erstellt, schon bei 50 Partikeln ist das ganze langsam wie eine Schnecke, woran kann das liegen? :(

Code:
  1. from OpenGL.GLUT import *
  2. from OpenGL.GLU import *
  3. from OpenGL.GL import *
  4. from Image import *
  5. import particle, random
  6.  
  7. class ParticleSwarm(object):
  8.    
  9.     def __init__(self):
  10.        
  11.         self.MAX_PARTICLES = 100
  12.        
  13.         self.slowdown = 2
  14.         self.xspeed = 0.0
  15.         self.yspeed = 0.0
  16.         self.zoom = -40.0
  17.        
  18.         self.loop = 0
  19.         self.col = 0
  20.        
  21.         self.xpos = 0
  22.         self.ypos = -0.1
  23.         self.zpos = 0
  24.        
  25.         self.texture = self.loadTexture()
  26.        
  27.         self.particles = [particle.Particle()] * self.MAX_PARTICLES
  28.                
  29.         for loop in range(self.MAX_PARTICLES):
  30.             self.particles[loop].active = True
  31.             self.particles[loop].life=1.0;                               # Give All The Particles Full Life
  32.             self.particles[loop].fade=0.2    # Random Fade Speed
  33.             self.particles[loop].xi=random.random()       # Random Speed On X Axis
  34.             self.particles[loop].yi=random.random()       # Random Speed On Y Axis
  35.             self.particles[loop].zi=random.random()      # Random Speed On Z Axis
  36.             self.particles[loop].xg=0.0                                   # Set Horizontal Pull To Zero
  37.             self.particles[loop].yg=-10                                # Set Vertical Pull Downward
  38.             self.particles[loop].zg=0.0
  39.        
  40.     def loadTexture(self):
  41.         """Creates the Textureobject for the particles"""
  42.        
  43.         img = open("particles/Particle.png")
  44.         img = img.tostring("raw", "RGBX", 0, -1)
  45.        
  46.         texture = glGenTextures(1)
  47.         glBindTexture(GL_TEXTURE_2D, texture)
  48.        
  49.         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 32, 32, 0, GL_RGBA, GL_UNSIGNED_BYTE, img)
  50.        
  51.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
  52.         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
  53.        
  54.         glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL)
  55.        
  56.         return texture
  57.        
  58.     def display(self):
  59.        
  60.         for loop in range(self.MAX_PARTICLES):
  61.            
  62.             if self.particles[loop].active:
  63.                
  64.                 x = self.particles[loop].x
  65.                 y = self.particles[loop].y
  66.                 z = self.particles[loop].z
  67.                
  68.                 size = 0.01
  69.                
  70.                 #load the Textureobject
  71.                 glEnable(GL_TEXTURE_2D)
  72.                 glBindTexture(GL_TEXTURE_2D, self.texture)
  73.                
  74.                 glColor4f(1.0,1.0,1.0,1.0);            
  75.                 #glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  76.                
  77.                 glBegin(GL_QUADS);                     # Build Quad From A Triangle Strip
  78.                 glTexCoord2d(1,1); glVertex3f(x+size,y+size,z); # Top Right
  79.                 glTexCoord2d(0,1); glVertex3f(x-size,y+size,z); # Top Left
  80.                 glTexCoord2d(1,0); glVertex3f(x+size,y-size,z); # Bottom Right
  81.                 glTexCoord2d(0,0); glVertex3f(x-size,y-size,z); # Bottom Left
  82.                 glEnd();                                       # Done Building Triangle Strip
  83.                 glDisable(GL_TEXTURE_2D)
  84.            
  85.                 self.particles[loop].x+=self.particles[loop].xi/(self.slowdown*1000)# Move On The X Axis By X Speed
  86.                 self.particles[loop].y+=self.particles[loop].yi/(self.slowdown*1000)# Move On The Y Axis By Y Speed
  87.                 self.particles[loop].z+=self.particles[loop].zi/(self.slowdown*1000)# Move On The Z Axis By Z Speed
  88.            
  89.                 self.particles[loop].xi+=self.particles[loop].xg            # Take Pull On X Axis Into Account
  90.                 self.particles[loop].yi+=self.particles[loop].yg            # Take Pull On Y Axis Into Account
  91.                 self.particles[loop].zi+=self.particles[loop].zg            # Take Pull On Z Axis Into Account
  92.                 self.particles[loop].life-=self.particles[loop].fade        # Reduce Particles Life By 'Fade'
  93.                
  94.                 if self.particles[loop].life<0.0:                    # If Particle Is Burned Out
  95.                    
  96.                     self.particles[loop].life=1.0                    # Give It New Life
  97.                     self.particles[loop].fade=0.15    # Random Fade Value
  98.                     self.particles[loop].x=self.xpos                       #  Center On X Axis
  99.                     self.particles[loop].y=self.ypos                      #  Center On Y Axis
  100.                     self.particles[loop].z=self.zpos                       #  Center On Z Axis
  101.                     self.particles[loop].xi=self.xspeed+(10*(random.random()))    # X Axis Speed And Direction
  102.                     self.particles[loop].yi=self.yspeed+(10*(random.random()))    # Y Axis Speed And Direction
  103.                     self.particles[loop].zi=((60 * random.random())-30.0)    # Z Axis Speed And Direction
  104.                    
  105.        
  106.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 26, 2008 17:33 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
Alle Partikel sollten die selbe Textur haben, dann kannst du sie in etwa so rendern:

Code:
  1. glEnable(GL_TEXTURE_2D)
  2. glBindTexture(GL_TEXTURE_2D, self.texture)
  3. glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  4. glbegin(GL_Quads);
  5. for each particle
  6. begin
  7.                 glTexCoord2d(1,1); glVertex3f(x+size,y+size,z); # Top Right
  8.                 glTexCoord2d(0,1); glVertex3f(x-size,y+size,z); # Top Left
  9.                 glTexCoord2d(1,0); glVertex3f(x+size,y-size,z); # Bottom Right
  10.                 glTexCoord2d(0,0); glVertex3f(x-size,y-size,z); # Bottom Left
  11. end;
  12. glEnd;


Falls das nicht reicht auf VertexBuffers/Arrays umsteigen.

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 26, 2008 17:55 
Offline
DGL Member

Registriert: Di Mai 27, 2008 17:07
Beiträge: 21
Habe das Texturen-Laden mal aus der Schleife rausgezogen, leider keine Veränderung.
Wie funktioniert das denn mit Vertex Arrays? Die Koordinaten ändern sich doch ständig oder? Hab damit noch nciht gearbeitet, würde das mehr bringen? :oops:

Bzw. geht das auch irgendwie mit Display Listen? Hab das mal versucht aber dann bewegen sich die Partikel nicht mehr sondern stehen still.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jul 26, 2008 18:23 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Generelles, worauf du achten solltest, damit der Kram performant ist:

- Trenne tote und lebende Partikel und iteriere nur über die lebenden.

- Ist ein Partikel tot, schiebe ihn in die Liste toter Partikel um ihn bei Bedarf wiederzubeleben. -> Keine teuren Speicherallokierungsaufrufe. Achte darauf, dass du dafür eine geeignete Datenstruktur wählst. Ein Array ist da das falsche, da das Entfernen teuer ist, weil alle nachfolgenden Elemente verschoben werden müssen. Eine verkettete Liste ist ziemlich ideal dafür. Es ist ja egal, an welcher Stelle in der Struktur der Partikel ist. Einfach bei den toten z.B. vorne anhängen und vorne wieder runternehmen zum Wiederbeleben.

- So wenig wie möglich in der Zeichenschleife machen. -> Einmal nur die Textur und alle anderen benötigten States vor der Schleife setzen. Besonders Texturen binden ist sehr teuer.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Partikelsystem langsam
BeitragVerfasst: Sa Jul 26, 2008 18:50 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
glBegin/glEnd auch noch rausziehen
die glEnable/glDisable calls natürlich auch
Falls möglich eine Referenz auf self.particles[loop] holen und die manipulieren
Und was verstehst du unter langsam wie ne Schnecke? <10fps?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2008 13:34 
Offline
DGL Member

Registriert: Di Mai 27, 2008 17:07
Beiträge: 21
Hey,
das liegt irgendwie nicht nur am Partikelsystem.
Also folgendes: Ich hab eine Spielfigur im raum, die fliegt da rum, wenn man sie steuert, das geht auch gut und flüssig.
Wenn ich jetzt irgendwas ins Level einbaue (Heightmap z.B., als DisplayListe) Wird die Steuerung der Figur sau langsam. Wenn ich die Geschwindigkeitsvektoren der Spielfigur erhöhe wird sie wieder schneller, läuft auch flüssig. Nur das Drehen geht ganz langsam. Kapiere ich irgendwie nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2008 13:42 
Offline
DGL Member
Benutzeravatar

Registriert: Di Jul 29, 2003 00:11
Beiträge: 436
Klingt, als ob die Bewegung nicht unabhängig von der Framezahl wäre. Entsprechendes Tutorial gibt es im Wiki.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2008 14:18 
Offline
DGL Member

Registriert: Di Mai 27, 2008 17:07
Beiträge: 21
Ja in der Tat, das sind sie nicht, meine ich zumindest.
In welchem Tutorial steht das denn, bzw. wie krieg ich das unabhängig?
In diesem hier irgendwo? Ich bin blind http://wiki.delphigl.com/index.php/Tuto ... rne_bewegt


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 27, 2008 14:28 
Offline
DGL Member

Registriert: Di Mai 27, 2008 17:07
Beiträge: 21
Ah ich habs, time based movement oder? :) Ich les es mir mal durch


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 16 Queries | GZIP : On ]