128個のパーティクルをレンダリングするときにプログラムが遅くなるのはなぜですか? 30fps以下で十分ではないと思います。128個のパーティクルをレンダリングしているときに、pygletプログラムが遅くなるのはなぜですか?
すべて私は128個の粒子をレンダリングし、それらにいくつかの基本的な重力を与えているん
on_draw機能
def on_draw(self, time=None):
glClearColor(0.0, 0.0, 0.0, 1.0)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glLoadIdentity()
self.particles.append(Particle())
for particle in self.particles:
particle.draw()
if particle.is_dead:
self.particles.remove(particle)
粒子クラス
class Particle:
def __init__(self, **kwargs):
self.acceleration = Vector2(0, 0.05)
self.velocity = Vector2(random.uniform(-1, 1), random.uniform(-1, 0))
self.position = Vector2()
self.time_to_live = 255
self.numpoints = 50
self._vertices = []
for i in range(self.numpoints):
angle = math.radians(float(i)/self.numpoints * 360.0)
x = 10 * math.cos(angle) + self.velocity[0] + 300
y = 10 * math.sin(angle) + self.velocity[1] + 400
self._vertices += [x, y]
def update(self, time=None):
self.velocity += self.acceleration
self.position -= self.velocity
self.time_to_live -= 2
def draw(self):
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
glPushMatrix()
glTranslatef(self.position[0], self.position[1], 0)
pyglet.graphics.draw(self.numpoints, GL_TRIANGLE_FAN, ('v2f', self._vertices), ('c4B', self.color))
glPopMatrix()
self.update()
@property
def is_dead(self):
if self.time_to_live <= 0:
return True
return False
@property
def color(self):
return tuple(color for i in range(self.numpoints) for color in (255, 255, 255, self.time_to_live))
いくつかのこと:間違った種類のOpenGLを使い始めました。 "modern OpenGL"を検索し、最初からやり直してください。あなたのコードは、あらゆる種類の古いOpenGLナンセンスで盛り込まれています。 'Particle'のインスタンス上で' draw'を呼び出すたびに、GL状態を重複して更新します。ブレンド状態 - 外側のレンダリングループにその要素を引き出します。それ以外にも、あなたの問題を引き起こすものはそれほど明白ではありませんが、1995年からGPUを使用していない限り、純粋にCPUバウンドになっている可能性が非常に高いです(いくつかの色付きポイントはGL実装やGPUに日々)。 – thokra