Unity 实现一个内存紧凑,高效,兼容度高,支持序列化的Map

news2024/11/14 2:17:32

前言

从Es5 js源码里搬过来的,起初没想到这么好用,直到用Unity内的Dictionary<K,V> 序列化的时候频频报错,iOS上也总有些乱七八糟的问题,在多人帧同步的项目中,由于桶结构的无序处理 ( Unity内部的字典是桶结构实现的) 所以禁止使用
随后我又尝试将STL里的红黑树搬过来用,结果性能还不如双列表。。。。, 果真是大道至简,越简单的反倒约好用

源码

支持,增删改查,适配所有序列化,Json, Protobuf,在帧同步项目中也可以安心使用,因为它是数组实现的,你可以通过内置的Foreach去遍历它,他是有序遍历的


public class Es5Map<K, V> where K : IEquatable<K>
{

    private List<K> keys = new List<K>();
    private List<V> values = new List<V>();


    public void Set( K key, V value )
    {
        keys.Add( key );
        values.Add( value );
    }

    public V Get( K key )
    {
        int index = keys.IndexOf( key );
        if ( index < 0 ) return default( V );
        return values[ index ];
    }

    public bool Has( K key ) => keys.Contains( key );

    public void Del( K key )
    {
        int index = keys.IndexOf( key );
        if ( index < 0 ) return;
        values.RemoveAt( index );
        keys.RemoveAt( index );
    }

    public int Count => keys.Count;

    public List<K> Keys => keys;

    public List<V> Values => values;

    public void Foreach( Action<K, V> action )
    {
        for ( int i = 0; i < keys.Count; i++ )
        {
            action( keys[ i ], values[ i ] );
        }
    }

}

先说说它的优点哈

  • 空间效率:双列表结构通过将键和值分开存储,可以减少空间占用,尤其是当字典的键和值比较简单时。如果每个键值对都存储在一个元组或其他结构中,这可能会增加内存开销。

  • 简单性:双列表的实现比较简单,通常只需要两个列表,分别存储键和值。这种结构不依赖复杂的数据结构,便于理解和实现。

  • 快速查找:如果使用一个列表存储键,而另一个列表存储对应的值,可以通过索引直接访问值,查询操作的时间复杂度通常为O(n),与哈希表相比稍微慢一些,但对小规模数据集或特定场景可能足够高效。

  • 顺序访问:双列表可以保持插入的顺序,对于某些应用场景,按插入顺序访问键值对是有用的,而哈希表通常无法保证顺序(除非是有序哈希表)。

  • 避免哈希冲突:哈希表实现字典时,哈希冲突是一个需要处理的问题,而双列表没有哈希函数的概念,因此没有哈希冲突问题。

再谈谈的缺点

查找效率和扩展性方面,相对于哈希表,性能会有所下降。

最后是我给的几点建议哈

  • 如果是多人同步的项目,要求不能使用字典,那么我推荐使用这个方案
  • 如果你的项目中存储的数据中需要用到字典结构,我推荐你使用这个方案,传统的字典会有各种序列化的问题
  • 如果你的项目只是一个本地的,且比较轻量,本地存储又用不到任何字典相关的数据,那推荐你使用传统字典,它查询的方式Hash更有效率

当然有想法的同学可以自行扩展哈,源码就是这么简单,想法全靠搬哈~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2238431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL数据库的备份与还原

目录 mysql 数据库的备份 生成SQL脚本 1 在控制台使用mysqldump命令可以用来生成指定数据库的脚本 ​编辑2 在数据库图形化界面工具&#xff1a;DateGrip 中操作&#xff1a;导出 mysql 数据库的还原 执行SQL脚本 1 在控制台使用 命令&#xff0c;指定将sql脚本导入到指定…

使用 IDEA 创建 Java 项目(二)

IDEA 创建 Java 项目 一般创建 Java 项目可以创建一个空项目&#xff0c;然后在空项目中添加模块&#xff0c;在模块中编写包&#xff0c;包中包含 Java 类。 如果你的 JDK 没有被 IDEA 自动找到的话&#xff0c;可以手动选择 JDK。我们先来学习 Intellij 构建系统下的 Java …

图论算法:最短路径算法详解【c语言版】(无权最短路径、Dijkstra算法)

别忘了请点个赞收藏关注支持一下博主喵&#xff01;&#xff01;&#xff01; 图论算法&#xff1a;最短路径算法详解 在图论中&#xff0c;最短路径问题是寻找图中两点之间具有最小总权重的路径。这个问题在许多实际应用中都有重要的作用&#xff0c;比如网络路由、城市交通规…

vue通过iframe方式嵌套grafana图表

文章目录 前言一、iframe方式实现xxx.xxx.com拒绝连接登录不跳转Cookie 的SameSite问题解决不显示额外区域(kiosk1) 前言 我们的前端是vue实现的&#xff0c;监控图表是在grafana中的&#xff0c;需要在项目web页面直接显示grafana图表 一、iframe方式实现 xxx.xxx.com拒绝连…

苹果系统安装Homebrew时CLT缺失的问题

前言 为了使用brew命令&#xff0c;必须安装Homebrew工具。但是在Howebrew安装的时候&#xff0c;会出现CLT&#xff08;Command Line Tools&#xff09;缺失的问题。本博客就是讨论如何来解决这个问题的。 1、问题的出现 2、解决途径 在命令行终端中输入命令&#xff1a;xcod…

LeetCode Hot100 49.字母异位词分组

题干&#xff1a; 思路&#xff1a; 输入的是一个字符串数组&#xff0c;输出是一个列表&#xff0c;首先我们需要通过遍历数组获得每一个字符串&#xff0c;我们想要判断获得的任意两个字符串是不是字母异位词&#xff0c;所以可以将获得的字符串排序&#xff08;转换为字符数…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考&#xff1a;Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程&#xff08;建议收藏&#xff09;_androidstudio-CSDN博客 想下旧版本的android_studio的地址&#xff08;仅供参考&#xf…

游戏引擎中LOD渲染技术

一.LOD(Level Of Detail) 为了降低GPU渲染压力,根据摄像机距离模型距离将面数较高的模型替换为面数较低的模型. LOD LOD0(distance<10) LOD1(distance<20) LOD2(distance<30) 故通常引擎中MetaMesh是由一个或多个LOD模型构成. MetaMesh mesh mesh.lod1 mesh.lod…

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步&#xff0c;但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术&#xff0c;它改进了目前…

【人工智能训练师】3 集群搭建

开启集群环境 本次环境为单节点伪集群环境&#xff0c;环境中已经安装JDK1.8、Hadoop2.7.7、Mysql5.7、hive2.3.4。— 1.环境中已经安装/root/software/hadoop-2.7.7&#xff0c;格式化HDFS&#xff0c;开启集群&#xff0c;查看集群状态。&#xff08;HDFS端口为9000&#x…

使用 GPT-4V 全面评估泛化情绪识别 (GER)

概述 由于情绪在人机交互中扮演着重要角色&#xff0c;因此情绪识别备受研究人员关注。目前的情感识别研究主要集中在两个方面&#xff1a;一是识别刺激物引起的情感&#xff0c;并预测观众观看这些刺激物后的感受。另一个方面是分析图像和视频中的人类情绪。在本文中&#xf…

8.机器学习--决策树

(⊙﹏⊙)下周有要开组会&#xff0c;不知道该说啥&#xff0c;啊啊啊啊&#x1f62b; 目录 1.基本概念 2.ID3算法 3.C4.5算法 4.CART算法 5.连续与缺失值处理 5.1.连续值处理 5.2.缺失值处理 6.剪枝处理 6.1.预剪枝策略 6.2.后剪枝策略 7.实例代码 1.基本概念 提…

uniApp之uni-file-picker使用踩坑

标题党~也不算坑吧 就是初体验 上传是需要存储一下子的&#xff0c;我以为uniApp是自己免费开的服务给大家中转使用&#xff0c;就没管这个事&#xff0c;但是官网是这么说的&#xff1a; 就我是怎么发现的&#xff0c;使用了一段时间后&#xff0c;上传的图片都裂了&#xff…

22.04Ubuntu---ROS2使用rclcpp编写节点C++

节点需要存在于功能包当中&#xff0c;功能包需要存在于工作空间当中。 所以我们要想创建节点&#xff0c;就要先创建一个工作空间&#xff0c;再创建功能包。 第一步&#xff1a;创建工作空间 mkdir -p chapt2_ws/src/ 第二步&#xff1a;创建example_cpp功能包&#xff0c…

UIStackView使用进阶

01 技术背景 前端的布局方式比较灵活&#xff0c;提供有Flex的布局方式&#xff0c;可以实现不同方向的弹性布局。Flex就像一个容器&#xff0c;可以将其内部的子控件统一进行布局。其包含主轴方向和交叉轴方向&#xff0c;主轴方向表示控件的排布方向&#xff0c;交叉轴方向和…

AMD-OLMo:在 AMD Instinct MI250 GPU 上训练的新一代大型语言模型。

AMD-OLMo是一系列10亿参数语言模型&#xff0c;由AMD公司在AMD Instinct MI250 GPU上进行训练&#xff0c;AMD Instinct MI250 GPU是一个功能强大的图形处理器集群&#xff0c;它利用了OLMo这一公司开发的尖端语言模型。AMD 创建 OLMo 是为了突出其 Instinct GPU 在运行 “具有…

【HarmonyOS】Install Failed: error: failed to install bundle.code:9568289

【HarmonyOS】Install Failed: error: failed to install bundle.code:9568289 一、问题背景&#xff1a; Install Failed: error: failed to install bundle. code:9568289 error: install failed due to grant request permissions failed. View detailed instructions. 11/…

#渗透测试#SRC漏洞挖掘#CSRF漏洞的防御

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

C++builder中的人工智能(7)如何在C++中开发特别的AI激活函数?

在当今的AI开发中&#xff0c;人工智能模型正迅速增加。这些模型使用数学函数来执行和学习&#xff0c;以便在传播时优化最佳结果&#xff0c;或在反向传播时选择最佳解决方案。其中之一就是激活函数。也称为转移函数或阈值函数&#xff0c;它决定了神经元的激活值作为输出&…

ReactPress数据库表结构设计全面分析

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress是一个基于React框架开发的开源发布平台和内容管理系统&#xff08;CMS&#xff09;。它不仅支持用户在支持React和MySQL数据库的服务器上搭建自己的博客和网站&#…