我在搞乱 Kivy,并试图用某种 2D 网格获得一些游戏之类的应用程序。在我的设计中,每个单元格哦网格应该有自己的图形表示,这取决于里面的内容。下面是我当前的简单代码,它只是创建网格并在每个单元格中插入一些图像。
class MyWidget(Widget):
def __init__(self,images,*args, **kwargs):
super(MyWidget, self).__init__(*args, **kwargs)
self.images = []
for img in images:
self.add_image(img)
self.bind(pos=self.callback,size=self.callback)
def add_image(self,image):
self.images.append(Image(source=image,allow_stretch = True,keep_ratio = False))
self.add_widget(self.images[-1])
def callback(self,instance,value):
for image in instance.images:
image.pos = instance.pos
image.size = instance.size
class StartScreen(Screen):
def __init__(self,**kwargs):
super(StartScreen, self).__init__(**kwargs)
i = 10
self.layout = GridLayout(cols=i)
self.add_widget(self.layout)
for i in range(i*i):
self.layout.add_widget(MyWidget(['./images/grass.png','./images/bug1.png']))
class TestApp(App):
def build(self):
return StartScreen()
问题是,虽然所有图像都是相同的,但据我所见,每个单元格都会再次加载到内存中。它效率不高,尤其是当有 10000 个左右的单元格时。我试图为每个单元格添加相同的图像,但事实证明每个小部件只能有一个父级。我还尝试使用已经初始化的纹理来初始化新图像,但这并没有带来任何改进。我试图获取加载图像的纹理,然后用它作为纹理创建矩形。像这样的东西:
def add_image(self,texture):
with self.canvas:
rect = Rectangle(texture=texture,pos=self.pos, size=self.size)
self.rects.append(rect)
其中纹理是:
Image(source='./images/grass.png',allow_stretch = True,keep_ratio = False).texture
它提高了内存使用率(对于 10000 个具有 200kB 图像的单元,从 430MB 到 160MB。但是,这对于两个图像来说还是相当多的。:)
我的问题:在 Kivy 中是否有更有效的方法来创建包含大量重复图像的 2D 网格?也许我解决这个问题的方法有缺陷——我在创造游戏方面真的没有过期......