尽管每次网到鱼的不过是一个网眼,但要想捕到鱼,就必须要编织一张网……
首页 arrow 开发技术 arrow 程序设计 arrow 游戏中地图画法的优化

游戏中地图画法的优化 输出PDF 打印 E-mail
Author Author: 一滴蔚蓝色 | Date Date: 2008-05-10 | View Count View: 496 | section & Category 开发技术 -  程序设计
现在的游戏地图都做的比较大,这样一来我们就需要来优化地图的画法,来提高地图对内存的消耗和游戏速度。
现在通用的都是用一个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, 并且不需进行是否在屏幕内判断.
所以改进算法优势明显。特别是在三星系列的机型上。

“精簡了”的卡馬克

收藏到您的网摘: Google书签 Yahoo书签 雅虎收藏夹 365Key网摘 新浪ViVi 百度收藏 天极网摘 diglog 和讯网摘 POCO网摘 YouNote网摘 博拉网 天下图摘 spurl blogmarks BlinkList reddit digg Del.icio.us

本文关键字本文关键字: 游戏  地图  画法  优化  

阅读数: 497 | 打印 | E-mail

  我要评论
RSS评论

发表评论

姓名:
E-mail
您的网站/主页
标题:
评论:

验证码:* Code
若有人评论本文,请E-mail通知我。

(J2me手机游戏回合RPG游戏基本构架) < 上一篇   下一篇 > (优化后的图片插值算法)