[Unity]ColdKD树 冷处理解决含有删除操作的最近邻问题

news2025/4/25 4:39:23

在 Unity 开发中,最近邻问题是一个常见的需求场景。例如,在游戏中的寻路系统、物体之间的交互检测、资源分配等场景中,都需要快速准确地找到某个点或物体的最近邻。然而,传统的暴力遍历方法在处理这类问题时,往往会暴露出严重的性能瓶颈,而 KD 树作为一种高效的数据结构,能够显著优化最近邻问题的求解效率。

开发的需求场景:
需要在一个静态的地图中,寻找最近的对象,然后删除它,接下来寻找下一个最近的对象。

KD 树的基本原理

KD 树是一种二叉树结构,它通过递归地将数据空间划分为两个子空间,从而实现对数据点的有序组织。参考视频
《游戏中的空间划分》四叉树、KD树如何优化游戏性能

KD Tree 的缺陷

在需要频繁插入或删除数据点的场景中,KD树的维护成本较高。每次插入或删除操作都可能需要重新调整树的结构,以保持其平衡性。这种操作不仅耗时,还可能导致内存占用增加。
SO在Cold KD Tree中,需要被忽略的节点会被标记为Deleted,进行一种冷处理。

示例仓库

GitHub

核心代码


private int nearest(Vector3 point, Point p, int depth)
    {
        if (p == null)
            return -1;

        int best = -1;
        if (!p.deleted)
        {
            best = p.mid; // 当前节点有效时,初始化最佳候选
        }

        int axis = p.axis;
        // 计算分割距离
        float distToSplit = point[axis] - points[p.mid][axis];

        // 优先搜索更近的分支
        Point firstChild = distToSplit < 0 ? p.smaller : p.larger;
        Point secondChild = distToSplit < 0 ? p.larger : p.smaller;

        // 递归搜索第一子树
        int candidate = nearest(point, firstChild, depth + 1);
        best = closer(point, best, candidate);

        // 检查是否需要搜索第二子树
        float bestDist = sqDist(point, best);
        if (secondChild != null && (best == -1 || Mathf.Abs(distToSplit) < Mathf.Sqrt(bestDist)))
        {
            candidate = nearest(point, secondChild, depth + 1);
            best = closer(point, best, candidate);
        }

        return best;
    }

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

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

相关文章

快速生成安卓证书并打包生成安卓apk(保姆教程)

一.生成安卓证书 目前市面上生成可以快速生成安卓证书的网站有很多个人推荐香蕉云编以下是网站链接 香蕉云编-app打包上架工具类平台 1.进入网站如下图 2.点击生成签名证书 3.点击立即创建证书 4.点击创建安卓证书 5.按照指引完成创建 6.点击下载就可使用 二.打包安卓apk …

mysql mvvc 实现方案

Mysql 事务隔离级别 并发问题 mysql中事务并发时&#xff0c;会产生的问题如下 脏读: 读到了其他事务中&#xff0c;暂未提交的数据 脏读 (Dirty Read) 是数据库事务隔离级别中最低的一种隔离级别 (READ UNCOMMITTED) 下可能出现的一种并发问题。 它指的是一个事务读取了另…

校园外卖服务系统的设计与实现(代码+数据库+LW)

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;外卖信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

纷析云:开源财务管理软件的创新与价值

在企业数字化转型中&#xff0c;纷析云作为一款优秀的开源财务管理软件&#xff0c;正为企业财务管理带来新变革&#xff0c;以下是其核心要点。 一、产品概述与技术架构 纷析云采用微服务架构&#xff0c;功能组件高内聚低耦合&#xff0c;可灵活扩展和定制。前端基于现代框…

Centos安装Dockers+Postgresql13+Postgis3.1

centos8安装docker步骤 1、# 强制卸载 podman 和 buildah 执行命令&#xff1a; yum erase podman buildah 2、# 添加阿里云仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3、# 安装基础依赖包 yum install…

【计算机网络 | 第二篇】常见的通信协议(一)

HTTP和HTTPS有什么区别&#xff1f; 端口号&#xff1a;HTTP默认是80端口&#xff0c;HTTPS默认是443。 URL前缀&#xff1a;HTTPHTTP 的 URL 前缀是 http://&#xff0c;HTTPS 的 URL 前缀是 https://。 安全性和资源消耗&#xff1a;HTTP协议运行在TCP上&#xff0c;都是明…

单片机——使用printf调试

配置printf()输出函数 1、来自于<stdio.h> 2、运行C语言时&#xff0c;输出到终端 3、单片机没有终端&#xff0c;需要使用串口&#xff0c;将要输出的内容传到电脑&#xff08;串口调试助手&#xff09;上 例子如下 #include <stdio.h> #include &qu…

4.23晚间工作总结

主要工作&#xff1a;将ClassicDetail界面拆分成utils,apis,stores,css,vue多个文件&#xff0c;方便后续重用 具体代码截图&#xff1a;

JavaEE学习笔记(第二课)

1、好用的AI代码工具cursor 2、Java框架&#xff1a;Spring(高级框架)、Servelt、Struts、EJB 3、Spring有两层含义&#xff1a; ①Spring Framework&#xff08;原始框架&#xff09; ②Spring家族 4、Spring Boot(为了使Spring简化) 5、创建Spring Boot 项目 ① ② ③…

约束constraint

创建表时&#xff0c;可以给表的字段添加约束&#xff0c;可以保证数据的完整性、有效性。比如大家上网注册用户时常见的&#xff1a;用户名不能为空。对不起&#xff0c;用户名已存在。等提示信息。 约束通常包括&#xff1a; 非空约束&#xff1a;not null检查约束&#xf…

解锁现代生活健康密码,开启养生新方式

在科技飞速发展的当下&#xff0c;我们享受着便捷生活&#xff0c;却也面临诸多健康隐患。想要维持良好状态&#xff0c;不妨从这些细节入手&#xff0c;解锁科学养生之道。​ 肠道是人体重要的消化器官&#xff0c;也是最大的免疫器官&#xff0c;养护肠道至关重要。日常可多…

在kali中安装AntSword(蚁剑)

步骤一、下载压缩包 源码&#xff1a;https://github.com/AntSwordProject/antSword&#xff0c;下载压缩包。 加载器&#xff1a;https://github.com/AntSwordProject/AntSword-Loader&#xff0c;根据系统选择压缩包&#xff08;kali选择AntSword-Loader-v4.0.3-linux-x64&…

GateWay与Consul知识点

这是一个涵盖客户端访问、网关处理、服务注册发现、业务服务及鉴权授权的系统架构图&#xff0c;各部分解析如下&#xff1a; 客户端层 App 端、Web 端&#xff1a;代表不同类型的客户端&#xff0c;涵盖手机 App、电脑 Web 页面等。用户通过这些客户端发起请求&#xff0c;访…

安宝特科技 | Vuzix Z100智能眼镜+AugmentOS:重新定义AI可穿戴设备的未来——从操作系统到硬件生态,如何掀起无感智能革命?

一、AugmentOS&#xff1a;AI可穿戴的“操作系统革命” 2025年2月3日&#xff0c;Vuzix与AI人机交互团队Mentra联合推出的AugmentOS&#xff0c;被业内视为智能眼镜领域的“iOS时刻”。这款全球首个专为智能眼镜设计的通用操作系统&#xff0c;通过三大突破重新定义了AI可穿戴…

LeetCode每日一题4.20

781.森林中的兔子 问题 问题分析 根据题目描述&#xff0c;我们需要解决的问题是&#xff1a;给定一个数组 answers&#xff0c;其中每个元素表示某只兔子回答的“还有多少只兔子与你颜色相同”&#xff0c;要求返回森林中兔子的最少数目。 思路 理解 answers 数组&#xf…

Leetcode - 周赛446

目录 一、3522. 执行指令后的得分二、3523. 非递减数组的最大长度三、3524. 求出数组的 X 值 I四、3525. 求出数组的 X 值 II 一、3522. 执行指令后的得分 题目链接 本题就是一道模拟题&#xff0c;代码如下&#xff1a; class Solution {public long calculateScore(String…

时序数据库 TDengine 助力石油石化业务, 平滑接替 Oracle 数据库

小T导读&#xff1a;胜软科技在石油石化行业中选择使用 TDengine 处理时序数据&#xff0c;不仅显著降低了运维数据库的成本&#xff0c;也大幅减少了存储空间的占用&#xff0c;实现了从原有的 40 多套 Oracle 数据库向仅 9 套 TDengine集群的精简替换。在迁移过程中&#xff…

macOS 系统设置息屏情况下,PHP等后台脚本继续执行

在 macOS 系统下&#xff0c;当屏幕息屏或合上盖子时&#xff0c;后台脚本程序是否会继续运行&#xff0c;主要取决于以下几个因素&#xff1a; 1. 系统睡眠状态的影响 默认情况&#xff1a;合盖/息屏后&#xff0c;Mac 会进入「睡眠模式」&#xff08;部分硬件休眠&#xff…

Prompt-Tuning 提示词微调

1. Hard Prompt 定义&#xff1a; Hard prompt 是一种更为具体和明确的提示&#xff0c;要求模型按照给定的信息生成精确的结果&#xff0c;通常用于需要模型提供准确答案的任务. 原理&#xff1a; Prompt Tuning原理如下图所示&#xff1a;冻结主模型全部参数&#xff0c;在…

asp.net core webapi+efcore

简洁的restfull风格 目前c#提供了多种风格的web编程&#xff0c;因为微软有自己的前端&#xff0c;所以集成了很多内容&#xff0c;不过基于现在编程前后端分离的模式&#xff0c;webapi是合适的。 webapi 目前网络上有很多介绍&#xff0c;不反复说这个了。在建立控制器时&…