Unity3D游戏开发之C#编程中常见数据结构的比较

一.前言

Unity3D是如今最火爆的游戏开发引擎,它可以让我们能轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型的互动内容。它支持2D/3D游戏开发,据不完全统计,目前国内80%的手机游戏都是用Unity3D开发。

由于Unity3D在开发过程中使用最多的是C# 语言,所以就要合理的使用C#提供的一些数据结构是非常有必要的,合理的选择数据结构可以加快开发速度,提高游戏运行性能,不合理的使用数据结构则会导致游戏运行性能降低,加大开发复杂程度!

先通过表格看看常用的数据结构:


C#常用数据结构


中文名


Array


普通数组


ArrayList


数组集合


List<T>


泛型数组


LinkList<T>


泛型链表


Stack



Queue


队列


HashTable


哈希表


Dictionary<K,T>


字典

然后先大概了解这些数据结构的用法。

二.数据结构之间比较和部分使用案列

1.数组(Array)在一般的编程中较为常见,是最简单的数据结构之一,具有三个特点:数组存储的数据都是在连续的内存单元上,数组中的元素都是同一类型,数组可通过下标直接访问。缺点是数组是连续存储,在两个元素之间插入新的元素时很不方便,在创建数组时必须指定长度或初始化元素,就会面临溢出或内存浪费的问题。2.ArrayList就可以解决Array带来的一些缺点:无需指定大小或初始化元素。可以动态的插入数据元素,无需考虑溢出或浪费内存的事。ArrayList可以存储不同数据类型的原因是由于把所有类型都当作Object类型来处理,使用时很有可能会发生类型不匹配的问题,这也就说明ArrayList是类型不安全的数据结构,在频繁的进行读写(装箱拆箱)操作ArrayList的过程中会产生额外的开销,导致性能下降,所以在开发过程中使用ArrayList较少!

3.为了解决ArrayList不安全类型与装箱拆箱的缺点,List<T>作为一种新的数组类型引入,继承了ArrayList的一些优点,且确保了类型的安全,因无需进行装箱拆箱操作,因此List<T>是高性能的,所以List<T>在游戏开发过程中经常用到的数组类型。以下是List<T>的简单操作:

List<string>  Lstr=new List<string>();

Lstr.Add(“元素一”);   // 插入数据元素

Lstr[0]=“元素二”;     // 修改数据元素

Lstr.RemoveAt(0);       // 移除数据元素

在Unity3D游戏开发中,我们可以使用List<GameObject>来存储游戏对象,比如在射击游戏中的子弹,或角色扮演游戏中的NPC,都可以使用List<GameObject>进行存储。

4.LinkList<T>的特点是链中的每一个元素都指向下一个元素,这样救构成了一条链。在插入和删除某个数据元素时时间复杂度都为O(1)。

5.Stack(栈)的特点是先进后出。

6.Queue(队列)的特点是先进先出。

7.我通过游戏开发中的用法来介绍哈希表的使用和它的一些特点。在游戏开发过程中,我们通常会涉及到通过游戏角色的ID来正确匹配英雄角色,所以每个英雄角色都要有自己唯一的ID,每个英雄角色的ID和他们的角色名进行一一对应,那么,我们就可以使用哈希表进行存储这种数据,假设有如下信息:


序号


ID


角色名称


1


2059


亚瑟


2


“2060”


妲己


3


“ABC”


后羿


4


2061.5


宫本武藏

使用哈希表存储的代码如下:

Hashtable Hero = new Hashtable ();

// Hero.Add (key,value);

Hero.Add (2059,"亚瑟");        //插入第1个元素

Hero.Add (“2060”,"妲己");        //插入第2个元素

Hero.Add (“ABC”,"后羿");        //插入第3个元素

Hero.Add (2061.5,"宫本武藏");    //插入第4个元素

//  通过key访问value

if (Hero.ContainsKey (“2060”)) {

Debug.Log ("该队伍中包含妲己");

} else {

Debug.Log ("该队伍中不包含妲己");

}

通过以上的代码可以发现哈希表可以接收任意类型值作为key(key和value的类型都为object类型),其实这就体现出哈希表类型不安全。

8.为了解决哈希表类型不安全,我们可以使用Dictionary<K,T>来存储数据,可以将上面的代码改写成下面代码:

Dictionary<int ,string> Hero = new Dictionary<int, string> ();

// Hero.Add (int key,string value);

Hero.Add (2059,"亚瑟");        //插入第1个元素

Hero.Add (2060,"妲己");        //插入第2个元素

Hero.Add (2061,"后羿");        //插入第3个元素

Hero.Add (2062,"宫本武藏");    //插入第4个元素

//  通过 key(int)访问value(string)

if (Hero.ContainsKey (2061)) {

Debug.Log ("该队伍中包含后羿");

} else {

Debug.Log ("该队伍中不包含后羿");

}

对比哈希表,字典保证了类型的安全,但世界上并不存在十全十美的东西,代码也是如此,字典通过空间换时间,通过更多的内存开销来满足对速度的追求。在创建字典时,可以传入一个字典容量值,但在实际使用时并非该值,而是使用不小于该值的最小质数最为它的实际容量,所以字典容量的最小值是3。且当有了实际容量后,并非直接实现索引,而是通过创建了两个额外的Array数组来实现间接的索引。面临的情况就是,即便创建了一个空的字典,伴随而来的是两个长度为3的数组。所以当处理的数据不多时,慎重使用字典。

三.总结

在游戏开发过程中,很多情况下使用普通数组也是可以的,数据结构的选取需要考虑数据的大小和使用场景才能合理的存储和处理该数据。优秀的程序员需要考虑机器运行的性能,合理的选择一些数据结构可以提高程序运行性能和降低开发复杂度。

原文地址:https://www.cnblogs.com/spiderljx/p/10925992.html

时间: 2024-07-29 10:42:36

Unity3D游戏开发之C#编程中常见数据结构的比较的相关文章

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(中)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D游戏开发之Lua与游戏的不解之缘(下)

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

Unity3D游戏开发之Lua与游戏的不解之缘终结篇:UniLua热更新完全解读

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本文作者:

[Unity3D]Unity3D游戏开发之从Unity3D到Eclipse

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei. 转载请注明出处,本

[Unity3D]Unity3D游戏开发之ACT游戏三连击效果实现综述

各位朋友,大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.在研究了Unity3D Mecanim动画系统的重定向特性后,今天我们继续来探索Mecanim动画系统更多的特性吧.今天博主想和大家分享的是ACT游戏中的三连击效果的实现,由于Unity3D目前存在Animation和Animator两种类型的动画组件,因此本文将分别讲这两种类型的动画组件的三连击效果的实现,其中Animation组件是Unity3.5以下版本所使用的动画组件,An

Unity3D游戏开发之Unity3D动画与Mecanim动画系统

Unity3D游戏开发之Unity3D动画与Mecanim动画系统 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. Mecanim是Unity新增的动画系统,其功能强大而灵活,让人类和非人类角色栩栩如生.Mecanim的重定向极大的提供了工作效率,而且占用极少CPU周期.使用从Unity资源商店找到的动画资源,或

unity3D游戏开发之iTween介绍和用法

unity3D游戏开发之iTween介绍和用法 一.iTween 介绍 iTween是一个动画库,作者创建它的目的就是最小的投入实现最大的产出.让你做开发更轻松,用它可以轻松实现各种动画,晃动,旋转,移动,褪色,上色,控制音频等等 二.iTween 原理 iTween的核心是数值插值,简单说就是给iTween两个数值(开始值,结束值),它会自动生成一些中间值. 三.iTween 下载:  从官网http://itween.pixelplacement.com下载 主要文件有两个iTween.cs

Unity3D游戏开发之Unity打包APK

Unity3D游戏开发之Unity打包APK 1.安装JDK 2.配置JDK 3.在Paht的变量值后面加分号,把D:\android\adt-bundle-windows-x86-20131030\sdk\tools放在Path后面.[狗刨学习网] 4.点击菜单栏中的Edit-->Preferences 看Android SDK Location这个选项 浏览你的模拟器路径. 5.点击 File-Build Settings 然后再 点击Add Current 添加你的场景.再 点击Switc

Unity3D游戏开发之3DMAX 灯光

Unity3D游戏开发之3DMAX 灯光 欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一.3DMAX 五种光源 1.Ommi Light 泛光灯:可以从一点向四周均匀照射的点光源. 2.Target Spotlight 目标聚光灯:一种投射光束,影响光束内被照射的物体,可以投影 阴影,照射范围可以指定. 3.