一 二维地图数据内容

在RPG的大地图中,我们往往会分割成很多小块(逻辑上),用于玩家行走,比如使用A星寻路等等,就需要的二维地图数据。一般情况,存放的是数值,主要是指每个格子里的数值,这里的数值是指我们赋予他的需要表示的内容。例如:

0,0,0,0,1,1,0,0,1,1,1,0,0,0,2,0,1,1,2
  • 0表示为可行走区域
  • 1表示不可行走
  • 2表示可飞行
  • 3表示传送点
  • 4表示出生点
  • 等等根据需要来扩充

当然有人说我要采用对象的形式来存放,这也是可以的,但是存储对象就大太多了,一般情况是没有这个必要的。关于这点,也不在这篇文章的讨论范围。(曾经和同事关于使用数值和对象争论过,事实上,都有道理,完全可以根据实际情况选择使用,或者两者都使用)

二 地图数据的存放方式

  1. 一般采用数组Array或者Vector来进行存放
array[0][1]或者 vector[0][1]

那么读取数值的时候也是直接传入相应的二维坐标即可。

/*** 返回指定的点是否可行走* @param row 行* @param col 列* @return 是否可行走*/
public function isWalk(row:int,col:int):Boolean
{//实际这里还需要做边界检测return array[col][row] == 0;
}
  1. 用ByteArray存储

之所以需要采用ByteArray,是因为AS3没有byte这个数值类型。最小数值是int或者uint,占用4个字节,而使用ByteArray可以直接使用1个字节。

由于ByteArray是一维的,所以整个二维地图的数值是写成一个ByteArray里。那么获取的时候,则需要使用 列 * 行 + 行的方式来获取。有两个方式读取,
一个是采用readByte

byteMap.position = col *  rowMax + col;
byteMap.readByte();

另外是采用[]的方式

byteMap[col *  rowMax + col]

完整的判断一个点是否可走的方法:

/** 最大行数 **/
private var rowMax:int;
/*** 返回指定的点是否可行走* @param row 行* @param col 列* @return 是否可行走*/
public function isWalk(row:int,col:int):Boolean
{return byteMap[col *  rowMax + col] == 0;//byteMap.position = col *  rowMax + col;//return byteMap.readByte() == 0;
}

三 测试例子

接下来是一个简单的测试例子,主要是测试存放对象和读取的速度。
最终的结果证明是两个的读取速度几乎是一样的。但是带却相差4倍。(4个字节肯定是1个字节的4倍了:)

row = 600;
col = 400;

是比较中间的数值了,一般情况下,一个格子可以是30 * 30像素或者30 * 60像之类的。所以一般 10000 * 8000像素的场景,纵和列也就是几百的数值。

占用字节的计算方式:

//行 * 纵 * 4个字节 / 1024 = 字节
row * col * 4 / 1024
600 * 400 * 4 / 1024 = 937.5 KB
/*** 用ByteArray存放二维地图数据* @author sodaChen*/
public class ByteArrayMapTest extends Sprite
{/** 字节数值集合 **/private var byteMap:ByteArray = new ByteArray();/** 二维数组 **/private var maps:Vector.<Vector.<int>> = new Vector.<Vector.<int>>();/** 行数 **/private var row:int = 600;/** 列数 **/private var col:int = 400;public function ByteArrayMapTest(){//初始化地图信息//列for (var i:int = 0; i < col; i++){var vec:Vector.<int> = new Vector.<int>();maps.push(vec);//纵for (var j:int = 0; j < row; j++){var value:int = RandomUtils.randomInt(0,1);byteMap.writeByte(value);vec.push(value);}}//测试读取性能var count:int = 0;var t:Number = getTimer();for (var k:int = 0; k < col; k++){for (var i2:int = 0; i2 < row; i2++){count += maps[k][i2];}}trace("Vector" + count + "耗时:"  + (getTimer() - t));count = 0;t = getTimer();for (var i3:int = 0; i3 < col; i3++){for (var i4:int = 0; i4 < row; i4++){count += byteMap[i3 *  row + i4];
//              byteMap.position = i3 *  row + i4;
//              count += byteMap.readByte();}}trace("byteMap" + count + "耗时:"  + (getTimer() - t));//计算体积大小var bytes:ByteArray = new ByteArray();bytes.writeObject(maps);trace("数组大小:" + bytes.length / 1024 + "KB");trace("字节:" + byteMap.length / 1024 + "KB");}
}

最终输出结果是:

Vector120139耗时:15
byteMap120139耗时:15
数组大小:939.0673828125KB
字节:234.375KB

当然,那个毫秒数有时会变化的,但是相差不大。不过如果加大数值,比如都超过1000,ByteArray的性能会差一点。比如设置成

/** 行数 **/
private var row:int = 1600;
/** 列数 **/
private var col:int = 1400;

输出结果是:

Vector1120119耗时:143
byteMap1120119耗时:146
数组大小:8755.4736328125KB
字节:2187.5KB

体积比例不变,大毫秒数变化了。因为具体要怎么选择使用,就得看实际情况和需要了。

用字节数组存放二维地图数据相关推荐

  1. NumPy一维数组、二维数组与Pandas的Series、DataFrame行列结构和横纵方向的统一说明

    最近在这个问题上耽误了一些时间,原因是之前个人理解上出了一些偏差,又受到错误文章的误导,把这个问题搞复杂了,现在统一梳理一下.在展开之前,先明确说明的是:NumPy的二维数组与Pandas的DataF ...

  2. android 一维数组遍历,$.each()循环遍历一维数组、二维数组、JSON数据和DOM元素

    本文介绍$.each()循环遍历一维数组.二维数组.JSON数据和DOM元素. 请注意在使用JQuery $.each()方法前,要首先引用jquery库文件. $.each()循环遍历一维数组 Jq ...

  3. 【EasyExcel】Java读取一维及二维Excel数据并存入数组

    EasyExcel是一个基于Java的.快速.简洁.解决大文件内存溢出的Excel处理工具.它能让你在不用考虑性能.内存的等因素的情况下,快速完成Excel的读.写等功能. Java基于EasyExc ...

  4. java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取

    稀疏数组和二维数组转换 稀疏数组:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组 稀疏数组的处理方法: 记录数组一共有多少行,有多少个不同的值 把具有不同值得元素的行 ...

  5. 稀疏数组(二维数组)

    1.2.1 稀疏数组(二维数组) 一.应用场景 应用场景:当一个数组中大部分数据为同一个值时. 应用方法:1.记录数组中,一共有几行几列,有多少个不一样的值. ​ 2.把有不一样值的行.列记录到一个小 ...

  6. C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)

    C语言数组   数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等.   一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...

  7. 【java基础】——一维数组和二维数组存储占用内存大小问题

    问题:在java中,一维数组和二维数组在数据量一样的情况下,开辟的内存大小是怎样的? 一.尝试阶段: 1.代码一: public class OneArrayMemory{public static ...

  8. c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?

    C++| 匠心之作 从0到1入门学编程[免费]​yun.itheima.com C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型.结构体类型和共用体类型.下面我们详细介绍 ...

  9. 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组

    整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...

最新文章

  1. jquery 图片裁剪 java_[Java教程]5 款最新的 jQuery 图片裁剪插件
  2. 《预训练周刊》第13期:CPM-2:大规模经济高效的预训练语言模型、变换器作为编程语言...
  3. 演示:GLBP跟踪功能、权值、与不同的负载均衡方式
  4. 用户月活跃度在哪里可以查_2020年12月计算机等级考试报名时间,另外11月6号可以查9月考试成绩...
  5. SpringMVC中@RequestHeader
  6. 记录一次linux病毒清除过程
  7. 7.过渡案例:①进度条 ②小米图标翻转(父盒子一定要加初始值!!!)
  8. vue中防止用户频繁点击按钮
  9. 深圳:由“独角兽”们构建起的硬核科技之城
  10. 莫队算法(最小曼哈顿生成树或者分块处理)
  11. srs源码分析2-浅析state_threads
  12. okhttp3调用接口超时
  13. 微信开发者平台应用创建
  14. 【做题笔记】P2327 [SCOI2005]扫雷
  15. 腾讯 地图 机器学习岗 春招实习123面(猝)
  16. MySQL:账户管理
  17. MASK在图像处理中的意义
  18. delphi生成一个随机序列号
  19. 数据库系统工程师教程学习记录2
  20. navicat for mysql 模型_Navicat for MySQL 功能简介

热门文章

  1. 计算机存储单位 t后面的单位,字节后面的存储单位是什么
  2. Excel功能及实现
  3. CSO是什么?这家年增长48%的企业级软件公司告诉你
  4. 使用vuepress-reco主题创建博客
  5. 另类数据:投资中的怪咖
  6. android 微信 耗电吗,微信太耗电了怎么办?微信耗电的两种解决方案
  7. vivo怎么切换为Android,vivox60pro如何切换系统 一键切换手机不通系统方法
  8. 2019-08-01软件工程总结
  9. 酸奶糖酸比的计算机控制,PAL-BX丨ACID F5 五种水果糖酸度计
  10. 涂涂乐的详细实现之一--画笔核心功能