假设一个情形,可能比较好讲:
我们假设开发一个链游,其中有一种道具(就叫矿石吧),具备“保质期”和“储能量”两个要素。矿石可以开采,但全网的总“储能量”是一定的。
矿石过了“保质期”,自动作废。
所以,一个矿工想开采矿石,首先需要判断:所有在“保质期”内的矿石的总储能量,有没有达到总储能量的红线。如果没有,才能采矿。
我们把每个矿石写成一个结构体,并定义一个“全网总储能量”的全局变量,假设1e18:
struct stone { uint effective;//有效期 uint energy;//储能 }
uint public energyLimit = 1e18;
并且把每一块被开采出来的矿石,列成一个数组,方便查询:
stone[] public stones;
接下来,我们要实现“采矿石”这个方法了,如前所述,我们要先判断目前在“保质期”内的所有矿石,他们的总储能有没有超过全网总储能的红线:
function mining() public {
uint totalEnergy = 0; //先定义“目前总储能” for(uint i = 0; i < stones.length; i++){ //遍历全局,判断哪些矿石在有效期,把他们各自的储能加起来 if(now <= stones[i].time){ totalEnergy += stones[i].energy; } } //然后判断“目前总储能”是否低于全网总储能上限 require(totalEnergy < energyLimit); //满足上述条件后,执行后面的语句 //.... }
那么问题就来了:
如果参与游戏的人很多,全网存在很多矿石,stone被实例化了成千上万次。 那么以上方法里那个for循环,需要遍历的对象库就会极度庞大,会不会导致程序执行极慢,甚至什么奇怪的东西溢出呢?
有什么更优良的解决办法吗?