渲染画面

从图片加载到使用字体生成,我们现在手头应该已经有了不少的Surface对象。要将其绘制到屏幕上,就需要对其进行渲染。

从前面的最小应用中可以看到,语句screen.blit()将指定的图片Surface对象绘制在了自身的指定位置,并在最后使用pygame.display.update()刷新了整个画面。在实际的应用中,都是通过.blit()函数来逐一绘制相应的Surface。

在渲染画面时,还是有一定技巧的,通过应用这些技巧,可以对绘制工作进行提速。

分区绘制

在很多游戏中,通常并不需要进行全屏绘制,而是先将屏幕分为不同的显示区,分别显示不同的信息。pygame也支持对屏幕进行分区绘制,这样在绘制的时候只需要绘制出现变化的区域即可。分区绘制会减少很多不必要的绘制工作,从而使绘制过程提速。

对屏幕进行分区是使用.set_clip()函数实现的,这个函数接受四个整型数值参数来定义一个矩形区域。在绘制时,可以通过.get_clip()函数来获得绘制区域。在设定分区之后,其后的绘制操作将只会影响这个区域内的像素,如果需要绘制其他的区域,则需要再次调用.set_clip()来激活相应的绘制区域。

Subsurface

把所有的图像素材都保存成单独的文件是一种十分不合理的行为,连续不断的加载图片会大量消耗内存,最后可能会中会出现的结果就是内存不足。通常处理图片的方式是将相同类型或者内容的素材放置在一个图片里,在加载之后动态进行切割,这样会节省不少的内存。

Pygame中的Subsurface可以通过Surface对象的.subsurface()函数来获取,这个函数接受两个元组作为参数,分别代表左上角和右下角的坐标值,以此来对Surface进行切割并以Surface对象返回指定区域内的内容。

Surface锁定

Pygame在绘制Surface时,会自动对Surface进行锁定,并在绘制结束后自动解锁,以防止多线程操作时其他线程的干扰。但是连续不断的锁定和解锁操作会消耗大量的时间,使得锁定操作十分没有效率。为了解决这个问题,我们可以手动对Surface进行锁定,

Warning

但是千万要记得解锁,否则pygame会被卡住而失去响应。

锁定可以直接调用Surface对象的.lock()函数,而解锁则是直接调用.unlock()函数。