我的快速测试表明 pygame 比 pysdl2 快 100 倍,这是怎么回事?
My quick test indicates pygame is 100 times faster than pysdl2, whats going on?
所以我一直在 pygame 制作游戏,但性能很糟糕。经过大量搜索后,我发现 pygame 是围绕 SDL 构建的,而 SDL2 具有 GPU 支持,所以我想看看使用基于 SDL2 的东西是否会提高性能。将 pygame 与 pygame 的 pySDL2 库进行比较时,pygame 快了大约 100 倍……我肯定忽略了什么?
test_SDL2.py:
import os
os.environ["PYSDL2_DLL_PATH"] = os.path.dirname(os.path.abspath(__file__))
import sys, sdl2, sdl2.ext, time
sdl2.ext.init()
window = sdl2.ext.Window("test", size=(800, 600))
window.show()
factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)
sprite = factory.from_image("c:\game\gfx\plus.png")
spriterenderer = factory.create_sprite_render_system(window)
while True:
begin = time.time()
for i in xrange(100):
spriterenderer.render(sprite)
print time.time() - begin
window.refresh()
test_pygame.py:
import pygame, time
img = pygame.image.load('gfx/plus.png')
screen = pygame.display.set_mode((800, 600))
while True:
begin = time.time()
for i in xrange(100):
screen.blit(img, (i,i))
print time.time() - begin
pygame.display.flip()
警告: 我几天前才开始 SDL2
[在 C 中]。
在 pygame 中,您正在执行 100 个位块传输,但只有 一个 屏幕更新 pygame.display.flip()
在 SDL2 版本中,您进行了 100 次渲染操作,我认为这会进行 blit 和 屏幕更新。没有像 pygame 那样单独调用更新屏幕,所以如果您得到任何输出,这意味着渲染是一个组合操作。
要检查,请从 pygame 中删除 flip()
,我敢打赌你会得到 no 输出。
然后,将 flip()
移动到 循环中,我敢打赌性能会相似。
所以我一直在 pygame 制作游戏,但性能很糟糕。经过大量搜索后,我发现 pygame 是围绕 SDL 构建的,而 SDL2 具有 GPU 支持,所以我想看看使用基于 SDL2 的东西是否会提高性能。将 pygame 与 pygame 的 pySDL2 库进行比较时,pygame 快了大约 100 倍……我肯定忽略了什么?
test_SDL2.py:
import os
os.environ["PYSDL2_DLL_PATH"] = os.path.dirname(os.path.abspath(__file__))
import sys, sdl2, sdl2.ext, time
sdl2.ext.init()
window = sdl2.ext.Window("test", size=(800, 600))
window.show()
factory = sdl2.ext.SpriteFactory(sdl2.ext.SOFTWARE)
sprite = factory.from_image("c:\game\gfx\plus.png")
spriterenderer = factory.create_sprite_render_system(window)
while True:
begin = time.time()
for i in xrange(100):
spriterenderer.render(sprite)
print time.time() - begin
window.refresh()
test_pygame.py:
import pygame, time
img = pygame.image.load('gfx/plus.png')
screen = pygame.display.set_mode((800, 600))
while True:
begin = time.time()
for i in xrange(100):
screen.blit(img, (i,i))
print time.time() - begin
pygame.display.flip()
警告: 我几天前才开始 SDL2
[在 C 中]。
在 pygame 中,您正在执行 100 个位块传输,但只有 一个 屏幕更新 pygame.display.flip()
在 SDL2 版本中,您进行了 100 次渲染操作,我认为这会进行 blit 和 屏幕更新。没有像 pygame 那样单独调用更新屏幕,所以如果您得到任何输出,这意味着渲染是一个组合操作。
要检查,请从 pygame 中删除 flip()
,我敢打赌你会得到 no 输出。
然后,将 flip()
移动到 循环中,我敢打赌性能会相似。