博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
游戏中地图画法的优化
阅读量:4045 次
发布时间:2019-05-24

本文共 1142 字,大约阅读时间需要 3 分钟。

现在的游戏地图都做的比较大,这样一来我们就需要来优化地图的画法,来提高地图对内存的消耗和游戏速度。
现在通用的都是用一个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, 并且不需进行是否在屏幕内判断.

 

所以改进算法优势明显。特别是在三星系列的机型上。下次我们来继续优化地图。

转载地址:http://mbedi.baihongyu.com/

你可能感兴趣的文章
搞定Java面试中的数据结构问题
查看>>
慢慢欣赏linux make uImage流程
查看>>
linux内核学习(7)脱胎换骨解压缩的内核
查看>>
以太网基础知识
查看>>
慢慢欣赏linux 内核模块引用
查看>>
kprobe学习
查看>>
慢慢欣赏linux phy驱动初始化2
查看>>
慢慢欣赏linux CPU占用率学习
查看>>
2020年终总结
查看>>
Homebrew指令集
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
adb command not found
查看>>
Xcode 启动页面禁用和显示
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>