Pygame:平铺地图还是大图片

5

我正在尝试决定在滚动地图游戏中,是使用预先渲染的大图像还是每帧在屏幕上单独渲染瓦片更好。我已经尝试过两种方式编程,但没有看到明显的速度差异,但这可能是由于我的经验不足。

除了内存之外,是否有不使用预先渲染地图的速度原因?

4个回答

5
我能想到现代硬件(例如像iPhone这样快速且具有很多内存的设备)选择其中一种的唯一原因是技术上的差异,使得游戏代码更易于理解。在性能方面,它们之间几乎没有什么区别。
我能想到的一个例外是,如果您正在使用真正巨大的背景,并在GPU中进行瓷砖渲染,则可以将瓷砖作为纹理,这样每帧CPU和GPU之间需要传输的数据就很少,而且会使用非常少的视频内存,从而获得适度的速度提升。

感谢您的快速回复。我想暂时还是会使用预渲染地图,以避免额外的计算来偏移和绘制屏幕上的瓷砖。 我的地图图片只有大约62kB。 - i_4_got

1

内存和速度密切相关。如果您的图块集适合视频内存,但预渲染地图不适合,则速度会受到影响。


1
也许这真的取决于地图的大小,但即使使用低级计算机也不应该成为问题。
大图像的问题在于重绘所有内容需要很长时间,因此您将得到一个不灵活的“地图”。
但是,优化图像(使用convert()函数和16位)的真正优势是快速的blitting。
我也使用大图像,在一台可能是中等水平的计算机上,通过blitting巨大的图像,我有大约150 FPS,这些图像仅需要约100MB RAM。
image = image.convert()#video system has to be initialed

以下代码创建一个大小为5000*5000的图像,在其上绘制内容,将其blit到屏幕上(填充屏幕)50次,并在最后报告执行一次blit和flip所需的时间。
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")

0

根据您想制作的地图大小而定,然而,凭借现有技术,很难看到瓷砖地图“渲染”需要比预期更长的时间,基于瓷砖的游戏几乎已经消失了,但这仍然是游戏编程世界的一个好实践和起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接