代码之家  ›  专栏  ›  技术社区  ›  BradMcDanel

使用区域参数时的pygame surface.blits

  •  6
  • BradMcDanel  · 技术社区  · 6 年前

    我正在尝试将surface.blits与area参数一起使用,以提高代码的性能。当我将area参数用于blits时,会遇到以下错误:

    系统错误:<'method'blits'of'pygame.surface'objects>返回了一个带有错误集的结果。

    如果我删除区域参数,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 ):

    pattern.jpg

    1 回复  |  直到 6 年前
        1
  •  3
  •   Jacques Gaudin    6 年前

    这是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 .

    不要使用不推荐使用的sdl_opengblit模式,该模式用于允许Blitting和使用OpenGL。由于很多原因,此标志已被弃用。在许多情况下,使用sdl_opengblit会损坏OpenGL状态。

    不幸的是,我不是OpenGL的专家,无法进一步解释。希望有人能给出更准确的答案。

    我所知道的是我可以提高 BLITS_ERR_SEQUENCE_SURF 之前(通过 pygame.Rect 作为第一个对象 blit_args 例如)我不能提高 BLITS_ERR_INVALID_DESTINATION 就在之后。

    这让我觉得上面的台词有问题。

    编辑

    如果我加上 如果IsSDLDV1 围绕上面的测试并重新编译pygame,它可以工作。不知道为什么!艾斯

    我提出了 issue on GitHub .