关于如何使此代码高效的任何想法?

Any ideas on how to make this code efficient?

代码:


local RunService = game:GetService("RunService")
local Player = game.Players:GetPlayerFromCharacter(script.Parent)
local Character = Player.Character or Player.CharacterAdded:Wait()
local PartDimensions = Vector3.new(2048,512,2048)
local WaterPart = Instance.new("Part")
WaterPart.Size = PartDimensions
WaterPart.CFrame = CFrame.new(Character.HumanoidRootPart.Position.X,-2048,Character.HumanoidRootPart.Position.Z)
WaterPart.Material = Enum.Material.Foil
WaterPart.CanCollide = false
WaterPart.Parent = game.Workspace
WaterPart.Anchored = true
WaterPart.Transparency = 1
Character.Humanoid.Died:Connect(function()
    WaterPart:Destroy()
end)
RunService.Stepped:Connect(function(step)
    WaterPart.CFrame = CFrame.new(Character.HumanoidRootPart.Position.X,0,Character.HumanoidRootPart.Position.Z)
    workspace.Terrain:FillBlock(WaterPart.CFrame, WaterPart.Size, Enum.Material.Water)

我做了一个生成水的代码 我希望它能很好地工作 该代码几乎使服务器崩溃

在我们讨论效率之前,我们需要谈谈实际发生的工作。

当您生成地形时,您需要提供一个区域和一个地形类型,然后引擎会遍历该区域中的所有体素并替换地形。然后它必须重新生成 3D 网格以包含该区域。这些都是一开始就相当昂贵的操作。

我相信世界上每个体素大约是0.4 x 0.4 x 0.4 studs^3。因此,当您说要填充 2048 x 512 x 2048 studs^3 的区域时,您是在告诉引擎行进 33,554,432,000 voxels。每次引擎滴答时,你都会告诉引擎执行此操作。

因此,为了提高性能,您可以考虑一些事项:

1.每次滴答做更少的工作

考虑减小 WaterPart 的尺寸。该引擎足够强大,可以实时重新生成地形,但仅限于某一点。如果您减小要更改的区域的大小,引擎将有更少的体素来更新,并且引擎的每一步都会有更少的工作。

local PartDimensions = Vector3.new(20, 5, 20)

2。减少工作频率

正如我之前所说,引擎应该能够处理real-time地形变化,但您也可以降低地形更新的频率。 RunService.Stepped 在物理模拟开始之前的每个滴答声上触发,并提供自上次滴答声以来的时间参数。您可以使用它来限制地形实际更新的频率:

local timeSinceLastUpdate = 0.0 -- seconds
local UPDATE_FREQUENCY = 0.2 -- seconds
RunService.Stepped:Connect(function(step, deltaTime)
    -- limit updates to 5 times per second
    timeSinceLastUpdate += deltaTime
    if timeSinceLastUpdate >= UPDATE_FREQUENCY then
        -- reset the counter
        timeSinceLastUpdate = 0.0

        -- do the thing
        WaterPart.CFrame = ...
        workspace.Terrain:FillBlock(...)
    end
end)

3。提前做作业

你应该问问自己这项工作是否需要实时完成。虽然这不会立即提高性能,但您可以减少生成区域“pre-filling”所做的工作量。如果您知道玩家将在 (0, 0, 0) 生成,则在游戏开始时手动填充 (0, -2048, 0) 处的 (2048, 512, 2048) 区域,或者简单地烘焙它进入水平。然后,您可以将其与...

配对

4.只在需要时更新地形

您可以通过仅在需要时添加地形来限制地形生成的影响。考虑保存您已经添加的地形的尺寸,并且只在玩家接近边缘时添加更多地形。