Pygame: 瓦片地图还是大图像

5 投票
4 回答
3132 浏览
提问于 2025-04-16 08:34

我在考虑,是用一张提前制作好的大图来做一个滚动地图游戏,还是每一帧单独渲染小块地图。其实我已经尝试过这两种方法,但在速度上没有明显的差别,可能是因为我经验还不够。

除了内存方面,有没有速度上的原因不建议使用提前制作好的地图呢?

4 个回答

1

这可能真的跟地图的大小有关,但即使是低配置的电脑,这也不应该成为问题。

大图像的问题在于,重新绘制上面的所有内容需要很多时间,所以你会得到一个不太灵活的“地图”。

不过,使用优化过的图像(用convert()函数和16位色)有一个真正的好处,那就是快速的绘制。

我在一台可能中等配置的电脑上也处理大图像,绘制超大图像时能达到大约150帧每秒,这只需要大约100MB的内存。

image = image.convert()#video system has to be initialed

下面的代码创建了一张5000*5000的图像,在上面绘制一些东西,然后把它绘制到屏幕上,填充屏幕,重复50次,最后告诉你完成一次绘制和翻转花了多长时间。

def draw(dr,image,count,radius,r):
   for i in range(0,5000,5000//count):
      for j in range(0,5000,5000//count):
         dr.circle(image,(r.randint(0,255),r.randint(0,255),r.randint(0,255)),[i,j],radius,0)

def geschw_test(screen,image,p):
   t1 = p.time.get_ticks()
   screen.blit(image,(-100,-100))
   p.display.flip()
   return p.time.get_ticks() - t1

import pygame as p
import random as r

p.init()
image = p.Surface([5000,5000])
image.fill((255,255,255))
image.set_colorkey((255,255,255))
screen = p.display.set_mode([1440,900],p.SWSURFACE,16)
image = image.convert()#extremely efficient
screen.fill((70,200,70))
draw(p.draw,image,65,50,r)#draw on surface
zahler = 0
anz = 20
speed_arr = []
while zahler < anz:
   zahler += 1
   screen.fill((0,0,0))
   speed_arr.append(geschw_test(screen,image,p))
p.quit()
speed = 0
for i in speed_arr:
   speed += i
print(round(speed/anz,1),"miliseconds per blit with flip")
1

内存和速度是紧密相关的。如果你的图块集合可以放进显存里,但预先渲染的地图放不下,那么速度就会受到影响。

5

我能想到的在现代硬件上选择其中一个而不是另一个的唯一理由,就是一些技术上的原因,这些原因能让游戏代码更容易理解。性能方面,它们之间没有太大的区别。

不过,有一个例外就是,如果你使用的是非常大的背景图,并且在显卡上进行瓦片渲染,那么这些瓦片可以作为纹理使用,这样你会得到一些速度上的提升,因为每帧你不需要在CPU和GPU之间传输太多数据,而且会占用很少的视频内存。

撰写回答