Làm cho tốc độ khung hình của pygame nhanh hơn


10

Bằng cách định hình trò chơi của tôi, tôi thấy rằng phần lớn thời gian thực hiện trò chơi sở thích của tôi là giữa các cuộc gọi trực tiếp và lật. Hiện tại, nó chỉ chạy ở mức khoảng 13fps. Thẻ video của tôi khá tốt, vì vậy tôi đoán là pygame không sử dụng nó.

Có ai biết bất kỳ tùy chọn đồ họa / hiển thị nào tôi cần đặt trong pygame để làm cho nó nhanh hơn không? Hay đây chỉ là thứ mà tôi phải sống cùng vì tôi đã chọn pygame?

Câu trả lời:


12

Nếu bạn đang chạy ở chế độ toàn màn hình, bạn có thể sử dụng pygame.HWSURFACEcờ khi bạn khởi tạo màn hình để báo cho pygame thử sử dụng bề mặt phần cứng. Tôi tin rằng nếu không thể sử dụng bề mặt phần cứng, pygame sẽ âm thầm sử dụng bề mặt phần mềm.

Nếu bạn không sử dụng bề mặt phần cứng, hãy cân nhắc sử dụng pygame.display.update(rectangle)hơn là pygame.display.flip(). Điều này sẽ chỉ cập nhật hình chữ nhật đã cho chứ không phải toàn bộ màn hình, có thể tăng hiệu suất của bạn khá nhiều trừ khi trò chơi của bạn thực sự cần cập nhật toàn bộ màn hình.

Nếu bạn đang sử dụng bề mặt phần cứng hoặc OpenGL, cũng pygame.DOUBLEBUFcó sử dụng bộ đệm đôi phần cứng, nghĩa là các chức năng vẽ của bạn sẽ vẽ vào một trong hai bộ đệm và flip()sẽ trao đổi bộ đệm nào có thể nhìn thấy.


5

Một nút cổ chai trong pygame thực sự là kết xuất phông chữ. Bạn không nên kết xuất cùng một văn bản (có cùng phông chữ / màu) nhiều lần mà nên lưu lại các bề mặt một khi được kết xuất và sử dụng lại chúng. Đưa điều này vào tài khoản nếu bạn đang sử dụng rất nhiều Font.render ().


4

Ngoài câu trả lời của Talljosh, tôi muốn đưa ra thêm một vài gợi ý:

Tránh xoay và nhân rộng bất cứ nơi nào bạn có thể. Các hoạt động như vậy được thực hiện hoàn toàn trên CPU và có xu hướng rất, rất chậm.

Nếu bạn đang thực hiện đọc / sửa đổi pixel trực tiếp, hãy sử dụng Surface.get_buffer()phương pháp và làm việc với điều đó, thay vì sử dụng các Surface.set_at()/get_at()phương thức.


2

Nhận xét bất kỳ đầu ra giao diện điều khiển thử nghiệm bạn có. Điều này có thể làm giảm đáng kể tốc độ khung hình, đặc biệt nếu bạn xuất ra giữa xoay và chia tỷ lệ, như Cody đã nói ở trên.


2

Đúng là Pygame không sử dụng khả năng tăng tốc 3D của thẻ video của bạn. Điều này là do nó dựa trên SDL có cùng giới hạn. Một thay thế là để viết lại trò chơi của bạn trong một hệ thống như pygletkhông natively hỗ trợ OpenGL tăng tốc sprites, để tìm một thư viện tương tự cho chỉ đồ họa, hoặc viết mã OpenGL mình cho việc này.


Pyglet là tuyệt vời.
Vịt Cộng sản

1

Một điều cực kỳ đơn giản để làm là sử dụng psyco . Tôi không biết nó sẽ giúp được bao nhiêu, nhưng vì tất cả những gì nó cần là

 import psyco
 psyco.full()

để bắt đầu chạy, bạn cũng có thể thử.


Psyco thực sự sẽ không giúp được nhiều với mã Python thành ngữ hiện đại. Sử dụng PyPy nếu bạn muốn có JIT (không chắc là PyGame có hoạt động ở đó không).
coderanger

Pygame không hoạt động dưới PyPy, nhưng Pyglet làm như vậy bạn sẽ đi.
coderanger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.