2012-05-09 4 views
1

최근 pyglet에서 시작하는 startet과 pygame에서 rabbyt로 시작했지만 벽돌 벽에 뭔가 충돌했습니다.Pyglet이 너무 많은 CPU를 사용합니다.

하나의 스프라이트 (pyglet.sprite.Sprite에있는 유형의)가 초당 60 프레임으로 표시되는 기본 예제를 만들었습니다. 문제는이 간단한 프로그램이 어떻게 든 CPU 시간의 50 %를 사용하고 있다는 것입니다. 같은 결과로 rabbyt 라이브러리에있는 스프라이트 유형으로 실험을 반복했습니다.

초당 60 프레임에서 1000 스프라이트를 렌더링하기로 결정했으며, CPU 사용률이 50 %로 유지되는 것을 보았습니다. 유일한 것은 스프라이트를 움직이거나 애니메이트하면 약간의 말더듬이 생기는 것입니다.

마지막으로, 초당 360 프레임을 실행 해 보았습니다. 동일한 결과, 50 % 사용. 내가 ATI의 HD 3500 카드로 코어 2 듀오를 사용하고

import pyglet 
import rabbyt 


def on_draw(dt): 
    window.clear() 
    spr.render() 

global window 
window = pyglet.window.Window(800, 600) 
spr = rabbyt.Sprite('ship.png') 
spr.x = 100 
spr.y = 100 
pyglet.clock.schedule_interval(on_draw, 1.0/60.0) 


if __name__ == '__main__': 
    pyglet.app.run() 

: 여기

는 샘플 코드입니다.

모든 조언/의견을 보내 주시면 감사하겠습니다.

+0

... 대신 손상 블리 팅을 시도 했습니까? –

+0

아니요, 저는 실제로 피해를 입히는 것을 알지 못합니다. 그것에 관한 문서를 가르쳐 주시겠습니까? – Kiril

+0

실제로는 아니지만 매우 어렵지는 않습니다. 스프라이트의 이전 위치 위에 배경을 칠한 다음 스프라이트를 새로운 위치에 칠하십시오. –

답변

0

저는 파이 게임에는 "시계"라는 내장이 있다는 것을 알고 있습니다. 진드기 방법을 사용하여 초당 게임 루프 수에 대한 제한을 설정할 수 있습니다. 필자의 예에서는 30FPS를 사용했습니다. 이렇게하면 CPU가 끊임없이 요구되는 것을 방지 할 수 있습니다. 도움이

pyglet.clock.schedule_interval(on_draw, 1.0/60.0) 
    clock.set_fps_limit(60) 

희망 : pyglet에서

clock = pygame.time.Clock() 

While 1: 

    clock.tick(30) # Puts a limit of 30 frames per second on the loop 

는 비슷한있을 나타납니다!

편집 : FPS 제한에 대한 문서 : http://pyglet.org/doc/api/pyglet.clock-module.html#set_fps_limit

+0

clock.set_fps_limit() 메소드를 사용해 보셨습니까? 성능 향상에 도움이 될 수 있습니다. – scobuntu

+0

나는 이미 clock.schedule_interval을 사용하여 그리기 간격을 예약하고 있습니다. clock.set_fps_limit (60)은 아무것도 변경하지 않았습니다 (100 및 30과 같이 다양한 프레임 값을 시도했습니다). 성능은 동일하게 유지됩니다. – Kiril

2

기본 pyglet 이벤트 핸들러가 'on_draw'이벤트를이 이벤트 큐를 클리어 할 때마다 발생된다는 점에 유의해야합니다.

http://www.pyglet.org/doc/programming_guide/the_application_event_loop.html

(마우스 및 키보드 입력을위한 현재) pyglet 응용 프로그램 이벤트 루프 파견 창 이벤트가 발생하고 루프를 통해 모든 반복 한 후 각 창에 on_draw 이벤트를 전달로

.

이 어떤 이벤트를 재 묘화을 트리거 할 수 있다는 것을 의미한다.

마우스를 움직이거나 이벤트를 발생시키는 작업을 수행하는 경우 렌더 호출이 시작될 때 속도가 매우 느려집니다.

이것은 내 자신의 렌더링 호출을했기 때문에 문제가 발생했기 때문에 두 개의 버퍼가 화면에 '고스트 (Ghost)'효과를 만들어 냈습니다. 이것이 원인 이었다는 것을 깨닫기 위해 잠시 나갔다.

원숭이가이 작업을 수행하지 않기 위해 이벤트 루프를 패치했습니다. https://github.com/adamlwgriffiths/PyGLy/blob/master/pygly/monkey_patch.py

은 수동으로 버퍼를 플립 또는 'on_draw'이벤트를 트리거해야하며,이 패치 이벤트 루프가 가 더 이상 그 자체 렌더링 없게됩니다.

60fps로 연결했지만 내부 렌더링 루프가 가능한 최대 속도로 똑딱 거릴 수도 있습니다.

필자는 컨트롤을 제거하는 코드를 싫어하므로 내 패치를 통해 렌더링 이벤트가 발생하는 시점을 결정할 수 있습니다.

1

흠 .. 당신은 도움이된다면, 게임이 실행되는 FPS를 알고 할 수 있습니다 :

cldis = pyglet.clock.ClockDisplay() 

이 그런 다음 on_draw 기능이 추가

cldis.draw() 

는 현재를 그립니다 fps는 반투명 색상의 화면 하단 모서리에 있습니다.

관련 문제