Python 使用NumPy提高PyGame中更新函数的性能

Python 使用NumPy提高PyGame中更新函数的性能,python,numpy,pygame,Python,Numpy,Pygame,现在,pygame正在做很多很多计算来呈现我当前的项目。 我被告知NumPy可以帮助“解决”我的项目瓶颈。 关于如何实现它,我有一些想法,但我想知道你们是否对如何使用NumPy改进此更新功能的性能有任何想法/建议,那就太好了:) 功能说明: 当对象(即球)在hitGrid周围移动时,它通过其位置跟踪对象所在的位置,并将hitGrid中该位置的值减去1 我的代码: # in update def update(self, boundrect, hitGrid, hitList): ... o

现在,pygame正在做很多很多计算来呈现我当前的项目。 我被告知NumPy可以帮助“解决”我的项目瓶颈。 关于如何实现它,我有一些想法,但我想知道你们是否对如何使用NumPy改进此更新功能的性能有任何想法/建议,那就太好了:)

功能说明: 当对象(即球)在
hitGrid
周围移动时,它通过其位置跟踪对象所在的位置,并将
hitGrid
中该位置的值减去1

我的代码:

# in update
def update(self, boundrect, hitGrid, hitList):
...
   oldHitList = hitList[:]
   # How do you clear a np.array like you would a list?
   hitList.clear() # hitList = np.empty((GRIDX, GRIDY))?
   for c in range(self.gridsize[0]):
       for r in range(self.gridsize[1]):
           p = gridpos[1] + r, gridpos[0] + c
           if p in oldHitList:
               hitList.append(p) # hitList = np.append(hitList, p)
           elif self.grid[r][c] == 1:
               if p[0] < len(hitGrid) and p[1] < len(hitGrid[p[0]]):
                   hitList.append(p) # hitList = np.append(hitList, p)
                   if p not in oldHitList:
                       hitGrid[p[0]][p[1]] -= 1
                       max_hit = min(max_hit, hitGrid[p[0]][p[1]])
...
# in main
hitGrid = np.full((GRIDX, GRIDY), max_hit)
hitList = np.empty((GRIDX, GRIDY))
#变量
宽度、高度、边距=10,10,1
GRIDX,GRIDY=100,40
def更新(self、boundrect、hitGrid、hitList):
self.pos+=self.vel
self.rect.center=self.pos
如果self.rect.left=boundrect.right:
自我等级x*=-1
如果self.rect.top=boundrect.bottom:
自我水平y*=-1
#将矩形与网格对齐
gridpos=圆形(自校正x/(宽度+边距)),圆形(自校正y/(高度+边距))
self.rect.topleft=gridpos[0]*(宽度+边距),gridpos[1]*(高度+边距)
#增量接触场
全球最大命中率
最大命中率=100
#这里用的是numpy
oldHitList=hitList[:]
hitList.clear()
对于范围内的c(self.gridsize[0]):
对于范围内的r(self.gridsize[1]):
p=gridpos[1]+r,gridpos[0]+c
如果oldHitList中有p:
hitList.append(p)
elif自网格[r][c]==1:
如果p[0]
#gridObject使用的对象
ballGrid=[[1]]
#如何在main()中初始化gridObject
def main():
...
sprite_group=pygame.sprite.group()
ball=GridObject((screen.get\u width()//2,screen.get\u height()//2),ballGrid,sprite\u组)
hitGrid=[[100代表范围内的i(GRIDX)]代表范围内的j(GRIDY)]
hitList=[]
...
...
...
#如何使用更新功能
边框=pygame.Rect(0,0,(GRIDX*(宽度+边距)+边距,(GRIDY*(高度+边距)))
精灵组。更新(边界框、命中栅格、命中列表)
我的想法:

# in update
def update(self, boundrect, hitGrid, hitList):
...
   oldHitList = hitList[:]
   # How do you clear a np.array like you would a list?
   hitList.clear() # hitList = np.empty((GRIDX, GRIDY))?
   for c in range(self.gridsize[0]):
       for r in range(self.gridsize[1]):
           p = gridpos[1] + r, gridpos[0] + c
           if p in oldHitList:
               hitList.append(p) # hitList = np.append(hitList, p)
           elif self.grid[r][c] == 1:
               if p[0] < len(hitGrid) and p[1] < len(hitGrid[p[0]]):
                   hitList.append(p) # hitList = np.append(hitList, p)
                   if p not in oldHitList:
                       hitGrid[p[0]][p[1]] -= 1
                       max_hit = min(max_hit, hitGrid[p[0]][p[1]])
...
# in main
hitGrid = np.full((GRIDX, GRIDY), max_hit)
hitList = np.empty((GRIDX, GRIDY))
更新中的
#
def更新(self、boundrect、hitGrid、hitList):
...
oldHitList=hitList[:]
#如何像清除列表一样清除np.array?
hitList.clear()#hitList=np.empty((GRIDX,GRIDY))?
对于范围内的c(self.gridsize[0]):
对于范围内的r(self.gridsize[1]):
p=gridpos[1]+r,gridpos[0]+c
如果oldHitList中有p:
hitList.append(p)#hitList=np.append(hitList,p)
elif自网格[r][c]==1:
如果p[0]
这将有助于对“更新”所涉及的内容进行概念性描述。如果您需要更多信息,请告诉我您几天前提出并删除了完全相同的问题。发生了什么变化?它不打算问同一个问题两次。-你能提供一个可运行的例子吗?我很难理解你在这里想做什么。什么是hitGrid?所以你有一个在100x40网格上移动的对象,每次它移动到该网格中的一个新平铺,该平铺的值都会减少1?我的解释正确吗?@sloth yes you Are这将有助于对“更新”所包含的内容进行概念性描述。如果您需要更多信息,请告诉我您在几天前询问并删除了完全相同的问题。发生了什么变化?它不打算问同一个问题两次。-你能提供一个可运行的例子吗?我很难理解你在这里想做什么。什么是hitGrid?所以你有一个在100x40网格上移动的对象,每次它移动到该网格中的一个新平铺,该平铺的值都会减少1?我的解释正确吗?@sloth是的