我正在Lua为iOS和OSX开发一个roguelike。对Lua来说很陌生,并且让我感到沮丧的是非随机 math.random 在我的平台上。我已经设置了通过函数设置随机数的调用:
function rollD(max)
return math.random(max)
end
所以我找到了一个很棒的答案来回应this post,结果我认为这将解决我的问题(这对于roguelike来说非常关键,每次游戏都不同)但是为了做出以下调整的功能:
function rollD(max)
return srandom(seedobj,1,max)
end
工作,我不得不做:
local seedobj = { seed = -232343 }
来自Donati的Knuth改编的不再是本地的,然后实际修改它使用(os.time()* - 1)。到目前为止,这实际上是完美的,而且我的(非常简陋的)roguelike就像我想要的那样卷起随机的坏人和地下城。但是当事情正常时我担心......
对 srandom (每个级别可能超过一千个电话)的大量调用,我将通过 seedobj 全球化来获得某种性能打击?我想这一点,因为它嵌套在表中,那个种子是一个参考,我不用担心。但除此之外:有没有办法我可以修改这个功能,这样我可以更有效地调用它?
答案 0 :(得分:2)
在Lua中访问全局变量就像访问表字段一样。如果seedobj
是全局的,则使用以下代码:
function rollD(max)
return srandom(seedobj,1,max)
end
Lua 5.2中的相当于:
function rollD(max)
return srandom(_ENV.seedobj,1,max)
end
或在Lua 5.1中(大致)等同于
function rollD(max)
return srandom(_G.seedobj,1,max)
end
其中_ENV
是保存当前环境表的变量,_G
是保存全局表的变量。
因此,每当您调用rollD
时,与局部变量相比,您对该间接访问会产生较小的性能损失。一般而言,这种惩罚很重要或取决于您致电rollD
时执行的其他操作的复杂程度。
在您的特定情况下,惩罚不太可能引人注意,因为srandom
实现已经执行了更密集的计算(其中一些表访问也是如此)。