游戏优化之空间划分

news2024/11/23 11:38:52

使用的动机

定义:将对象根据它们的位置存储在数据结构中,来高效地定位对象。

在游戏中,AI向最近的敌人攻击是很常见的,但如果有很多单位的话,他们AI需要频繁的查找单位,然后在检测是不是距离最近的单位,时间复杂度是o(n ^ 2)

之所以会出现这个问题,是因为我们没有指明潜在的对象顺序。假如我们游戏的所有单位都只在一条直线上,我们只需要二分查找就可以找到最近对象了。操作系统中,有着局部性原理,我们也可以根据游戏物体的位置来存储对象,这样就能更快的找到他们

注意事项:

空间分区的存在是为了将O(n)或者O(n²) 的操作降到更加可控的数量级。 你拥有的对象越多,这就越重要。相反的,如果n足够小,也许不需要担心这个

这不仅能够用于存储可移动的游戏对象,还可用于静态美术等场景资源。如果对象发生移动,我们需要在数据结构中重新追踪该对象,这也会增加CPU消耗。

实现方法

实现模式有很多种,都有各自的性能优势

固定网格

将整个游戏战场分割为固定大小的网格中,每个格子分别存储一组单位,对象在网格中的存储方式应该是双向链表,因为他增删结点比较迅速

在这里插入图片描述

在单位移动需要改变位置时,我们需要先判断是否穿越了格子的边界,如果穿越,我们需要先移除再添加到网格中

对于近距离攻击来说,只运算网格中的单位相互攻击是没啥大问题的。但是对于其他的攻击方式形成了新的问题,比如有一个远距离攻击的法师单位或者是能够冲锋的骑兵单位,就不能只判断单一网格。

在这里插入图片描述

这时候我们不仅需要比较同一网格,还需要比较邻近网格对象

空间划分依据

层次和平面划分

层次划分:

在这里插入图片描述

层次空间划分将空间分成几个区域。 然后,如果其中一个区域还包含多个对象,再划分它。 这个过程递归进行,直到每个区域都有少于最大数量的对象在其中。

  • 处理空区域时更有效率,大片的空区域在单个划分上,不需要遍历很多个空的小空间
  • 处理密集空间时也更有效率,当对象都聚集在一起时,每个网格仍然只有少量单位。

平面划分:

内存使用量确定,因为划分不会有增删,分区的内存使用量固定

在对象改变位置时更新得更快,层次更新则需要多层级调整,甚至改变层次划分

是否与对象有关

与对象有关:

固定划分中,移动单位意味着只需要从网格中删除,在加入到另一个网格中就可以了,但不是固定划分的话就需要改变边界,对象可以增量添加。 添加对象意味着找到正确的划分然后放入,这点可以一次性完成,没有任何性能问题。

与对象无关:

在BSP和KD树中这样各地适应对象划分世界,可以让每个部分都包含接近数目的对象,划分边界时需要考虑每一边各有多少对象。

在这里插入图片描述

Oct-Tree:八叉树,对于三维空间中的一个场景将其横竖切三刀,切成八块,在二维空间表现为四叉。。

KD-Tree:k-d树每次只会选取一个基轴方向进行分割,比如二维空间中先沿x方向分割,然后再沿y轴方向分割。

BSP-Tree:也是每次划分选择一个方向将空间分成两部分,与KD-Tree相比它不是横平竖直的划分,不好计算

其中八叉树可以拥有两者的优点:对象能够批量增加马,移动对象很快,分区是平衡的

存储是否唯一

空间划分还有一个值得注意的问题,空间分区是否是游戏对象存储的唯一地方

**如果唯一:**这能够减少内存消耗

**如果不是:**如果我们需要用除了位置关系外其他的方式来访问对象,比如特定种类的兵种,有了其他的数据保存结构我们能够更快的访问

总结

每种空间分区数据结构基本上都是将一维数据结构扩展成更高维度的数据结构。

  • 网格是连续的桶排序
  • BSPs,k-d trees和包围盒是线性搜索树
  • 四叉树和八叉树是多叉树

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

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

相关文章

Git工具使用全解

Git工具使用全解 文章目录Git工具使用全解1.企业开发中的版本控制器2.Git工具的使用场景3.Git工具操作流程(三板斧操作)4.Git工具的安装与常用命令4.1 Git的安装4.2 Git基本操作指令5.Git工具常见问题解决5.1 常见问题:分支冲突解决办法5.2 常见问题:合并…

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包第三方库的使用静态库的使用动态库的使用在系统层面上的动态链接理解何为动静态库 静态库(.a):在程序编译链接时将静态库二进制码拷贝到程序代码中,程序运行时不再需要外部的静态库…

面试:类相关---Java、Android有哪些类加载器

Android类加载器与Java类加载器的对比 - 掘金 Android | 类加载器与插件化 - 简书 相关复习: 面试:热修复原理_沙漠一只雕得儿得儿的博客-CSDN博客_android 热修复原理面试 面试:类的初始化过程_沙漠一只雕得儿得儿的博客-CSDN博客 什么…

内置 230+ 工具,它值得被官方纳入标准库

经过了几十年的发展,Python 的轮子生态越来越丰富,例如针对网络请求有 requests,针对命令行开发有 typer 等等,这些第三方库给我们的日常开发带来了极大的便利。 今天我推荐另一个第三方库 – Boltons,和大多数第三方…

go语言之不必要的拷贝

其实我也是个golang开发者~~ Go语言本来就以轻量快速著称,一位GitHub员工却偶然发现: 只改变一个字符的位置,能把一段代码运行速度提高足足42%。 简直就像是…… 这个简单有效的技巧一经发布,就引来众多程序员围观。 原作者自己…

论文中常见的拟合散点验证图(R语言版)

论文中常见的拟合散点验证图(R语言版) 如上图所示,是论文中常见的validation图,python也能实现相似的图绘。 今天先介绍R语言版,python改期再介绍吧 这张图需要依次实现下列功能: data实测与data模拟的散…

RabbitMQ系列【11】延迟队列

有道无术,术尚可求,有术无道,止于术。 文章目录前言1. 过期消息实现延迟队列2. 过期队列实现延迟队列3. 插件实现延迟队列3.1 安装插件3.2 代码实现3.3 测试前言 延迟队列:即消息进入队列后不会立即被消费,只有到达指…

MySQL事务隔离机制 -- 必须说透

文章目录前言一、什么是数据库事务二、事务并发带来的4类问题三、事务4种隔离级别四、Mysql演示4种隔离级别总结前言 如何控制并发是数据库领域中非常重要的问题之一,MySQL为了解决并发带来的问题,设计了事务隔离机制、锁机制、MVCC机制,用一…

c# 实验七 图像列表框及树形视图控件的使用

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:《项目专栏》 📧如果文章知识点有错误的地方&#xf…

[附源码]java毕业设计四六级考试管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

m基于matlab的wcdma软切换算法的研究分析和仿真

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 软切换是WCDMA系统的关键技术之一,软切换算法和相关参数的设置直接影响着系统的容量和服务质量。通过WCDMA系统的软切换技术可以提高小区覆盖率和系统容量。所以软切换技术是…

【ASM】字节码操作 工具类与常用类 LocalVariablesSorter 类 简单介绍与使用

文章目录 1.概述2. LocalVariablesSorter#2.1 class info2.2 fields3.案例3.1 编码实现3.2 编码实现v21.概述 在上一节:【ASM】字节码操作 工具类与常用类 GeneratorAdapter 介绍 我们知道了对于GeneratorAdapter 类来说,它非常重要的一个特点:将一些visitXxx()方法封装成一…

Java面向对象详解(上)

Java面向对象详解(上)🪅面向对象与面向过程的区分✨面向过程:✨面向对象:🪅类是什么?🪅对象是什么?🪅类的结构🪅类中方法:✨成员方法与…

实战讲解SpringBoot启动时自动加载数据库数据到内存:通过回调方法自动运行Bean(图+文+源码)

1 缘起 在补充SpringCloud网关(Gateway)配置白名单相关知识过程中, 有两种实现方案: (1)SpringBoot的启动配置文件application.yml进行配置; (2)自动加载MySQL数据库中的…

【人工智能】Mindspore框架中保存加载模型

前言 MindSpore着重提升易用性并降低AI开发者的开发门槛,MindSpore原生适应每个场景包括端、边缘和云,并能够在按需协同的基础上,通过实现AI算法即代码,使开发态变得更加友好,显著减少模型开发时间,降低模…

深度学习在图像处理中的应用学习笔记

这篇学习笔记用于记录本人在读研期间的学习内容 在刚入学不久,发现一个B站up主对这方面进行了一系列的整理总结,并上传了代码,并且非常成体系,因此本人打算跟着这位up主的步骤,对这方面进行学习并且做一个记录&#xf…

Vue安装并使用axios发送请求

前言 本文主要介绍的是使用在Vue项目中安装并使用axios发送请求 axios介绍 axios是一种Web数据交互方式 它是一个基于promise的网络请求库,作用于node.js和浏览器中,它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中) 本质是对原生XHRX…

NAND Flash原理

Flash 简介 Flash全名叫做Flash Memory,属于非易失性存储设备(Non-volatile Memory Device),与此相对应的是易失性存储设备(Volatile Memory Device)。关于什么是非易失性/易失性,从名字中就可以看出,非易失性就是不容易丢失&…

BGP→→

BGP-4 提供了一套新的机制以支持无类域间路由。这些机制包括支持网络前缀的通告、取消 BGP 网络中 “ 类 ” 的概念。 BGP-4 也引入机制支持路由聚合,包括 AS 路径的集合。 特点 BGP属于外部或域间路由协议。BGP的主要目标是为处于不同AS中的路由器之间进行路由信…

Spring Cloud Config 配置中心

最简单的配置中心,就是启动一个服务作为服务方,之后各个需要获取配置的服务作为客户端来这个服务方获取配置。 Spring Cloud Config,可以用 git ,还可以用数据库、svn、本地文件等作为存储。 1. Config Server 引入 config-ser…