首页>
技术资讯>
详情

游戏中舆图画法的优化

2016-05-25 来源:CloudBest 阅读量: 0
关键词:

    现在的游戏舆图都做的比拟大,这样一来我们就需要来优化舆图的画法,来提高舆图对内存的耗费和游戏速度。
    现在通用的都是用一个tile数组来表现舆图的。数组中每个值表现一个舆图块,一般大小为16*16。
    1.为了减少在屏幕中绘制舆图的数目,在绘制舆图时只绘制当前屏幕的部分。
    方法:通过限定循环判定的起始点,结束点,来束缚循环判定的总次数。
    以前的做法是
    for(int y=0;y<tile.length;y++)
    for(int x=0;x<tile[y].length;x++){
    if(in_screen(y,x)){
    draw tile[y][x];
    }
    }
    改良做法是只循环显示当前屏幕的部分:
    //全局变量
    int TILE_W; // 舆图块width;
    int TILE_H; // 舆图块height;
    int screen_y; // 屏幕的Y;
    int screen_x;// 屏幕的X;
    int sx1,sx2,sy1,sy2;
    sx1 = screen_x / TILE_W;   // 屏幕X在舆图的第几块上。
    if (sx1 < 0)
    sx1 = 0;
    sy1 = screen_y / TILE_H;  // 屏幕Y在舆图的第几块上。
    if (sy1 < 0)
    sy1 = 0;
    sx2 = (screen_x + screen_w) / TILE_W;     // 屏幕底边在舆图的第几块上。
    if ( (screen_x + screen_w) % TILE_W != 0)
    sx2 += 1;
    if (sx2 > tile_bottom[0].length)
    sx2 = tile_bottom[0].length;
    sy2 = (screen_y + screen_h) / TILE_H;     // 屏幕右边在舆图的第几块上。
    if ( (screen_y + screen_h) % TILE_H != 0)
    sy2 += 1;
    if (sy2 > tile_bottom.length)
    sy2 = tile_bottom.length;
    //循环的出发点屏幕X所在的舆图块,终点是屏幕右边所在的舆图块。
    for (int y = sy1; y < sy2; y++)
    for (int x = sx1; x < sx2; x++) {
    draw tile[y][x];
    }
    举例, 假如舆图大小为100x100, 单元尺寸为16x16, 屏幕为128x160
    则原画法,每次刷新屏幕的循环次数为10000, 其中每次均需进行是否在屏幕内判定,
    新画法,循环次数为80, 并且不需进行是否在屏幕内判定。
    所以改良算法上风明显。特别是在三星系列的机型上。

热门推荐 查看更多