Python Pygame应用程序在Mac上的运行速度比在PC上慢
我和一位朋友正在用Python(2.7)和Pygame模块制作一个游戏。到目前为止,我已经完成了游戏的大部分艺术,他也完成了大部分的编码工作,但最终我计划在大部分艺术完成后帮助他编写代码。我用的是Mac(OSX的最新版本),我的朋友用的是个人电脑 他一直在他的电脑上构建和运行游戏,到目前为止,它已经按照计划在他的电脑上运行(完美的60帧/秒)。然而,每当我从GitHub中提取代码(我肯定有我们代码的最新版本)并尝试运行游戏时,游戏的运行速度几乎是原来的一半 我们已经尝试将代码中的fps翻倍到120,然后在PC上运行的速度是原来的两倍,但当我在Mac上运行代码时,似乎我仍然被限制在30 fps左右 我们还没有在其他地方找到任何令人信服的答案来解决这个问题,但是我们都是Pygame和Python的新手,所以我们可能遗漏了一些非常明显的东西Python Pygame应用程序在Mac上的运行速度比在PC上慢,python,python-2.7,pygame,Python,Python 2.7,Pygame,我和一位朋友正在用Python(2.7)和Pygame模块制作一个游戏。到目前为止,我已经完成了游戏的大部分艺术,他也完成了大部分的编码工作,但最终我计划在大部分艺术完成后帮助他编写代码。我用的是Mac(OSX的最新版本),我的朋友用的是个人电脑 他一直在他的电脑上构建和运行游戏,到目前为止,它已经按照计划在他的电脑上运行(完美的60帧/秒)。然而,每当我从GitHub中提取代码(我肯定有我们代码的最新版本)并尝试运行游戏时,游戏的运行速度几乎是原来的一半 我们已经尝试将代码中的fps翻倍到12
import pygame as pg
import os
os.environ['SDL_VIDEO_CENTERED'] = '1'
class Wombat:
def __init__(self, screen_rect, image, starting_loc):
self.screen_rect = screen_rect
self.image = image
self.width = 192
self.height = 96
self.starting_loc = starting_loc
self.rect = self.image.get_rect(bottomleft=starting_loc)
self.speed = 5
self.grav = .5
self.jumping = False
self.y_vel = 0
def update(self):
self.rect.clamp_ip(self.screen_rect)
self.jump_update()
def render(self, screen):
screen.blit(self.image, self.rect)
def move(self, x, y):
self.rect.x += x * self.speed
self.rect.y += y * self.speed
def jump_update(self):
if self.jumping:
self.y_vel += self.grav
self.rect.y += self.y_vel
if self.is_touching_ground():
self.jumping = False
def is_touching_ground(self):
return self.rect.y >= self.screen_rect.height - self.height - 50
def jump(self):
if not self.jumping:
self.y_vel = -12
self.jumping = True
class Control:
def __init__(self):
self.screensize = (1000,500)
self.screen = pg.display.set_mode(self.screensize, pg.DOUBLEBUF)
self.screen_rect = self.screen.get_rect()
try:
self.bg = pg.image.load("res\\bg.png")
self.wb11 = pg.image.load("res\BlueWombat\BlueStay.png")
self.wb1 = pg.image.load("res\BlueWombat\BlueWalk.gif").convert_alpha()
self.wb2 = pg.image.load("res\GreenWombat\GreenStay.png")
self.wb21 = pg.image.load("res\GreenWombat\GreenWalk.gif")
except:
self.bg = pg.image.load("res/bg.png")
self.wb1 = pg.image.load("res/BlueWombat/BlueStay.png")
self.wb11 = pg.image.load("res/BlueWombat/BlueWalk.gif")
self.wb2 = pg.image.load("res/GreenWombat/GreenStay.png")
self.wb21 = pg.image.load("res/GreenWombat/GreenWalk.gif")
self.wb2 = pg.transform.flip(self.wb2, True, False)
self.clock = pg.time.Clock()
self.fps = 60
self.quit = False
self.keys = pg.key.get_pressed()
self.wombat_one = Wombat(self.screen_rect, self.wb1, (0,450))
self.wombat_two = Wombat(self.screen_rect, self.wb2, (1000-192,450))
def run(self):
while not self.quit:
now = pg.time.get_ticks()
self.held_keys(self.keys)
self.event_loop()
self.update()
self.render()
pg.display.update()
self.clock.tick(self.fps)
def event_loop(self):
for event in pg.event.get():
if event.type == pg.QUIT:
self.quit = True
elif event.type in (pg.KEYDOWN, pg.KEYUP):
self.keys = pg.key.get_pressed()
if event.type == pg.KEYDOWN:
if event.key == pg.K_w:
self.wombat_one.jump()
if event.key == pg.K_UP:
self.wombat_two.jump()
def held_keys(self, keys):
if keys[pg.K_a]:
self.wombat_one.move(-1, 0)
if keys[pg.K_d]:
self.wombat_one.move(1, 0)
if keys[pg.K_LEFT]:
self.wombat_two.move(-1, 0)
if keys[pg.K_RIGHT]:
self.wombat_two.move(1, 0)
def render(self):
self.screen.blit(self.bg, (0,0))
self.wombat_one.render(self.screen)
self.wombat_two.render(self.screen)
def update(self):
self.wombat_one.update()
self.wombat_two.update()
app = Control()
app.run()
我建议您阅读
pygame.time.Clock
的文档,尤其是:
请注意,此函数使用SDL_延迟函数,这在每个平台上都不准确,但不会占用太多cpu。如果您想要一个精确的计时器,请使用勾选忙循环,不要介意咀嚼cpu
问题可能是由于在运行函数中调用
self.clock.tick(self.fps)
时出现了SDL\u Delay()
问题。嘿,嗯,我也遇到了同样的问题,但现在我的pygame代码以60 fps的速度运行,这很好。我将Idle与Python3.6.3以及相应的pygame一起使用。下面是我如何修复它的:
PC和Mac之间的硬件是否完全相同?有一百万个因素可能会影响这一点。对于堆栈溢出来说,这真的不是一个好问题。硬件很难对编写这个琐碎的代码产生影响,是吗?在任何情况下,即使这样也无济于事,因为Mac驱动程序往往比PC驱动程序差得多(我在同一台笔记本电脑上运行Windows下的游戏时帧速率是PC驱动程序的两倍)。不过,代码中似乎有这一点,因为我可以以60 fps的速度运行大量合法游戏,如League和Minecraft,这是一个非常简单的问题program@MorganThrapp-但是你击中了它的头。涉及的因素太多了。可能是你们每个人在各自的计算机上花费了相同的金额,在这种情况下,PC可以轻松地运行得更快。我将在稍后研究这个问题。这似乎是问题所在。使用“tick_busy_loop”会消耗一吨cpu还是一点点?我们的游戏只是一个小2D格斗游戏,所以我不想让它吃掉大量的CPUI。我想说你最好不要使用这两种游戏,就个人而言,使用你自己的更紧密的控制回路。我们到底要怎么做?真是糟糕。你救了我的命兄弟:)到2019年仍然有用*:D应该被接受回答我在macOS Catalina上看不到这个选项你的救命老兄,这个答案值得更多的喜欢