最近在我正在开发的游戏中,当我将服务器迁移到新的更新或如果玩家在离开后立即重新加入时,
ProfileStore:LoadProfileAsync()
大约需要一分钟的负载。在所有其他情况下它基本上立即加载。这种情况直到最近才开始发生,我不确定我做了什么导致了这种情况,因为我最近没有添加任何要保存/加载的新数据。
由于我非常不熟悉 ProfileService 的工作原理,我想知道加载时间过长的原因是什么以及如何修复它。
local Players = game:GetService("Players")
local serverScriptService = game:GetService("ServerScriptService")
local Template = require(serverScriptService.PlayerData.Template)
local ProfileService = require(serverScriptService.Modules.ProfileService)
local ProfileStore = ProfileService.GetProfileStore("Test", Template)
local function PlayerAdded(player: Player)
print("TEST1")
local profile = ProfileStore:LoadProfileAsync("Player_"..player.UserId)
print("TEST2")
-- Cut out a lot of code that I don't think is relevant
end
Players.PlayerAdded:Connect(PlayerAdded)
第一个打印在玩家加入后立即触发,而第二个打印直到我上面提到的情况一分钟后才会触发。
Players.PlayerRemoving:Connect(function(player)
local profile = Manager.Profiles[player]
if not profile then return end
profile:Release()
end)
game:BindToClose(function()
for _, profile in Manager.Profiles do
profile:Release()
end
end)
我确实有这些功能来处理玩家离开或服务器关闭时释放配置文件的问题。
好吧,我找到了一种可以修复加载时间的方法。我让我的数据脚本创建一个
BoolValue
并将其作为每个玩家加入时的父级,称为 hasLoaded
。我在配置文件加载后将其设置为 true,并停止其他脚本执行任何操作,直到 hasLoaded == true
。
local function PlayerAdded(player: Player)
local hasLoaded = Instance.new("BoolValue")
hasLoaded.Name = "hasLoaded"
hasLoaded.Value = false
hasLoaded.Parent = player
local profile = ProfileStore:LoadProfileAsync("Player_"..player.UserId.."_Save5")
hasLoaded.Value = true
-- Unrelated code
end
这是我管理所有客户端脚本的脚本:
local player = game.Players.LocalPlayer
local hasLoaded = player:WaitForChild("hasLoaded")
while hasLoaded.Value == false do
task.wait(1)
end
-- Variables for my scripts and calls to their start functions
这样做之后,加载时间基本上又是瞬时的了。我不确定为什么这会如此大幅度地减少加载时间,但确实如此!