Python, Pygame, Pyro: Как отправить поверхность по сети?
-
13-09-2019 - |
Вопрос
Я работаю над проектом в Python, используя Pygame и Pyro. Я могу легко отправлять данные, функции, классы и тому подобное. Тем не менее, я не могу отправить поверхность через проволоку, не умирая на меня в пути.
Сервер делает поверхность в def __init__
о классе, доступном через проволоку:
self.screen = pygame.display.set_mode(SCREENRECT.size, NOFRAME)
На сервере экрана печатает как Surface(800x800x32 SW)
но при извлечении клиентом это Surface(Dead Display)
.
Что -то, чтобы отметить, хотя. Я получаю мертвый дисплей, когда использую функцию доступа для получения экрана. Если я использую print Player.screen
Чтобы получить переменную, я вместо этого получаю то, что, кажется, является указателем пироса на экран: <Pyro.core._RemoteMethod instance at 0x02B7B7B0>
. Анкет Может, я смогу сделать это?
Скорее всего, я густой, у кого -нибудь есть какое -то понимание? Спасибо. :)
Решение
Поверхность Pygame - это обертка вокруг нижней поверхности SDL, которую, как я подозреваю, не может быть сериализована Pyro. Если вы хотите скопировать его содержимое через проволоку, вам было бы лучше сделать что -то подобное:
- На сервере используйте Surface.get_buffer (), чтобы получить доступ к базовым пикселям.
- Запомните размеры поверхности, глубину цвета и т. Д.
- Отправьте данные, полученные из шагов 1 и 2, над проводом клиенту.
- На клиенте создайте новую поверхность, используя размеры, глубину цвета и т. Д., С шага 2.
- Установите пиксели новой поверхности, используя Surface.get_buffer () и копируйте в пикселях с шага 1.
Редактировать:Мне просто пришло в голову, что я переполняю это. Чтобы сериализировать вашу поверхность, используйте pygame.image.tostring (), и перезагрузить, использовать pygame.image.fromString ().
Другие советы
Вообще говоря, вы не хотите отправлять поверхность (я предполагаю, что поверхность является зависимым от устройства дисплеем) по всей сети. В большинстве случаев ваш клиент будет отвечать за управление чертежей на локальной поверхности, и ваш сервер отвечает за то, чтобы рассказать клиенту, что ему нужно нарисовать. Сервер может даже не имеют дисплей, способный показывать графику!
Попробуйте поднять объект и отправить файл ...