我正在尝试使用带有area参数的surface.blits来提高代码的性能。当我将area参数用于blits时,遇到以下错误:
SystemError:<'pygame.Surface'对象的'方法'blits'返回了带有错误集的结果。
如果我删除了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):
答案 0 :(得分:3)
这是C代码中的错误。在surface.c line 2258中,对于import LoginScreen from "../screens/Login";
Login: {
screen: LoginScreen
}
进行以下测试:
surf_blits
在surface.c line 2118中,对于 if (dest->flags & SDL_OPENGL &&
!(dest->flags & (SDL_OPENGLBLIT & ~SDL_OPENGL))) {
bliterrornum = BLITS_ERR_NO_OPENGL_SURF;
goto bliterror;
}
,代码为:
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
,即now deprecated。
请勿使用不赞成使用的SDL_OPENGLBLIT模式,该模式曾经允许使用blit和OpenGL。由于许多原因,不赞成使用此标志。在许多情况下,使用SDL_OPENGLBLIT可能会破坏OpenGL状态。
不幸的是,我不是OpenGL方面的专家,所以我无法进一步解释。希望有人可以发布更准确的答案。
我可以肯定的是,我可以在之前举起SDL_OPENGLBLIT
(例如,将BLITS_ERR_SEQUENCE_SURF
作为pygame.Rect
中的第一个对象),而我无法举起{ {1}}之后。
这使我认为上面的几行发生了什么事情。
编辑
我可以确认,如果我在上述测试周围添加blit_args
并重新编译pygame,则可以正常工作。不知道为什么! ☺
我举起了issue on GitHub。