首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在Python上的这个小的(155行)吃豆人游戏运行得这么慢?

为什么在Python上的这个小的(155行)吃豆人游戏运行得这么慢?
EN

Stack Overflow用户
提问于 2012-04-30 05:57:09
回答 2查看 7.4K关注 0票数 0

我已经尽可能地从主循环中删除了所有内容。我还优化了动态和静态对象的碰撞,大大减少了迭代次数。但在他的机器上,它仍然很慢。我将发布整个文件,以防有人想测试它,但您可以跳转到"while Exit==false:“处的主循环。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import pygame
from pyeuclid import Vector2
from math import sin,cos,pi
from random import random

class Thing:
    def __init__(self,pos):
        self.pos = pos
        things.append(self)
    def update(self): pass
    def draw(self,img): pass
    def collide(self,who): pass

class DynamicThing(Thing):
    def __init__(self,pos):
        Thing.__init__(self,pos)
        self.vel = Vector2(0,0)
        self.lastPos = pos
        self.col = (255,255,0)
        self.r = 12
        dynamic_things.append(self)
    def update(self):
        self.lastPos = self.pos
        self.pos = self.pos + self.vel
    def draw(self,img):
        pygame.draw.circle(img, (0,0,0), [int(n) for n in self.pos], self.r, self.r)
        pygame.draw.circle(img, self.col, [int(n) for n in self.pos], self.r-2, self.r-2)
    def collide(self,obj):
        Thing.collide(self,obj)
        if isinstance(obj,Wall): 
            self.pos = self.lastPos

class Wall(Thing):
    def draw(self,img):
        x,y = self.pos.x, self.pos.y
        pygame.draw.rect(img, (90,90,200), (x-16,y-16,32,32), 0)

class Pacman(DynamicThing):
    def __init__(self):
        DynamicThing.__init__(self,Vector2(32*9+16,32*12+16))
        self.col = (255,255,0)
    def update(self):
        DynamicThing.update(self)
        if (keyPressed[pygame.K_LEFT]): self.vel.x = -1
        if (keyPressed[pygame.K_RIGHT]): self.vel.x = 1
        if (keyPressed[pygame.K_DOWN]): self.vel.y = 1
        if (keyPressed[pygame.K_UP]): self.vel.y = -1
        if (self.vel.x==-1 and not keyPressed[pygame.K_LEFT]): self.vel.x = 0
        if (self.vel.x==1 and not keyPressed[pygame.K_RIGHT]): self.vel.x = 0
        if (self.vel.y==1 and not keyPressed[pygame.K_DOWN]): self.vel.y = 0
        if (self.vel.y==-1 and not keyPressed[pygame.K_UP]): self.vel.y = 0
    def collide(self,obj):
        DynamicThing.collide(self,obj)
        if isinstance(obj,Ghost):
            self.pos = Vector2(32*9+16,32*12+16)

class Ghost(DynamicThing):
    def __init__(self):
        DynamicThing.__init__(self,Vector2(32*9+16,32*10+16))
        self.col = (int(random()*255),int(random()*255),int(random()*255))
        self.vel = Vector2(0,-2)
    def update(self):
        DynamicThing.update(self)
        if random()<0.01:
            self.vel = [Vector2(2,0),Vector2(-2,0),Vector2(0,2),Vector2(0,-2)][int(random()*4)]
    def collide(self,obj):
        DynamicThing.collide(self,obj)
        if isinstance(obj,Wall):
            self.vel = [Vector2(2,0),Vector2(-2,0),Vector2(0,2),Vector2(0,-2)][int(random()*4)]

def thingAtPos(pos):
    tile_pos = Vector2(int(pos.x/32),int(pos.y/32))
    return map[tile_pos.y][tile_pos.x]

# initializate stuff
pygame.init()
clock = pygame.time.Clock()
screen = pygame.display.set_mode([32*19,32*22])
points_in_unit_circle_border = [Vector2(cos(float(a)/8*2*pi),sin(float(a)/8*2*pi)) for a in xrange(8)]
things = []
dynamic_things = []
exit = False

map =  [[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],
        [1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1],
        [1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1],
        [1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1],
        [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
        [1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,0,1],
        [1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1],
        [1,1,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1],
        [1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1],
        [1,1,1,1,0,1,0,1,1,0,1,1,0,1,0,1,1,1,1],
        [1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1],
        [1,1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,1],
        [1,1,1,1,0,1,0,0,0,0,0,0,0,1,0,1,1,1,1],
        [1,1,1,1,0,1,0,1,1,1,1,1,0,1,0,1,1,1,1],
        [1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1],
        [1,0,1,1,0,1,1,1,0,1,0,1,1,1,0,1,1,0,1],
        [1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1],
        [1,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1],
        [1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1],
        [1,0,1,1,1,1,1,1,0,1,0,1,1,1,1,1,0,0,1],
        [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],
        [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]


#create pacman, walls, ghosts
pacman = Pacman()
for y in xrange(len(map)):
    for x in xrange(len(map[y])):
        if (map[y][x]==1):
            map[y][x] = Wall(Vector2(x*32+16,y*32+16))
for i in xrange(4):
    Ghost()

while exit==False:
    clock.tick(45)

    screen.fill([255,255,255])
    keyPressed = pygame.key.get_pressed()

    # events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit = True
        if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE:
            exit = True

    # more ghosts
    if random()<0.001: Ghost()

    # updates e draws
    for thing in things:
        thing.update()
        thing.draw(screen)

    # collisions
    for A in dynamic_things:
        #dynamic vs dynamic
        for B in dynamic_things:
            if A!=B and abs(A.pos-B.pos)<(A.r+B.r):
                A.collide(B)
                B.collide(A)
        #dynamic vs walls
        for circle_point in points_in_unit_circle_border:
            thing_in_a_border = thingAtPos(A.pos+circle_point*12)
            if isinstance(thing_in_a_border,Wall):
                A.collide(thing_in_a_border)

    pygame.display.flip()

pygame.quit ()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-04 16:14:16

在每个循环中,您都在重新绘制和翻转整个屏幕。我没有测试你的程序,但在吃豆人上我知道,屏幕上只有5个移动的精灵,你应该试着每一帧只对这些精灵进行blit (当然,如果其他事情发生了变化,也是这样)。不要使用display.flip(),只需更新您更改过的屏幕区域(这通常会大大提高速度)。

当然,你需要停止每一帧屏幕的空白,并且会有很多关于更新内容的管理。在pygame http://www.pygame.org/docs/ref/sprite.html#pygame.sprite.DirtySprite中有一些额外的对脏精灵的支持,可以帮助你做到这一点。或者你可以更新所有的“活动”精灵,将它们所在的位置清空,然后在新的位置重新绘制它们(很明显,这两个区域中的所有内容也是如此)。将受影响的矩形收集到列表中,并将其传递给update_rects(),而不是翻转屏幕。没有必要在吃豆人游戏的每一帧中都画墙……

票数 2
EN

Stack Overflow用户

发布于 2012-04-30 18:50:51

可能不是很慢的原因,但是"while exit==False:“比"while not exit:”需要更多的字节码来执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10379102

复制
相关文章
干货:实时渲染和离线渲染的区别?实时云渲染又是什么?
常见的渲染类型有以下几种:实时渲染、离线渲染、实时云渲染、混合渲染。那么什么是实时渲染?实时渲染和离线渲染有哪些区别?各自有哪些典型应用场景......
点量云木子
2023/02/10
2.3K0
干货:实时渲染和离线渲染的区别?实时云渲染又是什么?
MySQL 中视图和表的区别以及联系是什么?[通俗易懂]
(1)视图是已经编译好的 SQL 语句,是基于 SQL 语句的结果集的可视化的表,而表不是。
全栈程序员站长
2022/07/11
1.9K0
Rails布局和视图渲染
基于“多约定,少配置”原则,在 index 动作末尾并没有指定要渲染的视图,Rails会自动在控制器的视图文件夹中寻找 action_name.html.erb 模板,然后渲染。这里渲染的就是 app/views/books/index.html.erb
用户1515472
2019/07/24
3.4K0
ThinkPHP-视图的使用和渲染(一)
ThinkPHP是一款基于PHP开发的高性能、简洁优雅的Web应用框架,它提供了丰富的功能和灵活的架构,可以帮助我们快速搭建各种类型的Web应用程序。其中,视图(View)是框架中非常重要的一部分,它负责渲染模板和输出内容,让我们可以方便地将数据和界面进行分离。
堕落飞鸟
2023/05/02
8630
ThinkPHP-视图的使用和渲染(二)
在ThinkPHP中,我们可以使用layout方法来设置布局文件。layout方法需要传入布局文件的路径,例如:
堕落飞鸟
2023/05/02
6030
ThinkPHP-视图的使用和渲染(三)
下面是一个简单的示例,演示了如何使用视图类来加载模板文件、传递变量数据、设置布局文件和输出页面内容。
堕落飞鸟
2023/05/02
3780
实时渲染和预渲染有什么区别
詹姆斯·卡梅隆导演的《阿凡达》耗时四年,耗资近5亿美元,为大家打开了一个科幻新世界。电影中的CGI角色,名字,看起来和现实世界中的人一模一样。而且逼真的科幻场景让人震撼。然而,这些精彩的画面离不开CG艺术家和预渲染技术。
3DCAT实时渲染云
2022/06/29
1.5K0
jpg和jpeg的区别是什么_jpeg和jpg的区别是什么
JPG文件的优点是体积小巧,并且兼容性好,因为大部分的程序都能读取这种文件,这是因为JPG格式不仅是一个工业标准格式,而且更是web的标准文件格式。JPG文件如此拥有如此便利的条件,难怪得到了业余玩家的推崇。不过另一方面,JPG之所以很小的原因是:当文件在创建的时候会有一些数据被遗失,即通过“有损”的压缩方式来建立文件,这就是其文件小的原因所在了。 如果数码相机采用了JPG作为照片存储的格式虽然可以节省宝贵空间,但不利的一面也必须看清:凡是可以在相机中调整的诸如色温、色彩平衡、图像锐度等经过相机的处理后都记录在文件内,后期调整只能通过photoshop处理来进行,但是经过调整的图像质量将会有所损失。 JPEG在远程传送上有很好的优势,为了不影响肉眼的观看请不要将压缩比小于8,如果是局域网传送,请你用JPEG的无损压缩(12)或者说直接用TIFF。 JPEG与TIFF转印在最好的铜版纸上,在JPEG压缩指数是12的前提下,二者的区别几乎没有,外行与内行(不用放大镜看印刷点阵)都看不出分别,因为真彩(24位以上)转换成印刷格式的四色模式时,颜色信息的损失比从TIFF到JPEG的过程损失得多得多,所以内、外行单看印刷品几乎不能判断图片有没有经过JPEG格式的转换! 就打印而言,用当今最好的色彩管理软件(德国的BEST COLOE)加上最好的打印机技术(墨滴为4微微升),输出的图面质量也没有印刷品好!特别的暗部的过度!但他可以做到比印刷品质丽!但很硬!JPEG在远程传送上有很好的优势,为了不影响肉眼的观看请不要将压缩比小于8,如果是局域网传送,请你用JPEG的无损压缩(12)或者说直接用TIFF。JPEG与TIFF转印在最好的铜版纸上,在JPEG压缩指数是12的前提下,二者的区别几乎没有,外行与内行(不用放大镜看印刷点阵)都看不出分别,因为真彩(24位以上)转换成印刷格式的四色模式时,颜色信息的损失比从TIFF到JPEG的过程损失得多得多,所以内、外行单看印刷品几乎不能判断图片有没有经过JPEG格式的转换! 就打印而言,用当今最好的色彩管理软件(德国的BEST COLOE)加上最好的打印机技术(墨滴为4微微升),输出的图面质量也没有印刷品好!特别的暗部的过度!但他可以做到比印刷品质丽!但很硬!一般打印机只是有一个很很普通的色彩管理程序!对颜色的解释根本达不到专业要求!因为BEST COLOE软件现在在中国要二万四左右(各位,放弃买盗版的想法,它是硬件加密:))你就别指望你家中几千块的打印机为你安装此软件,当你觉得你打出的东西又艳丽又好看时,不好意思,那是颜色失真了:(,如果你觉得你家的打印机打出的东西就是很优秀时,对不起,那你在图片色彩学方面需要进修了:)相信大家对JPEG这种图像格式都非常熟悉,在我们日常所接触的图像中,绝大多数都是JPEG格式的。JPEG的全称为Joint Photographic Experts Group,它是一个在国际标准组织(ISO)下从事静态图像压缩标准制定的委员会,它制定出了第一套国际静态图像压缩标准:ISO 10918-1,俗称JPEG。由于相对于BMP等格式而言,品质相差无己的JPEG格式能让图像文件“苗条”很多,无论是传送还是保存都非常方便,因此JPEG格式在推出后大受欢迎。随着网络的发展,JPEG的应用更加广泛,目前网站上80%的图像都采用JPEG格式。 但是,随着多媒体应用领域的快速增长,传统JPEG压缩技术已无法满足人们对数字化多媒体图像资料的要求:网上JPEG图像只能一行一行地下载,直到全部下载完毕,才可以看到整个图像,如果只对图像的局部感兴趣也只能将整个图片载下来再处理;JPEG格式的图像文件体积仍然嫌大;JPEG格式属于有损压缩,当被压缩的图像上有大片近似颜色时,会出现马赛克现象;同样由于有损压缩的原因,许多对图像质量要求较高的应用JPEG无法胜任…… 针对这些问题,从1998年开始,专家们开始为下一代JPEG格式出谋划策,希望新标准能具有更高压缩率以及更多新功能,而且更有利于用户对图像进行数字化处理。但这几年间,由于在算法选取问题上耽误了不少时间,直到今年3月的东京会议,彩色静态图像的新一代编码方式“JPEG2000”的编码算法才确定,其最终标准将于今年12月出台。JPEG2000的编码算法一经确定,许多著名的图形图像公司如Corel、Pegasus(美国神马成像公司)等就迫不及待地在新开发的图像工具软件中集成JPEG2000图像压缩技术;而Microsoft、Netscape等在浏览器领域竞争的公司也开始将JPEG2000的新技术集成到其下一个版本的浏览器中——因为相对于JPEG来说,JPEG2000可以说具有革命性的改变!
全栈程序员站长
2022/09/19
2.9K1
mysql和mongodb的区别是什么_mongodb和mysql的区别是什么?区别详细介绍
大家好,又见面了,我是你们的朋友全栈君。 对于mongodb和mysql你应该都很清楚了吧,那么他们两个之间的区别你知道吗?很多人对于mongodb和mysql的区别都不是很清楚,下面一起来了解一下吧
全栈程序员站长
2022/09/10
2.2K0
== 和 equals 的区别是什么?
对于上述第三点理解起来可能有点复杂,因为这里 equals 方法比较需要分两种情况来讨论,一种情况是该方法没有被重写,另外一种是该方法被重写。
Breeze.
2022/04/24
1.5K0
== 和 equals 的区别是什么?
== 和 equals 的区别是什么?
2) 用户自定义类如果没有覆盖equals(),将调用父类的equals (比如是Object),而Object的equals的比较是地址(return (this == obj);)
用户5746037
2022/05/18
4900
== 和 equals 的区别是什么?
在编写代码的时候我们经常会使用 equals 和 == 来判断两个对象是否相等,那么两者有什么区别呢,主要有以下几点区别:
Breeze.
2022/06/05
5.2K0
== 和 equals 的区别是什么?
iOS 视图,动画渲染机制探究
终端的开发,首当其冲的就是视图、动画的渲染,切换等等。用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅。UI就是 App 的门面,它的体验伴随着用户使用 App 的整个过程。如果UI失败,用户是不会有打开第二次的欲望的。 iOS 为开发者提供了丰富的 Framework(UIKit,Core Animation,Core Graphic,OpenGL 等等)来满足开发从上层到底层各种各样的需求。不得不说苹果很牛逼,很多接口你根本不需要理解背后的原理就能上手使用并且满足你大部
QQ音乐技术团队
2018/02/01
1.9K0
iOS 视图,动画渲染机制探究
iOS 视图,动画渲染机制探究
终端的开发,首当其冲的就是视图、动画的渲染,切换等等。用户使用 App 时最直接的体验就是这个界面好不好看,动画炫不炫,滑动流不流畅。UI就是 App 的门面,它的体验伴随着用户使用 App 的整个过程。如果UI失败,用户是不会有打开第二次的欲望的。 iOS 为开发者提供了丰富的 Framework(UIKit,Core Animation,Core Graphic,OpenGL 等等)来满足开发从上层到底层各种各样的需求。不得不说苹果很牛逼,很多接口你根本不需要理解背后的原理就能上手使用并且满足你大部
腾讯Bugly
2018/03/23
1.6K0
iOS 视图,动画渲染机制探究
Vue内部是如何渲染视图
vnode其实就是一个描述节点的对象,描述如何创建真实的DOM节点;vnode的作用就是新旧vnode进行对比,只更新发生变化的节点。
用户9700400
2022/11/21
9530
Vue内部是如何渲染视图
通过 PHP 原生代码实现视图模板引擎的解析和渲染
上篇教程学院君给大家简单介绍了什么是 MVC 设计模式,并演示了如何基于原生 PHP 代码编写简单的 HTTP 控制器,控制器对应 MVC 模式中的 C(Controller),今天,我们一起来看下 MVC 模式中另一个模块 —— 视图(View,对应 MVC 模式中的 V),并且基于原生 PHP 代码实现简单的视图模板引擎。
学院君
2020/08/18
2.1K0
Ethernet 和 Internet 的区别是什么?
Internet 将世界各地的计算设备连接起来,其中“连接”需要两部分:物理连接(即硬件连接)和软件连接。
张拭心 shixinzhang
2022/05/10
2.7K0
MongoDB和Redis的区别是什么
MongoDB 更类似 MySQL,支持字段索引、游标操作,其优势在于查询功能比较强大,擅长查询 JSON 数据,能存储海量数据,但是不支持事务。
全栈程序员站长
2022/07/19
1.1K0
MongoDB和Redis的区别是什么
SDK 和 API 的区别是什么
来源:https://www.zhihu.com/question/21691705/answer/770586138 不知道区别的人,大概率是你还没搞懂 API、SDK 是什么。 讲个小故事: 研发人员A开发了软件A,研发人员B正在研发软件B。 有一天,研发人员B想要调用软件A的部分功能来用,但是他又不想从头看一遍软件A的源码和功能实现过程,怎么办呢? 研发人员A想了一个好主意:我把软件A里你需要的功能打包好,写成一个函数。你按照我说的流程,把这个函数放在软件B里,就能直接用我的功能了! 其中,API就是
程序猿DD
2022/03/04
1.1K0
线程和进程的区别是什么
做个简单的比喻:进程=火车,线程=车厢 线程在进程下行进(单纯的车厢无法运行) 一个进程可以包含多个线程(一辆火车可以有多个车厢) 不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘) 同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易) 进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源) 进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢) 进程可以拓展到多机,进程最多
Qwe7
2022/03/07
4850

相似问题

Spring中重定向渲染和视图渲染的区别

38

局部视图和渲染局部视图有什么区别?

20

{{视图}和{{#视图}之间的区别是什么?

11

渲染和再渲染反应的区别?

23

软件渲染与gpu渲染的区别是什么

133
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文