关于如何使此代码高效的任何想法?
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.只在需要时更新地形
您可以通过仅在需要时添加地形来限制地形生成的影响。考虑保存您已经添加的地形的尺寸,并且只在玩家接近边缘时添加更多地形。
代码:
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.只在需要时更新地形
您可以通过仅在需要时添加地形来限制地形生成的影响。考虑保存您已经添加的地形的尺寸,并且只在玩家接近边缘时添加更多地形。