The test room runs great, I think what's tanking performance is updating the projector image the way I am (which is probably not the best way but i don't know a better way).
This is the code I have that gets the video into the projector:
extends SpotLight3D
@export var video_viewport: SubViewport
var projector_texture:ImageTexture
var timer:Timer
var image:Image
func _ready() -> void:
timer = Timer.new()
timer.connect("timeout",update_image)
#Only update the projector video every 1/24 of a second (the video framerate)
timer.wait_time = 0.042
add_child(timer)
timer.start()
image = video_viewport.get_texture().get_image()
projector_texture = ImageTexture.create_from_image(image)
light_projector = projector_texture
func update_image() -> void:
image = video_viewport.get_texture().get_image()
projector_texture.set_image(image)