2012-08-22 5 views
0

나는 내가 주변에서 어슬렁 거리고있는 간단한 탑 다운 사수 라 갈라가를 가지고있다. 그러나, 문서를 살펴본 후에는 이미지를 효율적으로로드하는 방법과 프레임마다 블립할지 여부에 대해 혼란스러워졌습니다. 모든 이미지는 파이 게임 스프라이트 클래스를 상속받은 몇 개의 클래스를 통해로드됩니다. 지금이 순간, 나는 같은 클래스 레벨의 속성으로 이미지를로드하고 있습니다 :이 메모리에 나는 새로운 레이저를 만들 때마다 (이미지의 새로운 인스턴스를로드에서 파이썬을 방지 바라고 있어요프레임 당 이미지로드 및 블리 팅?

class Laser(pygame.sprite.Sprite): 
    image = None 

    def __init__(self, start_x, start_y): 
     pygame.sprite.Sprite.__init__(self) 

     self.pos_x = start_x 
     self.pos_y = start_y 

     if Laser.image is None: 
      Laser.image = pygame.image.load('img/laser_single.png') 
     self.image = Laser.image 
     self.rect = self.image.get_rect() 
     self.rect.topleft = [self.pos_x, self.pos_y] 

을). 그러나 나는 이것이 예상대로 일할 것인가?

두 번째 문제는 활성 스프라이트를 모두 파이 게임 표면에 블리 팅 할 때 발생합니다. 현재 나는 Laser(), Enemy(), andnot 객체 목록을 반복하고 pygame.display.update()를 호출하기 전에 각각 하나씩 blit합니다. 개별적으로 각 객체를 blit해야하는 것은 불필요한 것 같습니다. 그래서 이것이 pygame이 구현하는 가장 효율적인 메소드인지 여부를 묻습니다. 또는 모든 개체를 한 번에 blit하고 성능을 향상시키는 방법이 있습니까?

+0

를 사용하여 그룹 사이의 간단한 충돌 감지를 할 수있게된다. 그러나 여러 프레임 동안 동일한 위치에 머무르는 스프라이트가 많은 경우에는 모든 프레임에서 스프라이트를 블리치하는 것을 피하기 위해 'BigYellowCactus'를 살펴 보는 것이 유용 할 것입니다. – pmoleri

답변

2
  • 저는 이것이 새로운 Laser()를 만들 때마다 파이썬이 이미지의 새로운 인스턴스를 메모리에로드하는 것을 막기를 바랍니다. 그러나 나는 이것이 예상대로 일할 것인가?

예. 모든 인스턴스는 클래스 변수에 대한 참조 만 가지므로 메모리를 절약 할뿐만 아니라 이미지가 한 번만로드되기 때문에 성능이 향상됩니다.

  • 두 번째 문제는 모든 활성 스프라이트를 파이 게임 표면으로 블리 싱한다는 것을 의미합니다.

이것은 다릅니다. 당신의 프레임 속도가 괜찮다면, 그걸로 붙잡아 라. 프레임 속도가 떨어지기 시작하면 DirtySprite을보고 아마도 article 일 것입니다.

또 다른 파이썬 클래스는 LayeredDirty 스프라이트 그룹으로, 더러운 스프라이트를 자동으로 처리하고 전체 화면 대신 관련 화면 부분 만 업데이트합니다.

  • 은, 예를 들어, 각 객체에게 스프라이트 그룹과 개별적으로

블럭 전송해야하는 중복 보인다 LayeredDirty 또는 간단한 Group을 사용하는 경우 스프라이트 그룹에 스프라이트를 한 번 추가하고 스프라이트 그룹의 draw 메소드를 호출하면됩니다.

sprites = pygame.sprite.LayeredDirty((sprite1, sprite2, sprite3)) 
sprites.add(sprite4) 
... 
sprites.draw(pygame_screen) 

사용하여 스프라이트 그룹은 I 성능에 큰 영향이 목록을 통해 한 루핑 생각하지 않는다 pygame.sprite.groupcollidepygame.sprite.spritecollideany

관련 문제