Python, Pygame, Pyro: 如何通过网络发送一个表面?
我正在做一个使用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序列化。如果你想把它的内容传输到另一台机器上,最好按照以下步骤操作:
- 在服务器上,使用Surface.get_buffer()来获取底层像素的访问权限。
- 记录下Surface的尺寸、颜色深度等信息。
- 把第一步和第二步得到的数据通过网络发送给客户端。
- 在客户端,根据第二步的尺寸、颜色深度等信息创建一个新的Surface。
- 使用Surface.get_buffer()设置新Surface的像素,并把第一步的像素复制进去。
编辑:我刚想到,其实我把事情搞得太复杂了。要序列化你的Surface,可以使用 pygame.image.tostring(),然后要重新加载它,可以用 pygame.image.fromstring()。