From: Joe Wreschnig Date: Thu, 18 Mar 2010 08:17:09 +0000 (-0700) Subject: Optimizations: X-Git-Url: https://git.yukkurigames.com/?a=commitdiff_plain;h=3ee9895b163809deadc02fc1a34bce265cc89d3a;p=python-bulletml.git Optimizations: * Allow overrides of sin/cos functions, also makes them locals. * Only make one created array per bullet, and don't extend it with empty things. * Local cache for action.owner and action.params. --- diff --git a/bulletml/impl.py b/bulletml/impl.py index 8f94d55..f3d7e12 100644 --- a/bulletml/impl.py +++ b/bulletml/impl.py @@ -61,9 +61,9 @@ class Action(object): self.previous_fire_direction = other.previous_fire_direction self.previous_fire_speed = other.previous_fire_speed - def step(self, owner, rank): + def step(self, owner, rank, created, sin=math.sin, cos=math.cos): """Advance by one frame.""" - created = [] + s_params = self.params if self.speed_frames > 0: self.speed_frames -= 1 @@ -86,11 +86,11 @@ class Action(object): owner.my += self.my if self.pc is None: - return created + return if self.wait_frames > 0: self.wait_frames -= 1 - return created + return while True: self.pc += 1 @@ -111,21 +111,21 @@ class Action(object): action = self.actions[self.pc] if isinstance(action, parser.Repeat): - repeat, (actions, params) = action(self.params, rank) + repeat, (actions, params) = action(s_params, rank) child = Action(owner, self, actions, params, rank, repeat) owner.replace(self, child) - created.extend(child.step(owner, rank)) + child.step(owner, rank, created, sin, cos) break elif isinstance(action, (parser.ActionDef, parser.ActionRef)): - actions, params = action(self.params, rank) + actions, params = action(s_params, rank) child = Action(owner, self, actions, params, rank) owner.replace(self, child) - created.extend(child.step(owner, rank)) + child.step(owner, rank, created, sin, cos) break elif isinstance(action, (parser.FireDef, parser.FireRef)): - direction, speed, actions, offset = action(self.params, rank) + direction, speed, actions, offset = action(s_params, rank) if direction: direction, type = direction if type == "aim" or type is None: @@ -155,12 +155,12 @@ class Action(object): x, y = owner.x, owner.y if offset: - off_x, off_y = offset(self.params, rank) + off_x, off_y = offset(s_params, rank) if offset.type == "relative": - sin = math.sin(direction) - cos = math.cos(direction) - x += cos * off_x + sin * off_y - y += sin * off_x - cos * off_y + s = sin(direction) + c = cos(direction) + x += c * off_x + s * off_y + y += s * off_x - c * off_y else: x += off_x y += off_y @@ -170,7 +170,7 @@ class Action(object): created.append(bullet) elif isinstance(action, parser.ChangeSpeed): - frames, (speed, type) = action(self.params, rank) + frames, (speed, type) = action(s_params, rank) self.speed_frames = frames if type == "sequence": self.speed = speed @@ -180,32 +180,25 @@ class Action(object): self.speed = (speed - owner.speed) / frames elif isinstance(action, parser.ChangeDirection): - frames, (direction, type) = action(self.params, rank) + frames, (direction, type) = action(s_params, rank) self.direction_frames = frames self.aiming = False if type == "sequence": self.direction = direction else: if type == "absolute": - self.direction = ( - direction - owner.direction) % PI_2 + direction -= owner.direction elif type == "relative": - self.direction = direction + direction = direction else: self.aiming = True - self.direction = ( - direction - + owner.aim - - owner.direction) % PI_2 + direction += owner.aim - owner.direction - if self.direction > math.pi: - self.direction -= PI_2 - if self.direction < -math.pi: - self.direction += PI_2 - self.direction /= self.direction_frames + self.direction = ( + (direction + math.pi) % PI_2 - math.pi) / frames elif isinstance(action, parser.Accel): - frames, horizontal, vertical = action(self.params, rank) + frames, horizontal, vertical = action(s_params, rank) self.accel_frames = frames if horizontal: mx, type = horizontal @@ -234,15 +227,13 @@ class Action(object): pass elif isinstance(action, parser.Wait): - self.wait_frames = action(self.params, rank) + self.wait_frames = action(s_params, rank) break elif isinstance(action, parser.Vanish): owner.vanish() break - return created - class Bullet(object): """Simple bullet implementation. @@ -333,7 +324,7 @@ class Bullet(object): else: self._actions[idx] = new - def step(self): + def step(self, sin=math.sin, cos=math.cos): """Advance by one frame. This updates the position and velocity, and may also set the @@ -344,11 +335,11 @@ class Bullet(object): created = [] for action in self._actions: - created.extend(action.step(self, self.rank)) + action.step(self, self.rank, created, sin, cos) self.px = self.x self.py = self.y - self.x += self.mx + math.sin(self.direction) * self.speed - self.y += self.my - math.cos(self.direction) * self.speed + self.x += self.mx + sin(self.direction) * self.speed + self.y += self.my - cos(self.direction) * self.speed return created