增加发条速度?


9

我正在PyGame中使用2D横屏游戏。对于每张地图,我们使用一个纹理(这是纹理的实际大小):

地图纹理

然后,我们使用以下代码加载图像:

sprite = pygame.image.load("Maps/MapTesting.png")
sprite.convert()
sprite = pygame.transform.scale(sprite,
              (sprite.get_width()*6, sprite.get_height()*6))

如您所见,纹理被炸毁了6次以创建实际的地图纹理。平均而言,此纹理约为4500x800。每帧都必须在屏幕上涂抹此纹理,因为整个屏幕都是脏的(由于侧面滚动)。我们使用以下代码进行操作:

screen.blit(sprite, (0, 0),
(cameraposx, cameraposy, windowheight, windowwidth))

而且有效。问题在于它的运行速度很慢:我在低端的PC上只能获得40 FPS的微不足道,而且没有任何实际的AI /对象运行,而我们的目标是60 FPS。我们如何加快速度?


请注意,上面的代码已经过清理并且没有上下文。完整的代码可以在这里找到:https : //github.com/nightcracker/PyGG2

最后但并非最不重要的一点是,尽管上面的图像可能看起来像8位,但是游戏中的某些元素需要更高的位深度。


将每个纹理拆分为合理的大小,例如,每个块1024宽,并且一次只涂抹两个相关的对象。
贾里·孔帕

@JariKomppa:尝试过,不会对blitting产生影响(pygame足够聪明,只能对我告诉它的rect进行blit),而对内存使用率没有影响。
orlp 2011年

您可能无法使用pygame(trollface.jpg).... jkjk,在这种情况下,我猜这不是您的速度下降发生的地方,您是否已对其进行了广泛的测试?
ultifinitus 2011年

@ultifinitus:是的,我使用cProfile对其进行了概要分析。
orlp 2011年

如果以实际分辨率显示速度差异是多少?如果您预先计算了较大的图像怎么办?
ultifinitus 2011年

Answers:


7

让我列出一些与将像素点涂到表面有关的常规比较优化(根据我的经验)。

1)通常调色板图像(索引图像)在变白时会进行重定向的另一级操作(以获得颜色),因此与真彩色图像相比,在变白时变慢。

2)真彩色像素数据(假设不带Alpha-比如24位数据)可以非常快速地变色,因为我们可以对图像的每个扫描线(如果要复制图像的一部分)进行一次memcpy传输到设备帧缓冲区如果要遮盖的数据是完整图像,那么我们可以直接存储整个数据,这要快得多!

3)绘制Alpha像素数据将是最昂贵的,因为它将包括计算每个分量的结果,我们需要再次将其打包为RGB数据。简单来说,每个像素要进行更多操作以获得最终颜色!

Finalrgb = Alpha*(Srgb) + (1-Alpha)*Drgb (this is for normal blend equation)
    where Srgb is source-rgb (we need to apply for each of the component for final color)
       Drgb is the color that will be there in the destination buffer.

我以前没有从事过pyGame的工作。但是,快速浏览一下它的代码,使我假设它在后台使用了'sdl'Blit函数。通常,Sdl blit会非常快且经过优化,因此,只需再一次不做以上几点和说明即可!祝好运!

* 更新: *设置颜色键就像在将每个像素点涂到表面上时增加一项额外的检查。

       for(eachPixelColor in allPixels)
         {
            if(eachPixelColor is NOT colorKeyColor)
            {
              copy color to the frame buffer!
            }

         }

因此,在这里,如果您看到的话,我们将不使用memcpy,因为我们需要检查每个像素的颜色有效性!


好的,事实证明调用了set_colorkey滑入地图纹理的功能,并为其提供了(昂贵的)Alpha通道。一个convert固定的问题,现在我在这台垃圾计算机上稳定运行了150 FPS。谢谢!
orlp 2011年

嘿会编辑与颜色键相关的内容,甚至忘记添加一些信息了:D
Ayyappa

5

sprite.convert() 不按照您的想法去做。

sprite = sprite.convert() 是您所需要的。


糟糕,我确实sprite = sprite.convert()在真实代码中:)
orlp 2011年

啊哈好 :)在这种情况下,除了考虑使用pyglet而不是pygame之外,或者如果您对OpenGL感到满意,可以直接使用pyOpenGL,我无能为力。
Kylotan

@Kylotan:好搭档!我没有检查过它:)
Ayyappa

甚至更好:sprite = pygame.image.load("Maps/MapTesting.png").convert()
MestreLion 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.