我一直在使用Pygame在Python上使用基于tile的平台游戏。在使瓷砖地图更大之后,我经历了一次大的性能放缓。我使用分析器查找减速原因,并指出我用来检查屏幕上哪些图块的列表理解。
[i for i in sprites
if (i.rect.x-pos.x)+(WIDTH/2)+i.w>0
and (i.rect.x-pos.x)+(WIDTH/2) < WIDTH
and (i.rect.y-pos.y)+(HEIGHT/2)+i.h>0
and (i.rect.y-pos.y)+(HEIGHT/2) < HEIGHT]
有没有办法优化这个?任何有助于它更快完成任务的东西都会有所帮助。
答案 0 :(得分:4)
使屏幕大小为矩形并使用内置碰撞检测:
[i for i in sprites if i.rect.colliderect(screen_rect)]
事实证明actual function for this没有列表理解,可能会更快:
spritecollide(screen, sprites, True, collided = None)
答案 1 :(得分:1)
将条件重写为-i.w < (i.rect.x-pos.x)+(WIDTH/2) < WIDTH and -i.h < (i.rect.y-pos.y)+(HEIGHT/2) < HEIGHT
。它至少会提高可读性,并可能提高性能。
如果可能,请使用生成器表达式而不是list comperension。它肯定会减少内存使用量。
实际上,您的情况可能会以矢量形式重写(dim = 2),而SIMD在这里可能会有用。探索这个机会。