pygame surface.blits 当使用区域参数时
pygame surface.blits when using area argument
我正在尝试将 surface.blits 与 area 参数一起使用来提高我的代码的性能。当我将区域参数用于 blits 时,我 运行 出现以下错误:
SystemError: <'method 'blits' of 'pygame.Surface' objects> returned a result with an error set.
如果我删除 area 参数,blits 将按我预期的方式工作。关于我可能做错了什么的任何想法?下面附上了我的用例和错误的示例代码。
import sys
import random
import pygame
pygame.init()
tilemap = pygame.image.load('pattern.jpg')
tilesize = 64
size = 4
w, h = size*64, size*64
screen = pygame.display.set_mode((w, h))
while True:
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
blit_list = []
for i in range(size):
for j in range(size):
xi, yi = random.randint(0, size), random.randint(0, size)
blit_args = (tilemap, (i*tilesize, j*tilesize),
(xi*tilesize, yi*tilesize, tilesize, tilesize))
# calling screen.blit here works correctly
screen.blit(*blit_args)
blit_list.append(blit_args)
# instead of using multiple blit calls above, calling screen.blits here fails
# remove the area argument (3rd arg) from each blit_arg tuple works
# screen.blits(blit_list)
pygame.display.flip()
# wait a second
pygame.time.wait(1000)
这是我使用的图像 (https://www.behance.net/gallery/19447645/Summer-patterns):
这是 C 代码中的错误。在 surface.c line 2258 中,对于 surf_blits
有以下测试:
if (dest->flags & SDL_OPENGL &&
!(dest->flags & (SDL_OPENGLBLIT & ~SDL_OPENGL))) {
bliterrornum = BLITS_ERR_NO_OPENGL_SURF;
goto bliterror;
}
而在 surface.c line 2118 中,surf_blit
的代码是:
#if IS_SDLv1
if (dest->flags & SDL_OPENGL &&
!(dest->flags & (SDL_OPENGLBLIT & ~SDL_OPENGL)))
return RAISE(pgExc_SDLError,
"Cannot blit to OPENGL Surfaces (OPENGLBLIT is ok)");
#endif /* IS_SDLv1 */
注意 #if IS_SDLv1
.
问题似乎来自 SDL_OPENGLBLIT
,即 now deprecated。
Do not use the deprecated SDL_OPENGLBLIT mode which used to allow both blitting and using OpenGL. This flag is deprecated, for quite a few reasons. Under numerous circumstances, using SDL_OPENGLBLIT can corrupt your OpenGL state.
很遗憾,我不是 OpenGL 专家,无法进一步解释。希望有人可以 post 更准确的答案。
我可以肯定的是,我可以在之前提高 BLITS_ERR_SEQUENCE_SURF
(例如,通过将 pygame.Rect
作为 blit_args
中的第一个对象),我无法做到之后加注BLITS_ERR_INVALID_DESTINATION
。
这让我觉得上面几行是有问题的。
编辑
我可以确认,如果我在上面的测试周围添加 #if IS_SDLv1
并重新编译 pygame,它会起作用。不知道为什么! ☺
我提出了issue on GitHub.
我正在尝试将 surface.blits 与 area 参数一起使用来提高我的代码的性能。当我将区域参数用于 blits 时,我 运行 出现以下错误:
SystemError: <'method 'blits' of 'pygame.Surface' objects> returned a result with an error set.
如果我删除 area 参数,blits 将按我预期的方式工作。关于我可能做错了什么的任何想法?下面附上了我的用例和错误的示例代码。
import sys
import random
import pygame
pygame.init()
tilemap = pygame.image.load('pattern.jpg')
tilesize = 64
size = 4
w, h = size*64, size*64
screen = pygame.display.set_mode((w, h))
while True:
screen.fill((0, 0, 0))
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
blit_list = []
for i in range(size):
for j in range(size):
xi, yi = random.randint(0, size), random.randint(0, size)
blit_args = (tilemap, (i*tilesize, j*tilesize),
(xi*tilesize, yi*tilesize, tilesize, tilesize))
# calling screen.blit here works correctly
screen.blit(*blit_args)
blit_list.append(blit_args)
# instead of using multiple blit calls above, calling screen.blits here fails
# remove the area argument (3rd arg) from each blit_arg tuple works
# screen.blits(blit_list)
pygame.display.flip()
# wait a second
pygame.time.wait(1000)
这是我使用的图像 (https://www.behance.net/gallery/19447645/Summer-patterns):
这是 C 代码中的错误。在 surface.c line 2258 中,对于 surf_blits
有以下测试:
if (dest->flags & SDL_OPENGL &&
!(dest->flags & (SDL_OPENGLBLIT & ~SDL_OPENGL))) {
bliterrornum = BLITS_ERR_NO_OPENGL_SURF;
goto bliterror;
}
而在 surface.c line 2118 中,surf_blit
的代码是:
#if IS_SDLv1
if (dest->flags & SDL_OPENGL &&
!(dest->flags & (SDL_OPENGLBLIT & ~SDL_OPENGL)))
return RAISE(pgExc_SDLError,
"Cannot blit to OPENGL Surfaces (OPENGLBLIT is ok)");
#endif /* IS_SDLv1 */
注意 #if IS_SDLv1
.
问题似乎来自 SDL_OPENGLBLIT
,即 now deprecated。
Do not use the deprecated SDL_OPENGLBLIT mode which used to allow both blitting and using OpenGL. This flag is deprecated, for quite a few reasons. Under numerous circumstances, using SDL_OPENGLBLIT can corrupt your OpenGL state.
很遗憾,我不是 OpenGL 专家,无法进一步解释。希望有人可以 post 更准确的答案。
我可以肯定的是,我可以在之前提高 BLITS_ERR_SEQUENCE_SURF
(例如,通过将 pygame.Rect
作为 blit_args
中的第一个对象),我无法做到之后加注BLITS_ERR_INVALID_DESTINATION
。
这让我觉得上面几行是有问题的。
编辑
我可以确认,如果我在上面的测试周围添加 #if IS_SDLv1
并重新编译 pygame,它会起作用。不知道为什么! ☺
我提出了issue on GitHub.