Particle lag :(

Good day, sirs and ladies.

Working in a project with JuanReyes and Arbosis, I had to detect some troubles in this code:

from direct.showbase.ShowBase import ShowBase
from direct.showbase import DirectObject
from pandac.PandaModules import *
from panda3d.core import CollisionTraverser,CollisionNode,CollisionHandler   #TESTING
from direct.interval.IntervalGlobal import *
from direct.task import Task
from direct.particles.Particles import Particles
from direct.particles.ParticleEffect import ParticleEffect
#to load animations of photos
from textureMovie import *
# explosion follow camera
from panda3d.core import BillboardEffect

import profile

class projectile(DirectObject.DirectObject):
	def __init__(self, level_, startPos_, duration_, startVel_):
		self.name = str(globalClock.getFrameCount())
		self.level = level_
		self.node = NodePath('projectile'+self.name)
		self.node.reparentTo(render)
		
		self.nodeModel = self.node.attachNewNode("rocketModel")
				profile.SuperModels().getModel("smiley").instanceTo(self.nodeModel)
		self.nodeModel.setScale(0.3)
		self.nodeModel.reparentTo(self.node)
		self.collisionHandler = 0
		self.traverser = 0
		self.explo = 0
		self.createCollisions()
		self.trajectory = ProjectileInterval(self.node,
                                     startPos = startPos_,
                                     duration = duration_, startVel = startVel_,
                                     gravityMult=0.000000001)
		#Plays Shoot SFX
		self.SoundFX = loader.loadSfx('../sfx/gunshots/fireshot.wav')
		
		self.SoundFX.setLoop(False)
		self.SoundFX.play()
		self.setupEvents()
		self.trajectory.setDoneEvent("killProjectile" + self.name)
		self.trajectory.start()

	def createCollisions(self):
		self.traverser = CollisionTraverser('traverser')
		self.traverser.showCollisions(render)
		self.cNode = CollisionNode('projectile')
		self.cNode.addSolid(CollisionSphere(0,0,0,0.5))
		self.cNode.setCollideMask(BitMask32(0x10))
		self.cNodePath = self.node.attachNewNode(self.cNode)
		self.collisionHandler = CollisionHandlerEvent()
		self.collisionHandler.addInPattern('projectileHit' + self.name)
		base.cTrav.addCollider(self.cNodePath, self.collisionHandler)
	
	def setupEvents(self):
		self.accept("killProjectile" + self.name, self.killProjectile)
		self.accept("projectileHit" + self.name, self.hitEvent)
	def hitEvent(self,entry):
		impactedNode = entry.getIntoNodePath().getParent();
		if impactedNode.getTag("enemy") ==  "hola":
			for i in self.level.enemyList:
				if i.node == impactedNode:
					if i.state == "Damaged":
						
						i.request("Die")
					else:
						i.request("Damaged")
					break			
		self.killProjectile()
		
	def killProjectile(self):
		self.trajectory.pause()
		self.nodeModel.remove()
		self.pef = ParticleEffect()
		self.pef.loadConfig(Filename("models/fireish.ptf"))
		self.pef.start(self.node)
		self.smoke = ParticleEffect()
		self.smoke.loadConfig(Filename("models/smoke.ptf"))
		self.smoke.start(self.node)
		taskMgr.doMethodLater(1,self.killExplosion,"killExplosionTask"+str(id(self.node)))
		taskMgr.doMethodLater(3,self.killSmoke,"killSmokeTask"+str(id(self.node)))	
	def killExplosion(self,task):
		self.pef.disable()
		return Task.done
	def killSmoke(self,task):
		self.smoke.disable()
		self.node.removeNode()
		self.nodeModel.removeNode()
		return Task.done

Basically, it is a Projectile system. When I press the shoot button, it shoots, no problem. But, if I shoot too much, it lags has hell. Reasons, 2:

  • Okay, too much particles may lag the system graphically, that’s comprehensible.

  • Too much particles turn the system Laggy, even when particle effects were removed.

So, the question is… “Where am I failing?”. I still can’t detect which thing is wrong. I partially made it to get less laggy because I wasn’t removing the Children from the nodeModel, but even so the cumulative lag keeps in there.

:frowning: help please.

Hmm, you should probably be calling ParticleEffect.cleanup() instead of just disable().

David

Is this related to your problem? In the case, we’ve to wait for this.