pygame._sdl2 和 SDL2 - 使用多个渲染器在 GPU 上进行高效纹理存储

问题描述 投票:0回答:1

我正在 pygame._sdl2 中工作,以便我可以同时创建多个 (2) 窗口。 我认为这是一个 SDL2 问题,不是特定于 pygame:

我希望能够将相同的纹理 blit() 到两个窗口中(在不同的时间)。 据我所知,SDL2 纹理与特定的渲染器相关联。 所以看来我必须为每个源图像创建 2 个纹理 - 每个渲染器一个。

由于纹理存在于 GPU 上,我是否需要将 GPU 存储要求加倍?

有没有办法让单个内存资源可以绘制到两个渲染器? 或者有其他方法可以提高 GPU 内存使用率吗?

我在 Windows 和 Raspberry Pi 中工作,所以我想 RPi 上的 GPU 存储可用性将非常有限。

我尝试过使用 Surfaces,但它们不会 blit() 到渲染器中:

import pygame as pg
from pygame._sdl2 import Window, Texture, Image, Renderer, get_drivers, messagebox

pg.display.init()
win = Window("My Window", resizable=True)
ren = Renderer(win)
srf = pg.image.load("image.png")
ren.blit(srf, pg.Rect(300,100,100,100))

这给出:

TypeError: source must be drawable

这很奇怪,因为 blit() 不会在源上进行任何绘制,而只是从中读取。 我认为“可绘制”是指 GPU 内存中的数据,但我可能是错的。

我正在考虑的一件事是创建一个单一的纹理,然后用多个表面更新()它(我的许多纹理都是相同大小的)。 但据我了解, update() 需要从 CPU 内存复制到 GPU 内存,而且速度很慢。

python pygame sdl sdl-2
1个回答
0
投票

简短回答:不。 SDL2 不允许在渲染器之间共享纹理,并且渲染器与 Windows 1:1 绑定。

(请注意,SDL 可以在内部使用不同的图形 API,其中一些 API 严格绑定到每个上下文的单个窗口)

当然你不是第一个有这个想法的人

由于 SDL2 于 2013 年发布,并且 pygame/pygame-ce 中的 SDL2 支持在 10 多年后仍在开发中,我不会打赌 sdl3 会实现这一点并在不久的将来在 pygame 中提供它。

© www.soinside.com 2019 - 2024. All rights reserved.