1

我试图制作这样的字体缓存:

from ._utils import SizedDict
def copysurf(x,mod):
    if mod:
        return cs(x)
    return ImmutableSurface(x)
class FontCache:
    def __init__(self):
        self.cache = SizedDict(20)
        self.fmisses = 0
        self.fhits = 0
        self.cmisses = {}
        self.chits = {}
    def getfor(self,font,char,aa,color):
        if font not in self.cache:
            self.cmisses[font] = 0
            self.chits[font] = 0
            self.cache[font] = SizedDict(300)
        if char not in self.cache[font]:
            self.cache[font][char] = font.render(char,aa,color)
        return self.cache[font][char].copy()
fontCache = FontCache()

(大小的字典也是我制作的,它们是删除最旧条目的字典,如果它超出了构造函数中指定的容量。)

但是当我尝试缓存字体时出现了问题。你看,

pygame.font.SysFont("Courier",22) == pygame.font.SysFont("Courier",22)

是假的,并且 hash() 函数返回不同的值。据我所知,没有任何方法可以返回字体的原始名称,我们不能仅通过知道大小以及粗体和斜体标志来测试相等性.

有什么想法吗?

4

1 回答 1

2

您可以子类pygame.font.Font化,在创建字体时存储元数据。像这样的东西:

import pygame

pygame.init()


class Font(pygame.font.Font):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.properties = (args, tuple(kwargs.items()))

    def __hash__(self):
        return hash(self.properties)

    def __eq__(self, other):
        return self.properties == other.properties

    @classmethod
    def construct(cls, fontpath, size, bold, italic):
        font = cls(fontpath, size)
        font.strong = bold
        font.oblique = italic
        return font


# Prints True
print(
    pygame.font.SysFont("Courier", 22, constructor=Font.construct)
    == pygame.font.SysFont("Courier", 22, constructor=Font.construct)
)
于 2021-10-13T13:29:35.637 回答