python - 提高 Sprite 渲染性能?

标签 python pygame sdl sdl-2 pysdl2

我正在寻找一种方法来提高 PySDL2 渲染大量大 Sprite 的性能。以下是我的尝试,尝试尽可能使用硬件渲染:

import sdl2.ext as sdl2ext, sdl2
import sys
from random import randint

def run():
    sdl2ext.init()
    disp_mode = sdl2.video.SDL_DisplayMode()
    sdl2.SDL_GetDesktopDisplayMode(0, disp_mode)
    window = sdl2ext.Window('pysdl2 benchmark', size=(disp_mode.w, disp_mode.h),
            flags=sdl2.SDL_WINDOW_SHOWN | sdl2.SDL_WINDOW_FULLSCREEN_DESKTOP)
    window_w, window_h = window.size
    window.show()

    renderer = sdl2ext.Renderer(window)
    factory = sdl2ext.SpriteFactory(sprite_type=sdl2ext.TEXTURE,
            renderer=renderer)
    spr_image = sdl2ext.image.load_image('big_sprite.png')
    sprites = [factory.from_surface(spr_image) for _ in xrange(100)]
    for spr in sprites:
        spr.position = randint(0,160), randint(0,90)
        spr.w, spr.h = spr.size
        spr.dx = randint(1,16); spr.dy = randint(1,16)
    renderer_spr = sdl2.ext.TextureSpriteRenderSystem(renderer)

    running = True
    while running:
        events = sdl2ext.get_events()
        for event in events:
            if event.type == sdl2.SDL_QUIT:
                running = False
                break
        renderer.clear(COLOR_CARMINE)    # instance of sdl2ext.Color
        renderer_spr.render(sprites)
        renderer.present()
        # Updating sprites positions
        for spr in sprites:
            if spr.x + spr.w + spr.dx > window_w or \
                    spr.x + spr.dx < 0:
                        spr.dx = -spr.dx
            if spr.y + spr.h + spr.dy > window_h or \
                    spr.y + spr.dy < 0:
                        spr.dy = -spr.dy
            spr.x += spr.dx
            spr.y += spr.dy
        #window.refresh()
    sdl2ext.quit()
    return 0

由于 PySDL2 的文档相当稀疏,我很好奇我是否可能错过了一些重要的内容,并且编写的代码在某种程度上不是最佳的。

最佳答案

一些快速的性能建议

  • 您应该首先告诉我们这个示例的当前性能如何。任何高于 60 fps 的内容都可以。
  • 使用分析器查找瓶颈。
  • 请注意,Python 循环本质上很慢。您应该找到一种方法来提供类型信息和/或删除绑定(bind)检查
  • 像 numpy 这样的库可以提供帮助

更多详情

在 kivy 框架中,我们使用 Cython(在有意义的情况下将 python 编译为 C)。现在,我不知道你想要做什么的具体细节,所以请考虑它的值(value)。 Python 循环很慢,特别是当您使用游戏循环来更新 Sprite 时。

我曾经写过一个shmup,也遇到了同样的问题。通过对项目进行 cythonizing 获得了最佳性能(30% 平坦增益)。然后我尝试(强烈)输入我能输入的所有内容(再次是 cython),然后我在使用探查器时优化了 python 循环。您已经删除了屏幕外的 Sprite (但您应该检查它是否正常工作),请注意对象创建/垃圾收集的成本。

关于python - 提高 Sprite 渲染性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29117524/

相关文章:

python - 使用模式从字符串中提取数字

python - 如何在 Vim 中一次注释选定的代码块?

python - 在 iPython 修剪输出中解释 {isinstance}?

python - 将 block 旋转到某个位置

c++ - glCreateShader失败并返回0

SDL2 - 在纹理 Alpha channel 上渲染

python - 如何将测试引用数据保存在单独的存储中?

python - pygame中的显示闪烁(如何使我的代码更高效)

python - 在pygame中慢慢画一条线,而其他线保持静止

c++ - SDL_Image 不工作。 "unresolved external symbol _IMG_LoadTexture"