【问题标题】:Python optimizing shape overlap detectionPython优化形状重叠检测
【发布时间】:2018-04-02 09:43:08
【问题描述】:

我一直在使用 Pygame 在 Python 中开发基于图块的平台游戏。使图块的地图变大后,我的性能大幅下降。我使用分析器来查找速度减慢的原因,它指出了我用来检查屏幕上哪些图块的列表理解。

[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]

有什么办法可以优化吗?任何有助于它更快完成任务的东西都会有所帮助。

【问题讨论】:

  • 正如@Nathan 的回答所示,这是XY problem。您问的是加快理解速度,但您真正想要的是一种更有效的检测形状重叠的方法。

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


【解决方案1】:

将屏幕大小设为矩形并使用内置碰撞检测:

[i for i in sprites if i.rect.colliderect(screen_rect)]

事实证明,actual function for this 没有列表理解,可能更快:

spritecollide(screen, sprites, True, collided = None)

【讨论】:

  • 这样更快吗?
  • @Qwerty 根据我的经验,编写的函数总是比现有函数差。此外,实际上没有其他方法可以优化您的代码,因为这实际上是所有可用的代码。
  • 那么你有没有更快地测试和证明它,或者你只是假设
  • @Qwerty 好吧,你没有一个可行的例子,你希望我写一个完整的游戏只是为了检查一行代码吗?
  • 似乎 pygame 的作者很可能在碰撞检测等游戏基础上投入了大量精力。
【解决方案2】:
  1. 将条件重写为-i.w &lt; (i.rect.x-pos.x)+(WIDTH/2) &lt; WIDTH and -i.h &lt; (i.rect.y-pos.y)+(HEIGHT/2) &lt; HEIGHT。它至少会增加可读性,并且可能会提高性能。

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

  3. 事实上,您的条件可能会被重写为向量形式 (dim = 2),SIMD 可能在这里有用。探索这个机会。

【讨论】:

  • 你能解释一下你的最后一个吗?
  • -i.w &lt; (i.rect.x-pos.x)+(WIDTH/2) &lt; WIDTH and -i.h &lt; (i.rect.y-pos.y)+(HEIGHT/2) &lt; HEIGHT 可以重写为 2 向量形式 -A &lt; (B - P) + C &lt; C/2 其中A = (i.w, i,h)B = (i.rect.x, i.rect.y)P = (pos.x, pos.y)C = (WIDTH, HEIGHT)。一些库,例如numpy,可以通过使用 SIMD 处理器指令更快地处理此类向量操作。
  • 但您几乎不需要在此处应用所有这些一般提示。我从来没有使用过 PyGame,所以对你来说最好在这里使用@Nathan 的具体答案,因为事实证明有一个函数可以解决你的问题
猜你喜欢
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 2010-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多