私は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個程度のセルがある場合は効率的ではありません。各セルに同じ画像を追加しようとしましたが、各ウィジェットには親が 1 つしかないことがわかりました。また、既に初期化されているテクスチャを使用して新しい画像を初期化しようとしましたが、改善されませんでした。読み込まれた画像のテクスチャを取得し、それをテクスチャとして長方形を作成しようとしました。このようなもの:
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
メモリ使用量が改善されました (200kB の画像を含む 10000 個のセルで 430MB から 160MB に。それでも、2 つの画像の場合はかなりの量です。:)
私の質問: Kivy で、繰り返し画像が多い 2D グリッドを作成するより効率的な方法はありますか? 問題に対する私のアプローチに欠陥があるのかもしれません。