ทำให้อัตราเฟรมของ pygame เร็วขึ้น


10

จากการทำโปรไฟล์เกมของฉันฉันเห็นว่าเวลาส่วนใหญ่ในการดำเนินการของเกมงานอดิเรกของฉันคือระหว่างการ blit และการพลิก ขณะนี้มันทำงานที่ประมาณ 13fps เท่านั้น การ์ดแสดงผลของฉันค่อนข้างดีดังนั้นฉันเดาว่า pygame ไม่ได้ใช้งาน

ไม่มีใครรู้เกี่ยวกับตัวเลือกกราฟิก / การแสดงผลที่ฉันต้องตั้งค่าใน pygame เพื่อให้เร็วขึ้น? หรือนี่เป็นสิ่งที่ฉันต้องอยู่ด้วยตั้งแต่ฉันเลือก pygame?

คำตอบ:


12

หากคุณกำลังทำงานในโหมดเต็มหน้าจอคุณสามารถใช้การpygame.HWSURFACEตั้งค่าสถานะเมื่อคุณเริ่มต้นการแสดงผลเพื่อบอก pygame ให้ลองใช้พื้นผิวฮาร์ดแวร์ ฉันเชื่อว่าหากไม่สามารถใช้พื้นผิวฮาร์ดแวร์ pygame จะใช้พื้นผิวซอฟต์แวร์แบบเงียบ ๆ

หากคุณไม่ได้ใช้พื้นผิวของฮาร์ดแวร์ให้พิจารณาใช้มากกว่าpygame.display.update(rectangle) pygame.display.flip()การดำเนินการนี้จะอัปเดตสี่เหลี่ยมผืนผ้าที่กำหนดแทนการแสดงผลทั้งหมดซึ่งสามารถเพิ่มประสิทธิภาพของคุณได้เล็กน้อยเว้นแต่ว่าเกมของคุณจะต้องอัปเดตการแสดงผลทั้งหมด

หากคุณกำลังใช้ฮาร์ดแวร์หรือพื้นผิว OpenGL นอกจากนี้ยังมีสิ่งpygame.DOUBLEBUFที่ใช้ฮาร์ดแวร์บัฟเฟอร์สองครั้งซึ่งหมายความว่าฟังก์ชั่นการวาดภาพของคุณจะวาดหนึ่งในสองบัฟเฟอร์และflip()จะแลกเปลี่ยนซึ่งบัฟเฟอร์ที่มองเห็นได้


5

หนึ่งคอขวดใน pygame จริง ๆ แล้วการแสดงผลตัวอักษร คุณไม่ควรแสดงข้อความเดียวกัน (ที่มีแบบอักษร / สีเดียวกัน) มากกว่าหนึ่งครั้ง แต่ให้ทำการแคชพื้นผิวที่แสดงครั้งเดียวและนำกลับมาใช้ใหม่ ใช้สิ่งนี้เป็นบัญชีถ้าคุณใช้ Font.render () มาก


4

นอกจากคำตอบของ talljosh แล้วฉันอยากจะแนะนำเพิ่มเติมอีกเล็กน้อย:

หลีกเลี่ยงการหมุนและการปรับในตำแหน่งที่คุณสามารถทำได้ การดำเนินการเช่นนี้ทำบน CPU อย่างหมดจดและมีแนวโน้มที่จะช้ามาก

หากคุณกำลังอ่าน / แก้ไขพิกเซลโดยตรงให้ใช้Surface.get_buffer()วิธีการนี้และทำงานกับสิ่งนั้นแทนที่จะใช้Surface.set_at()/get_at()วิธีการ


2

คอมเม้นต์เอาต์พุตของคอนโซลทดสอบใด ๆ ที่คุณมี สิ่งนี้สามารถลดอัตราการลดลงอย่างมากโดยเฉพาะถ้าคุณแสดงผลระหว่างการหมุนและการปรับสเกลตามที่ Cody กล่าวไว้ข้างต้น


2

มันถูกต้องที่ Pygame ไม่ได้ใช้ความสามารถในการเร่งความเร็ว 3 มิติของการ์ดแสดงผลของคุณ นี่เป็นเพราะมันขึ้นอยู่กับ SDL ซึ่งมีข้อ จำกัด เดียวกัน อีกทางเลือกหนึ่งคือการเขียนเกมของคุณในระบบเช่นpygletซึ่งไม่สนับสนุนกำเนิด OpenGL เร่งสไปรท์เพื่อหาห้องสมุดที่คล้ายกันสำหรับกราฟิกเท่านั้นหรือจะเขียนรหัส OpenGL ตัวเองสำหรับการนี้


เม็ดเล็กมาก
The Duck Communist

1

สิ่งหนึ่งที่ง่ายอย่างเหลือเชื่อที่จะทำคือการใช้psyco ฉันไม่รู้ว่ามันจะช่วยได้มากแค่ไหน

 import psyco
 psyco.full()

ในการเริ่มต้นทำงานคุณอาจลองทำเช่นกัน


Psyco ไม่ได้ช่วยอะไรมากนักกับรหัส Python ที่ทันสมัย ใช้ PyPy หากคุณต้องการ JIT (ไม่แน่ใจว่า PyGame ทำงานอยู่ที่นั่นหรือไม่)
coderanger

Pygame ไม่ทำงานภายใต้ PyPy แต่ Pyglet ก็ทำเช่นนั้น
coderanger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.