Very costly lighting updates even when a part is transparent

I’ve recently noticed ,while working on a rain system, that lighting updates still happen when a part is transparent. These light updates reduce the FPS by half.

Here is a little video demonstration:


(I’m flying up to get out of the render distance of light updates)

The script just spawns some parts and moves them around:
local H = game:GetService("RunService").Heartbeat
local parts = Instance.new("Model",workspace)
parts.Name = "parts"
local x = 0
local z = 0
local r = 0
local function getpart(name)
	local part = parts:FindFirstChild(name)
	if (part == nil) then
		part = Instance.new("Part")
		part.Size = Vector3.new(1,1,1)
		part.CanCollide = false
		part.CastShadow = false
		part.Transparency = 0
		part.Anchored = true
		part.Name = (name)
		part.Parent = parts
	end
	return part
end
local size = 25 --set it higher if you have a good computer
while true do
	local t = script:GetAttribute("transparency") --for changing transparency
	r = math.random(-10,10) --if a part just gets moved to the same spot, light doesn't get updated
	for x = 1, size do
		for z = 1, size do
			local part = getpart(x..":"..z)
			if (part ~= nil) then
				part.Transparency = t --for changing transparency
				part.Position = Vector3.new(-(size/2)+x+r,1,-(size/2)+z+r)
			end
			if z % 150 == 0 then
				H:Wait()
			end
		end
		H:Wait()
	end
end
Images from MicroProfiler, for proof that they are light updates:


Non-transparent, close

Non-transparent, far (you can see that Update LightGrid completely disappeared)
For transparent parts it’s pretty much the same, but rendering is shorter.

Transparent, close

Transparent, far

I know there have already been hundreds of requests to add a option to have a material or part type that has no textures, lighting or reflections. Since Roblox doesn’t seem to care about that, I’m wondering if there is some kind of other way to bypass these light updates.
Maybe something like:

  • Changing the render distance of lighting
  • Tricking the render distance
  • The rain is using SurfaceGuis, so I’m wondering if there is some kind of other way to use them without parts.

I have looked for solutions in the forum for a while and tried a lot of potential solutions I had in mind, but I just ended up in a dead end.

I haven’t tried it myself and it probably won’t work with SurfaceGuis specifically, but I’ve heard that you can use Attachments as a 3D world-point to hold Lights and Particle objects.

You might try using the new ParticleOrientation set to CameraWorldUp.

Tried ParticleOrientation, but it didn’t change anything, maybe I’m doing it wrong. Anyway, after looking into the deep void of the api, found out that you can change the simulation radius Player | Documentation - Roblox Creator Hub, no idea what it does, but it works.