FiveM 脚本优化:减少 resmon,保持流畅 FPS
针对高 FPS 和低 resmon 优化 FiveM 脚本。使用循环、多线程、NUI、事件和顶级性能服务器使用的真实分析器技巧。
Agency Scripts
Agency Scripts 创始人兼首席开发者
理解Resmon和脚本性能
该 resmon FiveM 中的命令显示实时资源性能指标,展示每个脚本每个服务器刻消耗多少毫秒。一个优化良好的脚本大部分时间在 resmon 中应显示 0.00ms,仅在积极处理事件时短暂峰值。持续显示高 resmon 值的脚本会降低服务器性能,增加玩家不同步,并可能导致令人厌恶的服务器延迟,驱散社区。定期分析您的脚本是维护流畅服务器的第一步。
线程管理和等待时间
FiveM脚本中最大的性能杀手是不当的线程管理。使用 Citizen.Wait(0) 在循环内意味着代码每帧运行一次,约每秒60次。大多数任务不需要此频率。请增加等待时间至 Wait(500) 或 Wait(1000) 用于仅需定期运行的检查,如标记点的接近检测或区域检查。对于基于距离的系统,采用分层方法:远离兴趣点时检查间隔较长,靠近时检查间隔较短。
禁用不必要的线程
无需持续运行线程,考虑仅在需要时激活它们。使用事件或状态变化来启动和停止处理循环。例如,钓鱼脚本在玩家不靠近水域时无需运行投掷循环。跟踪活动状态变量并使用 return 功能未使用时。此模式可将脚本的常驻消耗从 0.50ms 降至 0.00ms,这决定了脚本是可扩展还是会拖垮服务器。
缓存和避免冗余调用
FiveM 中的 Native 函数调用有开销,尤其是在紧密循环中反复调用时。缓存类似调用的结果 GetEntityCoords, GetPlayerPed,和 GetPlayerServerId 在循环迭代开始时调用,而非在同一周期内多次调用。将静态数据如配置值、标记位置和地图标记坐标在脚本加载时存入局部变量。此简单技巧可显著减少脚本执行时间,是最有效的优化之一。
数学优化
距离计算是 FiveM 脚本中最常见的操作之一。替换标准 #(coords1 - coords2) 距离检查时使用平方距离比较,当你只需要相对距离。由于平方根计算开销大,比较平方距离与平方阈值可以达到相同效果且避免昂贵的数学运算。此外,避免调用 GetDistanceBetweenCoords native 当你可以在 Lua 中计算距离时使用,因为 native 调用相比纯 Lua 操作有额外开销。
实体与标记管理
创建实体、地图标记和标记点会产生渲染和网络开销。无需时应移除地图标记和实体,而非留在游戏世界中。使用 DrawMarker 仅当玩家处于渲染距离内,而非整个地图全局。对于管理大量实体的脚本,请实现空间分区以仅处理附近对象。考虑使用基于玩家接近度创建和销毁实体的流式系统,而不是资源启动时一次性加载所有内容。