在 pyglet 中绘制带有 3500 个标签的批次时 FPS 下降

FPS drop when drawing a batch with 3500 labels in pyglet

我正在制作一个带有地图的视频游戏,我试图在地图上打印每个区域的名称。为此,我使用了 pyglet.text.Label 对象。尽管所有这些标签都分配给同一批次,但当我绘制批次时,我的 FPS 低于 1。这是初始化所有标签的循环:

        label_font_size = 30 
        for i in range(self.reg_center_list.shape[1]):
                temp= pg.text.label(str(self.reg_names[i]), x=self.reg_center_list[0,i], y=self.reg_center_list[1,i], 
                group=self.names_group, batch=self.low_prox_batch, anchor_x='center',anchor_y='center', 
                font_size=label_font_size)

标签文本存储在 self.reg_names 列表中,它们相对于地图的位置存储在 self.reg_center_list 中。它们总共添加了 3500 多个标签。我做了一个实验,并在单个标签中打印了相同数量的文本,如下所示:

        stringg=''
        label_font_size = 30
        for i in range(self.reg_center_list.shape[1]):
            stringg=stringg + str(self.reg_names[i])
        temp= pg.text.Label(stringg, x=self.reg_center_list[0,i], y=self.reg_center_list[1,i],group=self.names_group,
        batch=self.low_prox_batch, anchor_x='center',anchor_y='center', font_size=label_font_size)

尽管绘制了事实上相同数量的字形,但它工作得很好,对 fps 没有显着影响。将此文本拆分到多个标签时似乎会产生一些开销。我想知道问题是否可能是由于某种原因,同一字形的纹理组未在标签之间共享,导致程序为每个字形和每个标签切换组,但我很难确认这个理论以及发现一个可能的解决方案。有人知道如何解决这个问题吗?感谢任何帮助,如果需要更多信息或不清楚的地方,请发表评论。 :)

这是一个较旧的问题,其中未正确考虑一批标签中的分组。它已在 pyglet v1.4.9:

中修复

Fix TextLayoutGroup consolidation when using custom Groups for Labels.

而且由于您是 运行 1.4.8,这很可能 是问题所在。
无论哪种方式,您都应该更新到最新版本,只需执行以下操作:

sudo pip install --upgrade pyglet

获取最新版本,或者 pip install --upgrade pyglet 如果您更喜欢用户本地包。