0

我对 Lua 的介绍是通过使用 ESX v1.2 构建 FiveM 角色扮演服务器。代码中有许多效率低下的地方,我已经隔离了其中大部分导致服务器中的“服务器线程故障”,但有一件事我有点迷失了。

有一个“扩展播放器”对象,其中包含从各种数据库调用(通常称为 xPlayer)聚合的一堆 RP 特定信息。每个播放器都有一个服务器 ID,它是一个数字,还有一个名为 ESX.Players 的 lua 表,xPlayer 与哈希一起存储ESX.Players[source] = xPlayer

有一个功能:

ESX.GetPlayerFromId = function(source)
    return ESX.Players[tonumber(source)]
end

它通过哈希包装获取,这是我们发生大量服务器故障的地方。在调用代码时,我已经删除了所有处理逻辑,只保留了这个函数调用,并且故障仍然存在,并对其进行评论,问题就消失了。问题是为什么当哈希表中的东西已经是实例化的表并且没有接触任何 IO 或在此过程中做任何花哨的事情时,它只是从哈希表中提取导致滞后?它只是一个存储的实例。

对我来说最突出的一件事是 xPlayer 表上有很多值,然后是许多函数。Lua 表上这些函数的权重是否足以减慢返回对它的引用?该文件显示了扩展播放器表的创建和返回位置https://github.com/esx-framework/es_extended/blob/v1-final/server/classes/player.lua

我正在将所有这些函数推送到一个专用的实用程序表上,该表将存在一次,并且每个函数都需要一个 xPlayer 参数以由函数处理。在 100 多个 FiveM 资源中,有数千次调用返回到 xPlayer.() 调用,因此代码搅动和回归测试的权重是巨大的,因此目前代码库还没有处于发布到生产服务器以进行 40 次测试的状态+ 玩家正在敲它。谁能确认我是否走在正确的轨道上,是否解除 xPlayer 表的功能可能会在通过散列键获取时给我带来任何性能改进?如果是这样,为什么?

4

0 回答 0