Hello. I want to use Panda3d to display 2d sprites. I decided to test how many sprtites on the screen it can handle.
Using CardMaker I could get only 1500 static sprites on screen before FPS dropped below 60.
2000 sprites gives only 40 FPS, and 8000 sprites is already 10 FPS.
I am running Windows 10 on Xeon E3 and GeForce 1050.
What am I doing wrong? Is there a better way to draw sprites?
Parts of the code below is borrowed from the forum, particualrly the create_sprites_node_setup
function.
import random
from pandac.PandaModules import TextureStage, CardMaker, TextNode
from direct.showbase.ShowBase import ShowBase
def create_sprites_node_setup(screenWidth, screenHeight, parent):
aspect_ratio = parent.getScale()[0]
screenOrigin = parent.attachNewNode('screen_origin')
screenNode = screenOrigin.attachNewNode('screen_node')
screenOrigin.setPos(-1.0 / aspect_ratio, 0.0, 1.0)
screenOrigin.setScale(2.0, 1.0, -2.0)
screenNode.setPos(0, 0, 0)
screenNode.setScale(1.0 / (aspect_ratio * screenWidth), 1.0, 1.0 / screenHeight)
screenNode.setTexScale(TextureStage.getDefault(), 1.0, -1.0)
return screenNode
def add_sprites():
n = 500
for _ in range(0, n):
sprite = cm.generate()
rx = random.randint(0, SCREEN_WIDTH)
rz = random.randint(0, SCREEN_HEIGHT)
spriteNP = base.aspect2d.attachNewNode(sprite)
spriteNP.setTexture(texture)
spriteNP.setPos(rx, 0, rz)
spriteNP.setScale(texture.getOrigFileXSize(), 1.0, texture.getOrigFileYSize())
spriteNP.setTransparency(True)
spriteNP.reparentTo(sprites_root)
global counter
counter += n
change_counter()
def change_counter():
global counter
text.setText("Sprite count: {} \nPress Space to add more".format(counter))
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
base = ShowBase()
base.setFrameRateMeter(True)
base.accept('space', add_sprites)
sprites_root = create_sprites_node_setup(SCREEN_WIDTH, SCREEN_HEIGHT, base.render2d)
texture = base.loader.loadTexture("panda.png")
cm = CardMaker('spritesMaker')
counter = 0
text = TextNode('counter')
textNodePath = base.render2dp.attachNewNode(text)
textNodePath.setScale(0.07)
textNodePath.setPos(-1, 0, .9)
textNodePath.setColor(1.0, 0.0, 0.0, 1)
change_counter()
base.run()