我正在 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 内存,而且速度很慢。
简短回答:不。 SDL2 不允许在渲染器之间共享纹理,并且渲染器与 Windows 1:1 绑定。
(请注意,SDL 可以在内部使用不同的图形 API,其中一些 API 严格绑定到每个上下文的单个窗口)
当然你不是第一个有这个想法的人。
由于 SDL2 于 2013 年发布,并且 pygame/pygame-ce 中的 SDL2 支持在 10 多年后仍在开发中,我不会打赌 sdl3 会实现这一点并在不久的将来在 pygame 中提供它。