- 注册时间
- 2004-12-25
- 最后登录
- 1970-1-1
|
这是我在编LavaX程序的一些经验(可能在高手眼里都不算什么).
这里说的完全是为了程序速度的优化,是给需要运行速度的人看的,如果你的程序对速度要求不高,那就不要用这些方法,因为这样降低了程序的可读性
1. 运算的优化(不要小看这些微不足道的东西,当你把它用在大量的循环中时差别就十分明显了)
代码能短则短,由于LavaX使用的是伪指令,所以每个运算指令的执行时间也差不了多少,所以最好多用结合律.
能用char型变量运算的地方就不要用int和long,因为所占的字节数不同,所以处理不同类型的变量就需要不同的时间,当然越少越好.
像if(var!=0);这样的表达式因该这样写if(var);,而if(var==0);应该写成if(!var);
在函数中若出现if+else,如:
void fun(){
if(){
[program]
}
else {
[program]
}
}
应该在if的[program]后面加return;,不然程序要goto到else后面才返回,在函数内如果有多次判断:
long fun(){
if(){
[program]
}
else if(){
[program]
}
else if(){
[program]
}
}
可以改成:
long fun(){
if(){
[program]
return ?;
}
if(){
[program]
return ?;
}
if(){
[program]
return ?;
}
}
减少额外的运算:
for(a=0;a<10;a++){
c[a]=a;
}
应该写成
for(a=0;a<10;){
c[a]=a++;
}
相同的表达式运算时应该使用赋值,如:
WriteBlock((a+b)*16+5,(c+d)*16,16,16,4,tile1);
WriteBlock((a+b)*16+5,(c+d)*16,16,16,3,tile2);
应该写成:
WriteBlock(e = (a+b)*16+5, f = (c+d)*16,16,16,4,tile1);
WriteBlock(e, f,16,16,3,tile2);
对于空循环,如果不是LavaX3.5(因为它已经对循环进行了优化),最好不要用for(;;)和while(1),由于内部结构的原因,那样比直接用goto慢了两倍以上!
数组的优化:
很多人在画背景图时这样写
//满屏贴16*16的图素
char tile[50][32];
char map[64][64];
char x,y,ox,oy;
for(ox=0;ox<10;ox++){
for(oy=0;oy<5;oy++){
WriteBlock(ox*16,oy*16,16,16,1,tile[map[x+ox][y+ox]]);
}
}
这是很简单的贴图方式,可以这样优化:
int temp;
temp=map+y*64+x;
for(ox=0;ox<160;ox=ox+16){
for(oy=0;oy<80;oy=oy+16){
WriteBlock(ox,oy,16,16,1,tile[*temp++]);
}
temp=temp+64;
}
这里优化了两个地方:
(1)将ox的增量改为16,这样就免去了ox*16,而且少了50次oy*16,取而代之的是10次oy=oy+16,虽然ox的运算的指令的数量没有变.
在运算上能加减则加减,尤其在递增关系上,不应该用递增的数乘别的数,应该用递增的数加要乘的数,+ - 要比* /来的快,因为* /需要移位运算(除非你有乘法表):
(2)使用的类似指针的方式,tile[map[x+ox][y+ox]]实际会编译成类似这样:
tile + ( (map + (x + ox) * 64 + y + oy)<--[取对应地址的值] ) * 32
表达式需要的运行一次的指令数量为15.
而tile[*temp++]会编译成类似这样:tile + (*temp++) * 32 指令数量为7,在这样的多层循环里优化效果就很明显,所以尽量在多循环中减少运算量.
2. if.else.的优化
对于这样的优化只在出现大串的if+else有效,使用的方法就是以前我发过的贴里的函数的特殊用法,在这里就不多说了.
不过if+else如果没超过10个就不要用这样的方法了.
3. 贴图的优化,这个方法可能很多人都用到了,不过还是说说吧
同样是上面的的贴图例子.这样贴每一贞都要50次循环,导致大量的运算,而这些运算的速度比WriteBlock的速度慢多了,50次这样的运算也够你文曲星受的.
在移动的时候屏幕大多数的地面只是作了平移,所以只要在每一贞画出新增加的图就ok:
先画一次全屏幕的图,然后将其保留,每移动一点的时候,只画多移动出来的一条然后将保留的图按偏移位置贴上去,这样速度不知道快了多少倍.
当然,要是用XDraw,就连保留都不需要,几乎可以实现完美的点移.
如果是在LavaX3.5的环境下,使用引用和指针更能很大的优化速度,尤其是对于结构和数组,具体方法就不用多说了吧. |
|