Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Is there a way to make parts instance faster?

Asked by 5 years ago

I was working on terrain generation when a problem appeared: The parts generate really slow. I tried Instancing MeshParts and other types of parts but it still ran slow. Then i tried the real time CSG and it seems to reduce the lag but not improve the speed.

Here is the code where i used csg:

local Octaves = 12
local Lacun = 2
local Gain = 0.25
local partstab
function fBm(x, y, z, octaves,lacunarity,gain)
    local amplitude = 1
    local frequency = 1.5
    local sum = 0
    for i = 1,octaves do
        local xf = 1 * x / frequency
        local yf = 1 * y / frequency
        local zf = 1 * z / frequency
        sum = sum + amplitude * math.noise(x * frequency, y * frequency, z * frequency)
        amplitude = amplitude * gain;
        frequency = frequency * lacunarity;
    end
    return sum
end 
local mapScale = 300
local mapHeight = 200
local waterLvl = 10
math.randomseed(tick())
local mapScale = 250
local mapHeight = math.random(10 , 200)
local waterLvl = math.random(10 , 20)
local seed = math.random(1,10e6)
local smoothness = math.random(10 , 60)
    for x = 1, mapScale do
        for z = 1, mapScale do
            partstab = {}
            for _,v in pairs(workspace.Parts:GetChildren()) do
            table.insert(partstab , v)
            end
            if workspace.Parts:FindFirstChild("Part") then
            local newunion = workspace.Parts.Part:UnionAsync(partstab)
            newunion.Parent = workspace
            for _,ae in pairs(partstab) do
                ae:Destroy()
            end
            end
            local height = fBm(x/smoothness, z/smoothness, seed , Octaves , Lacun , Gain) --Find out the height 
            for y = 1, (height*mapHeight)+10 do
                local density = fBm(x/smoothness, y/smoothness, z/smoothness, Octaves , Lacun , Gain) --Find out the density
                if y > waterLvl then
                    if density* -5 >= 0 then
                        --workspace.Terrain:FillBall(Vector3.new(x * 2,y * 2,z * 2) , 5 , "Grass")
                        local p = Instance.new("Part", workspace.Parts)
                        p.Anchored = true
                        p.Size = Vector3.new(10,10,10)
                        p.CFrame = CFrame.new(x * 10,y * 10,z * 10)
                        p.Color = Color3.fromRGB(0, 100 , 0)
                    end
                else
                --workspace.Terrain:FillBall(Vector3.new(x * 2,y * 2,z * 2) , 5 , "Grass")
                local p = Instance.new("Part", workspace.Parts)
                p.Anchored = true
                p.Size = Vector3.new(10,10,10)
                p.CFrame = CFrame.new(x * 10,y * 10,z * 10)
                p.Color = Color3.fromRGB(0, 100 , 0)
            end
        end
    end
wait()end

Now i dont know. Games like Minecraft or terraria generate the ground in 5 seconds(Even though terraria is 2d i dont think it would generate terrain much slower). I understand that those games were made from nothing and not game developing platform but is this an issue for roblox?

0
Have you thought about spawning each instantiation? BenSBk 781 — 5y
0
? TOP_SECRE 28 — 5y
0
You can prevent lag even further by setting properties of a part before parenting it to the workspace.Parts. The second parameter of Instance.new is deprecated anyway. User#21908 42 — 5y
View all comments (4 more)
0
For that very reason User#21908 42 — 5y
0
always parent an instance after setting all of its properties User#21908 42 — 5y
0
Ok it became faster but is there a way to make something similar to the "for" loop in a spawn or hearbeat? TOP_SECRE 28 — 5y

Answer this question