我刚刚开始维护浏览器游戏并优化其代码。我可以看到一些函数运行超过一百次。我想过如何优化代码。
1-修改游戏编程的整个平台。 (它没有意义,因为它需要至少9个月的时间来修改它。也许可能会导致意外的错误而且我不想阻碍它。)
2-致力于缓存以提高效率。
我将使用第二种方式。为了更清楚,我在这里放了一个游戏功能。
function modifyResource($vid, $wood, $clay, $iron, $crop, $mode) {
if($wood<0)$wood=0;
if($clay<0)$clay=0;
if($iron<0)$iron=0;
//if($crop<0)$crop=0;
$q = "SELECT * from " . TB_PREFIX . "vdata where wref = $vid";
$result = $this->query($q,__FILE__,__LINE__);
$res=$this->mysql_fetch_all($result);
if($wood+$res[0]['wood']>$res[0]['maxstore'] && $mode)$wood=$res[0]['maxstore']-$res[0]['wood'];
if($clay+$res[0]['clay']>$res[0]['maxstore'] && $mode)$clay=$res[0]['maxstore']-$res[0]['clay'];
if($iron+$res[0]['iron']>$res[0]['maxstore'] && $mode)$iron=$res[0]['maxstore']-$res[0]['iron'];
if($crop+$res[0]['crop']>$res[0]['maxcrop'] && $mode)$crop=$res[0]['maxcrop']-$res[0]['crop'];
if($res[0]['wood']<$wood && !$mode)$wood=$res[0]['wood'];
if($res[0]['clay']<$clay && !$mode)$clay=$res[0]['clay'];
if($res[0]['iron']<$iron && !$mode)$iron=$res[0]['iron'];
if($res[0]['crop']<$crop && !$mode)$crop=$res[0]['crop'];
if(!$mode) {
$wood = -$wood;
$clay = -$clay;
$iron = -$iron;
$crop = -$crop;
}
$q = "UPDATE " . TB_PREFIX . "vdata set wood = wood + $wood, clay = clay + $clay, iron = iron + $iron, crop = crop + $crop where wref = $vid";
$r = $this->query($q,__FILE__,__LINE__);
if($r){
// $this->logging->addResourceLog($vid, $wood, $clay, $iron, $crop, $log);
}
return true;
}
如您所见,函数select vdata table以获取必要的信息,然后修改它,最后更新表。在此函数中运行两个查询。 vdata是一个真正的大表,例如在80,000行的情况下超过500MB。对于用户的每个请求,该函数运行88次。这意味着88个大表选择和更新。它需要花费很多硬件资源并且还会增加加载时间。
我想到了一个想法,在变量中存储选择查询然后更新它如果函数第一次运行。而对于其他时间只更新变量,直到数据库类被销毁,然后应用所有更改。这将导致保存2x87查询。
注意: 这个缓存在变量中只是持久直到用户请求完成。然后销毁所有存储(缓存)的数据。
这只是一个想法,我不知道它是如何运作的,或者如果我编码它会有用。或者是否有任何替代方式或任何具有相同功能的建议插件或类?
因此我的问题有三个部分:
1-这个想法会有用吗?
2-如果是的话!是否有任何类或插件我使用它或获得更多想法?
3-如果没有!你有什么建议来优化游戏?