lua*_*uac 3 math optimization performance lua
我在游戏中有一个脚本,每秒都会调用一个函数.在那里每秒计算玩家对象和其他游戏对象之间的距离.问题是在1秒钟内可以有理论上800个函数调用(最多40个玩家*2个主要对象(1个最多10个子对象)).我必须优化此功能以减少处理.这是我目前的职能:
local square = math.sqrt;
local getDistance = function(a, b)
local x, y, z = a.x-b.x, a.y-b.y, a.z-b.z;
return square(x*x+y*y+z*z);
end;
-- for example followed by: for i = 800, 1 do getDistance(posA, posB); end
Run Code Online (Sandbox Code Playgroud)
我发现,math.sqrt函数的本地化通过
local square = math.sqrt;
Run Code Online (Sandbox Code Playgroud)
关于速度和代码是一个很大的优化
x*x+y*y+z*z
Run Code Online (Sandbox Code Playgroud)
比这段代码快:
x^2+y^2+z^2
Run Code Online (Sandbox Code Playgroud)
我不知道x,y和z的本地化是否比使用类方法"更好".两次,所以也许square(a.x*b.x+a.y*b.y+a.z*b.z)
比代码更好local x, y, z = a.x-b.x, a.y-b.y, a.z-b.z;
square(x*x+y*y+z*z);
数学中有更好的方法来计算向量长度,还是Lua中有更多的性能提示?
您应该阅读Roberto Ierusalimschy的Lua Performance Tips(Roberto是Lua的首席架构师).它涉及您要询问的一些小优化(例如本地化库函数和用其多重等价替换指数).最重要的是,它传达了工程中最重要和最被忽视的一个想法:有时候最好的解决方案就是改变你的问题.您不会通过减少计算所需的CPU周期数来修复3000万计算泄漏.
在你的距离计算的特定情况下,你会发现最好让你的原始计算返回代表平方距离的中间和,并允许用例只在他们需要时调用最后的毕达哥拉斯步骤,而他们通常不这样做(例如,您不需要执行平方根来比较两个平方长度中的哪一个更长).
这确实应该来优化的任何讨论之前,虽然:不要担心不是问题的问题.而不是为了解决任何可能出现的问题而直接搜索代码,而是直接去修复最大的代码 - 如果性能超过了缺失的功能,错误和/或用户体验缺点,那么对于最明显的问题来说,微观低效率几乎不可能堆积起来到了超出单个瓶颈声明的程度.
或者,正如所引用文章的开头所述:
在Lua中,与任何其他编程语言一样,我们应该始终遵循程序优化的两个格言:
规则#1: 不要这样做.
规则#2: 不要这样做.(仅限专家)