用字节数组存放二维地图数据
一 二维地图数据内容
在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表示出生点
- 等等根据需要来扩充
当然有人说我要采用对象的形式来存放,这也是可以的,但是存储对象就大太多了,一般情况是没有这个必要的。关于这点,也不在这篇文章的讨论范围。(曾经和同事关于使用数值和对象争论过,事实上,都有道理,完全可以根据实际情况选择使用,或者两者都使用)
二 地图数据的存放方式
- 一般采用数组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;
}
- 用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
体积比例不变,大毫秒数变化了。因为具体要怎么选择使用,就得看实际情况和需要了。
用字节数组存放二维地图数据相关推荐
- NumPy一维数组、二维数组与Pandas的Series、DataFrame行列结构和横纵方向的统一说明
最近在这个问题上耽误了一些时间,原因是之前个人理解上出了一些偏差,又受到错误文章的误导,把这个问题搞复杂了,现在统一梳理一下.在展开之前,先明确说明的是:NumPy的二维数组与Pandas的DataF ...
- android 一维数组遍历,$.each()循环遍历一维数组、二维数组、JSON数据和DOM元素
本文介绍$.each()循环遍历一维数组.二维数组.JSON数据和DOM元素. 请注意在使用JQuery $.each()方法前,要首先引用jquery库文件. $.each()循环遍历一维数组 Jq ...
- 【EasyExcel】Java读取一维及二维Excel数据并存入数组
EasyExcel是一个基于Java的.快速.简洁.解决大文件内存溢出的Excel处理工具.它能让你在不用考虑性能.内存的等因素的情况下,快速完成Excel的读.写等功能. Java基于EasyExc ...
- java 稀疏数组和二维数组转换,并保存稀疏数组到文件后可以读取
稀疏数组和二维数组转换 稀疏数组:当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组 稀疏数组的处理方法: 记录数组一共有多少行,有多少个不同的值 把具有不同值得元素的行 ...
- 稀疏数组(二维数组)
1.2.1 稀疏数组(二维数组) 一.应用场景 应用场景:当一个数组中大部分数据为同一个值时. 应用方法:1.记录数组中,一共有几行几列,有多少个不一样的值. 2.把有不一样值的行.列记录到一个小 ...
- C语言学习笔记09-数组、字符数组、字符串数组、二维数组(单字符输入输出putchar、getchar,字符串输入输出的scanf、gets、puts)
C语言数组 数组作用:可以用来保存很多记录(可以看成一种大容器).一些简单游戏也基本由数组实现,如游戏地图(二维数组)等等. 一个数组 划分 多个单元(下标区分) -存放-> 多个同类元 ...
- 【java基础】——一维数组和二维数组存储占用内存大小问题
问题:在java中,一维数组和二维数组在数据量一样的情况下,开辟的内存大小是怎样的? 一.尝试阶段: 1.代码一: public class OneArrayMemory{public static ...
- c语言bool怎么用_C语言中的一维数组和二维数组什么?怎么用?
C++| 匠心之作 从0到1入门学编程[免费]yun.itheima.com C语言除了基本数据类型之外,还提供了构造类型的数据,构造类型的数据包括数组类型.结构体类型和共用体类型.下面我们详细介绍 ...
- 【蓝桥杯Java_C组·从零开始卷】第四节、一维数组与二维数组
整篇文章为对java数组的完整理解以及部分排序,并有一些简单的demo,经典的案例与蓝桥杯的一些经典数组题有专门的文章梳理. 目录 数组概述 什么是数组 数组的结构 数组的特点: 数组分类 一维数组声 ...
最新文章
- jquery 图片裁剪 java_[Java教程]5 款最新的 jQuery 图片裁剪插件
- 《预训练周刊》第13期:CPM-2:大规模经济高效的预训练语言模型、变换器作为编程语言...
- 演示:GLBP跟踪功能、权值、与不同的负载均衡方式
- 用户月活跃度在哪里可以查_2020年12月计算机等级考试报名时间,另外11月6号可以查9月考试成绩...
- SpringMVC中@RequestHeader
- 记录一次linux病毒清除过程
- 7.过渡案例:①进度条 ②小米图标翻转(父盒子一定要加初始值!!!)
- vue中防止用户频繁点击按钮
- 深圳:由“独角兽”们构建起的硬核科技之城
- 莫队算法(最小曼哈顿生成树或者分块处理)
- srs源码分析2-浅析state_threads
- okhttp3调用接口超时
- 微信开发者平台应用创建
- 【做题笔记】P2327 [SCOI2005]扫雷
- 腾讯 地图 机器学习岗 春招实习123面(猝)
- MySQL:账户管理
- MASK在图像处理中的意义
- delphi生成一个随机序列号
- 数据库系统工程师教程学习记录2
- navicat for mysql 模型_Navicat for MySQL 功能简介