Python、Pygame、Pyro:ネットワーク上で表面を送信する方法は?
-
13-09-2019 - |
質問
PygameとPyroを使用してPythonでプロジェクトに取り組んでいます。データ、機能、クラスなどを簡単に送信できます。ただし、輸送中に死ぬことなく、ワイヤー全体に表面を送ることはできません。
サーバーは、に表面を作ります def __init__
ワイヤー全体にアクセスされているクラスの:
self.screen = pygame.display.set_mode(SCREENRECT.size, NOFRAME)
サーバーでは、スクリーンがASを印刷します 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()を使用して新しいSurfaceのピクセルを設定し、ステップ1からピクセルでコピーします。
編集:私はそれを過剰に拡大していることが私に起こりました。表面をシリアル化するには、使用してください pygame.image.tostring(), 、そしてそれをリロードするには、使用します pygame.image.fromstring().
他のヒント
一般的に言えば、ネットワーク全体に表面を送信したくありません(表面がデバイスに依存していると仮定しています)。ほとんどの場合、クライアントはローカル表面の図面を管理する責任があり、サーバーはクライアントに描画する必要があるものを伝える責任があります。サーバーはそうではないかもしれません 持ってる グラフィックを表示できるディスプレイ!
オブジェクトを漬けてファイルを送信してみてください...