|
楼主 |
发表于 2013-10-14 08:51:29
|
显示全部楼层
本帖最后由 FFUR2007SLX2_5 于 2013-10-14 09:11 编辑
120楼,武装突袭3 – 代码优化
好了,今天我就给前面的内容来个总结,希望大家不要前学后忘。在此篇中我将给大家列举一下代码优化的方法,哪些老代码改舍弃,那些新代码又有什么优势,闲言碎语不多说,上路!
进入到了代码优化的阶段,很荣幸的告诉大家现在你们已经从脚本编写者进化成程序员了,你们不仅能完成脚本编写者所有任务,而且从那些高度抽象的脚本中就可以看到这更像是一场秀,你们有极大的自信说出自己可以做得更好!现在请大家永远记住这几条,程序员与爱好者从字里行间中就可以看出区别!
1、 脚本中重复execVM同一个脚本是愚蠢的做法,必须把你的脚本写成函数汇编,这样能节省20倍的时间!
2、 如果你的函数或脚本超过了200行,那是一个愚蠢的做法,你必须重新考虑结构,否则你压根就没学会怎么去优化代码!
3、 在判断条件时如果条件很长必须使用惰性求值!
4、 你的代码必须整洁漂亮,就像你的人一样,谁喜欢邋遢的人?
5、 记住什么情况下再去用switch,如果你有一群判断却只需满足一个条件时,放弃switch转而调用if,因为这种情况下if调用的速度将更快!比如说:
private "_num2str";
_num = 0;
switch _num do {
case 0: {_num2str = "0"};
case 1: {_num2str = "1"};
case 2: {_num2str = "2"};
default {_num2str = "N/A"};
};
上面这个是愚蠢的做法,也许写了那么多年脚本你一直都这么做,但现在我告诉你这是错的。应该怎么做?看下面:
private "_num2str";
_num = 0;
call {
if (_num == 0) exitWith {_num2str = "0"};
if (_num == 1) exitWith {_num2str = "1"};
if (_num == 2) exitWith {_num2str = "2"};
_num2str = "N/A";
//Call if exitWith是这么用来提升速度的!
};
6、 脚本中涉及数字常量不会去定义而一贯的反复写入储存是愚蠢的做法,如果你喜欢这样:
a = _x + 1.053;
b = _y + 1.053;
或这样:
_buffer = 1.053;
a = _x + _buffer;
b = _y + _buffer;
为什么不这样?(记住,脚本开始前考虑好那些是你要用的常量!)
#define BUFFER 1.053
_a = _x + BUFFER;
_b = _y + BUFFER;
这样更快!
7、 还记得我在循环全解析(三)中排列出的速度排名吗?如果你想快点就用for和forEach,别用while, OnEachFrame和waitUntil。如果你想锁帧的话就别用for, while和forEach!
8、 你必须明白武装突袭3脚本运行速度上限是多少?0.3ms!什么意思?就是一个普通的sqf循环在游戏中的循环速度是每0.3ms一次!我在循环篇(三)中讲过解除引擎循环上限的做法,这里再总结一下:
所有触发器不受限!
所有预初始代码不受限!
FSM条件判断不受限!
Event handlers不受限!
从sqs中调取的sqf不受限!
9、 避免成方运算!
{
{ ...} foreach [0,0,0];
} foreach [0,0,0];
这样做会降低你的CPU运行速度!
10、 如果你给数组的尾部添加新值时依旧使用+是愚蠢的行为,set将更快,某些时候甚至resize,我在数组篇中已有详解。
_a = _a + [_v] // 这是愚蠢的
ARRAYX = ARRAYX - [objnull];// 这是愚蠢的
ARRAYX set [0, objnull];// 这是明智的
_a set [count _a,_v] // 这是明智的
11、 如果你在脚本中想要刷兵,还在使用:
_jeep = "Jeep" createVehicle (position player);
那真是愚蠢至极,这么做让你和菜鸟玩家没有区别,你必须用:
_veh = createVehicle ["ah1w", position player, [], 0, "FLY"]
这么做比原来的句法快上500倍!
12、 如果你到现在还在用getpos?那你就想原始森林里古代人。getPosASL/getPosATL/Position的速度比getpos快上2倍!
13、 找附近的活人时还在用nearestObjects是愚蠢的,nearEntities更快!
14、 如果你不准备用特殊私用变量_forEachIndex!记住count永远比forEach快!
{diag_log _x} count [1,2,3,4,5,6,7,8,9];
//is faster than
{diag_log _x} forEach [1,2,3,4,5,6,7,8,9];
同样:
_someoneIsNear = {_x distance [0,0,0] < 1000} count allUnits > 0;
//is still faster than
_someoneIsNear = {
if (_x distance [0,0,0] < 1000) exitWith {true};
false
} forEach allUnits;
15、 如果同样的函数你有两套写法,勿必使用bis_fnc_codePerformance挑选出你认为速度更快的那个!
高级的脚本编写者必须牢记这15条,这也将成为中级到高级进阶的分水岭!记住,不要让你的脚本看起来很愚蠢!或许你认为高级教程到此结束了,恰恰相反,接下来的将会是一场饕餮盛宴!武装突袭3——fsm全教程!
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?加入VME
x
|