Python优化形状重叠检测

时间:2018-03-29 22:19:05

标签: python python-3.x optimization pygame list-comprehension

我一直在使用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]

有没有办法优化这个?任何有助于它更快完成任务的东西都会有所帮助。

2 个答案:

答案 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)

  1. 将条件重写为-i.w < (i.rect.x-pos.x)+(WIDTH/2) < WIDTH and -i.h < (i.rect.y-pos.y)+(HEIGHT/2) < HEIGHT。它至少会提高可读性,并可能提高性能。

  2. 如果可能,请使用生成器表达式而不是list comperension。它肯定会减少内存使用量。

  3. 实际上,您的情况可能会以矢量形式重写(dim = 2),而SIMD在这里可能会有用。探索这个机会。