我正在编写一个带有可破坏方块的游戏,地图上有近 100k 个方块。它们都是精灵,存储在精灵表中,并由该表绘制
self.blocks_list.draw(pixelated=True)
如果你制作较小的地图(大约20k块),FPS就正常了。如何对此进行优化?保持他们的碰撞非常重要,这样屏幕后面的 NPC 就不会从方块中掉下来。
附:我用它self.blocks_list.use_spatial_hashing=True来优化碰撞。
我补充一下:这是加载块的代码
class Block(arcade.Sprite):
def __init__(self, x, y, id):
super().__init__(f"resources/sprites/blocks/block.png")
self.center_x = x
self.center_y = y
self.id = id
不必绘制整个地图,只需绘制可见区域中的那些对象即可。
碰撞检查通常需要 O(n 2 ) 检查 - 这可以优化。
我不知道你用什么来编写游戏,但这句话让我感到困惑:
我怀疑它会为每个对象创建一个新的精灵,即使传输的图片相同。如果是这样,那么程序对内存和处理器缓存的使用非常不合理(直到页面文件,这会显着减慢速度)。
您需要确保每个文件仅加载一次,并且所有对象都使用相同的精灵。这正是需要做的。
如果沿同一方向挖掘,虽然方块是可破坏的,但不太可能所有方块同时处于损坏状态。您可以使用享元模式,并对相同的方块使用相同的物体,直到第一次损坏。一般来说,您可以根据破坏程度创建对象池。但说实话,我不确定做完第3点后会带来多大好处。