0

我正在通过 wxPython 学习图形编程。我创建了一组平铺图像,旨在以由各种功能(已经完成)确定的方式将它们拼接在一起,以创建随机生成的地图以供将来使用(有效地创建平铺引擎)。

我当前将地图绘制到框架的方法包括遍历所有 50x50 位置并将 16x16 位 png 绘制到 EVT_PAINT 处理程序内的每个位置。这需要几秒钟,并且不适合我的意图(即让框架充当相机,然后可以在比显示的地图大得多的地图上平移)。

我的问题是,是否可以在背景中创建一个“缝合”在一起的图像,然后简单地用一条线绘制该图像而不是一遍又一遍地绘制(我怀疑这会占用这么多时间)?任何其他方法(有效)也很好,我必须承认我对一般编程不是很有经验,特别是对图形编程不是很有经验。理想情况下,我希望能够仅绘制该图像的可见部分,这是可包裹的,因此能够根据需要对“元图像”进行切片和重新缝合会很棒。

目前 EVT_PAINT 代码如下所示:

 def onpaint(self, event = None):
    dc = wx.PaintDC(self)
    dc.Clear()

    pposX = 0 #ppos = Pixel Position
    pposY = 0
    tposX = 0 #tpos = tile position, essentially the tile co-ordinates independent of pixel position
    tposY = 0
    while tposY < self.tTotalY: #loops through all y coordinates
        tposX = 0   
        while tposX < self.tTotalX: #loops through all x coordinates
            pposX = tposX*self.tsCurrent
            pposY = tposY*self.tsCurrent
            tiletype = self.getTileType(tposX,tposY,self.tTotalX,self.tTotalY)
            img = wx.Image((self.filepath + '\\' +str(tiletype)), wx.BITMAP_TYPE_ANY).ConvertToBitmap()              
            dc.DrawBitmap(img,pposX,pposY)
            img.Destroy()
            tposX += 1
        tposY += 1
4

1 回答 1

2

通过不从文件中重新加载图像并在每次绘制时转换为位图,您可以节省大量时间。如果您只加载它们一次,然后为每种油漆重复使用它们,您可能会发现它已经足够快了。

要采取的其他优化方法取决于您所绘制内容的性质,以及随着时间的推移它可能会发生多少变化。如果它可以被划分为一个相当静态的背景,而前景中的小东西发生了变化,那么一个好的做法是为背景预先创建一个位图,然后在您的绘图处理程序中,您只需绘制背景位图,然后绘制当前状态在此之上的前景。要制作大背景,您可以创建一个合适大小的空位图,创建一个以该位图为目标的 wx.MemoryDC,然后将您的图块绘制到该 DC。完成后,可以保存背景位图以在您的绘图处理程序中使用。

于 2013-06-14T02:15:02.867 回答