'Roblox Item is lagging

I add a mesh to follow the player where ever he goes. But the mesh is lagging a bit when the player runs. I understand that it is not rendering quickly enough, but anyone know how to add a mesh without it lagging?

local humanoidRootPart = character:WaitForChild('HumanoidRootPart')
local backpackItemWorkspace = game.ReplicatedStorage.Meshes[pet.Name]:Clone()  
backpackItemWorkspace.Parent = game.Workspace.CurrentPets

RunService.Stepped:Connect(function()
    local location = humanoidRootPart.CFrame
    backpackItemWorkspace.CFrame = location * CFrame.new(2, 2, 3)
end)


Solution 1:[1]

Ok, for others struggling with having a pet(mesh) follow you smoothly and always stay on your back. I have now spent several hours on this subject and finally got it to work. This is how you do it:

local character = player.Character
local humanoidRootPart = character:WaitForChild('HumanoidRootPart')
    
//where you copy you pet from
local backpackItemWorkspace = game.ReplicatedStorage.Meshes[pet.Name]:Clone()

//where you keep your pets in the workspace  
backpackItemWorkspace.Parent = game.Workspace.CurrentPets

//call the function for attaching the pet
attachPet(backpackItemWorkspace, character, humanoidRootPart) 

function attachPet (pet, char, humanoidRootPart)
   local focusPart = humanoidRootPart
   local newPet = pet
   local z = -5
   local x = 1

   local bodyPos = Instance.new("BodyPosition")
   bodyPos.Parent = newPet
   bodyPos.MaxForce = Vector3.new(math.huge, math.huge, math.huge)

   local bodyGyro = Instance.new("BodyGyro")
   bodyGyro.Parent = newPet
   bodyGyro.MaxTorque = Vector3.new(math.huge, math.huge, math.huge)

   while wait() do
       bodyPos.Position = focusPart.Position + focusPart.CFrame.LookVector * z + focusPart.CFrame.RightVector * x
       bodyGyro.CFrame = focusPart.CFrame
   end
end

Also when you unequip a pet you have to Destroy it from where you store it. In my case I store them in a folder on the player which I call collectionInventory.

local collectionInventory = player:WaitForChild("CollectionInventory")
collectionInventory[petName]:Destroy()

Hope this save anybody else from wasting several hours with research. Even though you will probably learn a lot from those "wasted hours" ;)

Solution 2:[2]

Connect the mesh and rootpart using a weld, so you dont need to use RunService to move the mesh everytime.

local humanoidRootPart = character:WaitForChild('HumanoidRootPart')
local backpackItemWorkspace = game.ReplicatedStorage.Meshes[pet.Name]:Clone()  
backpackItemWorkspace.Parent = game.Workspace.CurrentPets

function attach(hroot, mesh)
  local weld = Instance.new("WeldConstraint", mesh)
  local location = hroot.CFrame
  mesh.CFrame = location + Vector3.new(2, 2, 3)
  weld.Part0 = hroot
  weld.Part1 = mesh
  return weld
end

attach(humanoidRootPart, backpackItemWorkspace)

-- please comment if it makes any errors

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 TommyF
Solution 2 chad andrew