Python, Pygame, Pyro: 如何通过网络发送一个表面?

2 投票
3 回答
1041 浏览
提问于 2025-04-15 15:37

我正在做一个使用Python的项目,里面用到了pygame和pyro。我可以很轻松地发送数据、函数和类之类的东西。但是,我无法在传输过程中发送一个表面(surface),它会在传输中“死掉”。

在服务器上,我在一个类的def __init__方法里创建了一个表面:

self.screen = pygame.display.set_mode(SCREENRECT.size, NOFRAME)

在服务器上,屏幕显示为Surface(800x800x32 SW),但是当客户端获取到时,它却变成了Surface(Dead Display)

不过,有一点需要注意。当我使用一个访问函数来获取我的屏幕时,我会得到一个死掉的显示。如果我用print Player.screen来获取这个变量,我得到的却是一个看起来像是指向屏幕的pyro指针:<Pyro.core._RemoteMethod instance at 0x02B7B7B0>。也许我可以解引用这个指针?

我可能是理解得不够透彻,有人能给我一些建议吗?谢谢。:)

3 个回答

0

试着把这个对象进行“腌制”,然后发送这个文件...

1

一般来说,你不想把一个Surface(我假设Surface是指依赖设备的显示器)通过网络发送。大多数情况下,客户端会负责在它自己的Surface上进行绘图,而服务器则负责告诉客户端需要绘制什么。其实,服务器可能根本就没有能够显示图形的显示器!

6

在pygame中,Surface是一个包装器,它包裹着底层的SDL表面。我怀疑这个SDL表面不能被Pyro序列化。如果你想把它的内容传输到另一台机器上,最好按照以下步骤操作:

  1. 在服务器上,使用Surface.get_buffer()来获取底层像素的访问权限。
  2. 记录下Surface的尺寸、颜色深度等信息。
  3. 把第一步和第二步得到的数据通过网络发送给客户端。
  4. 在客户端,根据第二步的尺寸、颜色深度等信息创建一个新的Surface。
  5. 使用Surface.get_buffer()设置新Surface的像素,并把第一步的像素复制进去。

编辑:我刚想到,其实我把事情搞得太复杂了。要序列化你的Surface,可以使用 pygame.image.tostring(),然后要重新加载它,可以用 pygame.image.fromstring()

撰写回答