Godot Version
4.3
Question
I’m working on a project where I need to implement a Camera3D feed over a UDP connection for further experiments. Additionally, I want to enable real-time streaming features, including the movement of objects in front of the camera.
Currently, I’m experiencing a drop in framerate when connecting from a Python client, particularly due to moving objects in the scene.
Here’s my GDScript for the main scene:
extends Node3D
@onready var camera_3d: Camera3D = $Camera3D
var server: UDPServer = UDPServer.new()
var peers: Array[PacketPeerUDP] = []
func _ready() -> void:
	server.listen(4242) 
	print("UDP Server is listening on port 4242")
func _process(delta: float) -> void:
	server.poll()
	
	if server.is_connection_available():
		var peer: PacketPeerUDP = server.take_connection()
		peers.append(peer)
		print("Accepted connection from: %s:%s" % [peer.get_packet_ip(), peer.get_packet_port()])
	
	if peers.size() > 0:
		send_camera_feed()
func send_camera_feed():
	var image: Image = camera_3d.get_viewport().get_texture().get_image()
	var byte_array = image.save_png_to_buffer()  
	
	var chunk_size = 8192 
	for i in range(0, byte_array.size(), chunk_size):
		var chunk = byte_array.slice(i, i + chunk_size)
		for peer in peers:
			peer.put_packet(chunk)
And here’s my Python client code:
import socket
import cv2
import numpy as np
def main():
    server_address = ('127.0.0.1', 4242)
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sock.settimeout(10)
    message = b'test'
    sock.sendto(message, server_address)
    received_data = bytearray()
    
    try:
        while True:
            data, _ = sock.recvfrom(8192)
            received_data.extend(data)
            if len(data) < 8192:
                break
        if len(received_data) > 0:
            np_arr = np.frombuffer(received_data, np.uint8)
            img = cv2.imdecode(np_arr, cv2.IMREAD_COLOR)
            if img is not None:
                cv2.imshow('Received Camera Feed', img)
                cv2.waitKey(0)
            else:
                print("Failed to decode image.")
        else:
            print("No data received.")
    except Exception as e:
        print(f'An error occurred: {e}')
    finally:
        sock.close()
        cv2.destroyAllWindows()
if __name__ == "__main__":
    main()
Can anyone suggest ways to improve real-time streaming without experiencing framerate loss?