How do I make this script less laggy?

What my script does is that whenever my target is cloned (the target will be cloned multiple times) from replicatedstorage to workspace, and is looked at, it gets destroyed.

The script works, it’s just very laggy

Script:

while task.wait() do
	local player = game:GetService("Players").LocalPlayer
	local character = player.Character or player.CharacterAdded:wait()
	local torso = character:WaitForChild("Torso")
	local target = workspace:WaitForChild("Silhouette").Torso
	local vectors = {}


	function dotProduct(a, b)
		return a.x * b.x + a.y * b.y + a.z * b.z
	end


	function getAngle(a, b)
		return math.acos(dotProduct(a, b) / (a.magnitude * b.magnitude))
	end


	function drawVector(position, angle, magnitude, name)
		if vectors[name] then
			vectors[name]:Destroy()
		end

		local p = Instance.new("Part")
		p.Anchored = true
		p.Size = Vector3.new(0.1, 0.1, magnitude)
		p.CFrame = CFrame.new(position + angle * magnitude / 2, position + angle)
		p.Transparency = 1
		p.Massless = true
		p.CanCollide = false
		p.CanQuery = false
		p.Parent = workspace
		
		vectors[name] = p
	end


	game:GetService("RunService").RenderStepped:Connect(function(part)
		local torsoAngle = torso.CFrame.lookVector
		local targetVector = torso.Position - target.Position
		local flatTorsoAngle = Vector3.new(torsoAngle.x, 0, torsoAngle.z)
		local flatTargetVector = Vector3.new(targetVector.x, 0, targetVector.z)
		drawVector(torso.Position - Vector3.new(0, 2.5, 0), flatTorsoAngle, flatTargetVector.magnitude, "torso")
		drawVector(target.Position, flatTargetVector.unit, flatTargetVector.magnitude, "target")

		local angle = math.deg(getAngle(-flatTorsoAngle, flatTargetVector))

		if angle < 40 then
			target.Parent:Destroy()
		end
	end)
end
1 Like

Maybe don’t start up the thread every task.wait(). Just remove the while loop

2 Likes

@SomeFedoraGuy is correct, you’re connecting a .RenderStepped every single frame which causes a memory leak.

Fixed code:

local player = game:GetService("Players").LocalPlayer
local character = player.Character or player.CharacterAdded:wait()
local torso = character:WaitForChild("Torso")
local target = workspace:WaitForChild("Silhouette").Torso
local vectors = {}

local function dotProduct(a, b)
	return a.x * b.x + a.y * b.y + a.z * b.z
end

local function getAngle(a, b)
	return math.acos(dotProduct(a, b) / (a.magnitude * b.magnitude))
end

local function drawVector(position, angle, magnitude, name)
	if vectors[name] then
		vectors[name]:Destroy()
	end

	local p = Instance.new("Part")
	p.Anchored = true
	p.Size = Vector3.new(0.1, 0.1, magnitude)
	p.CFrame = CFrame.new(position + angle * magnitude / 2, position + angle)
	p.Transparency = 1
	p.Massless = true
	p.CanCollide = false
	p.CanQuery = false
	p.Parent = workspace

	vectors[name] = p
end

game:GetService("RunService").RenderStepped:Connect(function(part)
	local torsoAngle = torso.CFrame.lookVector
	local targetVector = torso.Position - target.Position
	local flatTorsoAngle = Vector3.new(torsoAngle.x, 0, torsoAngle.z)
	local flatTargetVector = Vector3.new(targetVector.x, 0, targetVector.z)
	drawVector(torso.Position - Vector3.new(0, 2.5, 0), flatTorsoAngle, flatTargetVector.magnitude, "torso")
	drawVector(target.Position, flatTargetVector.unit, flatTargetVector.magnitude, "target")

	local angle = math.deg(getAngle(-flatTorsoAngle, flatTargetVector))

	if angle < 40 then
		target.Parent:Destroy()
	end
end)
2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.