获得最近目标的最有效方法是什么

2024-01-12

从这两种方法中获得最接近目标的最有效且最便宜的方法是什么?

使用LINQ

GameObject FindClosestTarget(string trgt) 
{
    GameObject[] closestGameObject = GameObject.FindGameObjectsWithTag(trgt)
                      .OrderBy(go => Vector3.Distance(go.transform.position, transform.position)
                      .FirstOrDefault();
         return closestGameObject ;
}

or this

 GameObject FindClosestTarget(string trgt) 
     {
         GameObject[] gos= GameObject.FindGameObjectsWithTag(trgt);

         GameObject closest=null;
         float distance = Mathf.Infinity;
         Vector3 position = transform.position;
         foreach (GameObject go in gos) {
             Vector3 diff = go.transform.position - position;
             float curDistance = diff.sqrMagnitude;

             if (curDistance < distance) {
                 closest = go;
                 distance = curDistance;
             }
         }

         return closest;
     }

第一个示例使用Vector3.Distance这需要相当昂贵的Sqrt操作,而第二个使用我更喜欢使用更简单的 LINQ 形式的代码。

以下是 Unity 脚本 API 文档的摘录:sqrMagnitude http://docs.unity3d.com/ScriptReference/Vector3-sqrMagnitude.html:

矢量 v 的大小计算如下Mathf.Sqrt(Vector3.Dot(v, v))。但是,那Sqrt计算相当复杂,并且比普通算术运算需要更长的时间来执行。计算平方幅度而不是使用幅度属性要快得多 - 计算基本相同,只是没有慢Sqrt称呼。如果您只是使用幅度来比较距离,那么您也可以将幅度的平方与距离的平方进行比较,因为比较会给出相同的结果。

所以你的场景基本上就是他们创建的原因sqrMagnitude财产...因为Sqrt是一项昂贵的操作,如果您只想知道距离的顺序而不需要actual距离供以后使用。

我个人更喜欢将其作为第三种选择:

GameObject FindClosestTarget(string trgt)
{
    Vector3 position = transform.position;
    return GameObject.FindGameObjectsWithTag(trgt)
        .OrderBy(o => (o.transform.position - position).sqrMagnitude)
        .FirstOrDefault();
}

两全其美...LINQ 的简单性(并且实现非常高效),没有多余的东西Sqrt操作来减慢你的速度。

但与往常一样,当您对代码的实际性能有疑问时,您应该对每种方法进行仔细的分析,看看哪种方法实际上性能更好。有时,优化器会向您抛出一个曲线球,并将可怕的 C# 代码转换为非常有效的输出。

顺便说一句,如果您想将范围限制为特定的最大距离,请对该距离进行平方并将其与sqrMaginitude以避免邪恶Sqrt.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获得最近目标的最有效方法是什么 的相关文章

  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 以编程方式读取 SQL Server 查询计划建议的 SQL 特定执行的索引?

    如果我在 SSMS 中运行此命令 set showplan xml on GO exec some procedure arg1 arg2 arg3 GO set showplan xml off GO 我获得查询执行中涉及的完整调用堆栈的
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 类型约束

    我有以下类层次结构 class Header IEnumerable
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 使用 omp_set_num_threads() 将线程数设置为 2,但 omp_get_num_threads() 返回 1

    我有以下使用 OpenMP 的 C C 代码 int nProcessors omp get max threads if argv 4 NULL printf argv 4 s n argv 4 nProcessors atoi argv
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • 我可以覆盖 !important 吗? [复制]

    这个问题在这里已经有答案了 我正在尝试在元素上设置此 CSS background red important 但是当我尝试这样做时 background yellow 它仍然只显示红色而不是黄色 正如我希望的那样 我没有使用外部CSS 我
  • Elasticsearch 对多个索引进行评分

    我有一年中任何季度的索引 index 2015 1 index 2015 2 我的每个索引上都有大约 3000 万个文档 文档有一个文本字段 标题 我的文档排序方法是 1 score 2 创建日期 问题是 在所有索引 index 201 的
  • 压缩和解压缩文件和文件夹

    我需要使用 C C 压缩和解压缩 Windows Mobile 中的目录层次结构 什么是 最简单的库可用吗 我用谷歌搜索了很多次 我发现了一些东西 但我无法继续下去 如果您已经实施或者您了解一些相关内容 请告诉我 对于 NET SharpZ
  • 如何在 cypress.io 测试中可靠地等待页面空闲

    当使用 cypress io 测试 Angular 网页时 检测页面何时完全加载和空闲的最佳 最可靠方法是什么 不仅仅是 onload 事件 需要包括所有 XHR 请求 完成角度摘要循环以及完成所有渲染 包括完成所有动画 原因是 此时我想测
  • 如何使用“include”标签在 Django 中动态包含模板

    我有 10 个 html 文件 名称分别为 1 html 2 html etc 我想要的是根据一个变量 某个文件应该包含在模板中 e g if foo paid include foo customization foo id html e
  • 判断socket和fd之间的关系

    On unix 一切都是文件函数方法read write close Win32 不支持 我想模仿它 但不知道如何区分sock is socket or fd在 WinSocks2 上 returns 1 if sock is networ
  • 如何获取使用“array”邮件驱动程序发送的消息?

    从版本 5 7 开始 Laravel 建议使用array测试期间邮件驱动程序 很遗憾 文档 https laravel com docs 5 7 mail没有透露任何有关该驱动程序的信息 根据源代码 https github com lar
  • 如何在 Linq to SQL 中实现缓存?

    我们刚刚开始在 DAL 中使用 LINQ to SQL 而且我们还没有真正制定出缓存模型的标准 以前 我们使用了一个基 DAL 类 该类实现了所有 DAL 类继承的缓存管理器属性 但现在我们没有了 我想知道是否有人提出了一种 标准 方法来缓
  • Tensorflow 如何支持 Cuda 流?

    Tensorflow 是否自动利用 Cuda 流在单个 GPU 上并发执行计算图 还是应该将流手动分配给操作 张量 目前 TensorFlow 仅使用一个计算流和多个复制流 某些内核可能会选择使用多个流进行计算 同时保持单流语义 我们的实验
  • Sql Server中的大事务,有什么问题吗?

    我有一个程序 可以在一个事务中对 SQL Server 2005 或 2008 数据库执行许多批量操作 删除和创建索引 创建列 全表更新等 是否会出现任何问题 我知道即使在简单恢复模式下事务日志也会扩展 该程序在系统正常运行期间不会执行 因
  • 如何使用 PHPExcel 库中的打印就绪功能

    我正在使用 PHPExcel 库进行电子表格操作 我要应用打印就绪功能 有这个功能吗 如果您阅读了文档 https github com PHPOffice PHPExcel blob develop Documentation markd
  • 为什么我们需要 python 中的 dict.update() 方法而不是仅仅将值分配给相应的键?

    我一直在使用字典 我必须在代码的不同部分中修改它们 我试图确保我是否没有错过任何有关在任何情况下都不需要 dict update 的内容 因此 使用 update 方法的原因是向当前字典添加新的键值对 或者更新现有键值对的值 可是等等 难道
  • “UnsafePointer”无法转换为“UnsafePointer<_>”

    我正在做 TripleDES 加密和解密 出现此错误 UnsafePointer
  • WinForm运行后如何隐藏? [复制]

    这个问题在这里已经有答案了 可能的重复 启动时隐藏单一表单 https stackoverflow com questions 70272 single form hide on startup 我想在运行后隐藏我的 WinForm 不是最
  • table.columns 不是 datatable.js 中的函数

  • C++ 如何将年月日格式的日期转换为unix纪元格式?

    我需要将给定日期转换为包含自 1970 年 1 月 1 日以来的毫秒数的 int unix 纪元 我尝试了以下代码 tm lDate lDate tm sec 0 lDate tm min 0 lDate tm hour 0 lDate t
  • 如何更改TextView上的字体?

    如何更改a中的字体TextView 默认显示为 Arial 如何将其更改为Helvetica 首先 默认不是 Arial 默认为 Droid Sans 其次 要更改为不同的内置字体 请使用android typeface在布局 XML 中或
  • 如何从主题更改 CardView 背景颜色

    在具有多个主题的应用程序中 如何从样式文件更改 CardView 的背景颜色 样式 xml
  • 使用pip安装lxml失败

    这是我用来安装 lxml 的命令 sudo pip install lxml 我在清理阶段收到以下消息 Cleaning up Command usr bin python c import setuptools tokenize file
  • 获得最近目标的最有效方法是什么

    从这两种方法中获得最接近目标的最有效且最便宜的方法是什么 使用LINQ GameObject FindClosestTarget string trgt GameObject closestGameObject GameObject Fin