海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构,相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics,又使用Jobs版RVO2实现了10w人同屏避障移动。

万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS

 

那么有没有高性能的物理方案呢?当然。万人同屏方案中我们使用RVO接管了移动,使用Jobs批量将RVO坐标同步到BRG中渲染,成功实现了数万人同屏。同样的,数万物理刚体只需要一个jobs版物理引擎,把物理引擎的计算结果(坐标、旋转)同步到BRG渲染,就同样能做到数万物理刚体同屏。

Unity Entities(ECS)方案提供了两套基于jobs的高性能物理引擎,Unity Physics和Havok Physics,其中Havok Physics想必开发者都有所耳闻,据网上消息,现象级游戏《塞尔达-王国之泪》逆天的物理效果就是基于Havok Physics做的修改。

先把物理引擎跑起来看看效果吧:

先下载官方案例:https://github.com/Unity-Technologies/EntityComponentSystemSamples/tree/master/PhysicsSamples

 1. 先制作一个模型prefab,并添加Physics Shape(碰撞体)、Physics Body(刚体)以及ECS特有的Authoring脚本, PhysicsRenderEntity,用于把此刚体prefab转换为Entity。

 2. 添加PhysicsStep脚本(物理引擎)

 Simulation Type:可以一键切换物理引擎,同时安装com.havok.physics和com.unity.physics两个物理引擎后就可以在这里切换,选择使用哪套引擎。

MultiThreaded:多线程计算一定要勾选。

 3. 写一个JobSystem脚本,一直创建物理单位,以测试两套物理引擎的性能:

代码很简单,就不做解释了,直接上代码:

限制刚体上限为2w.

using Unity.Entities;
using Unity.Mathematics;
using Unity.Physics.GraphicsIntegration;
using Unity.Transforms;public partial class SpawnEntitiesSystem : SystemBase
{static float m_Timer;public static int Count { get; private set; }protected override void OnCreate(){base.OnCreate();Count = 0;}protected override void OnUpdate(){var ecbSingleton = SystemAPI.GetSingleton<BeginSimulationEntityCommandBufferSystem.Singleton>();var ecb = ecbSingleton.CreateCommandBuffer(this.World.Unmanaged);if ((m_Timer += SystemAPI.Time.DeltaTime) > 0.2f){m_Timer = 0;foreach (var data in SystemAPI.Query<PhysicsRenderEntity>()){for (int i = 0; i < 30; i++){var spawnPoint = new float3(0, 100 + i, 0);var entity = ecb.Instantiate(data.Entity);ecb.SetComponent(entity, LocalTransform.FromPosition(spawnPoint));}Count += 30;break;}if (Count > 20000){this.Enabled = false;}}}
}

4. 在文本上实时显示物理单位数量:

using UnityEngine;
using UnityEngine.UI;public class DisplayCount : MonoBehaviour
{[SerializeField] Text m_Text;// Update is called once per framevoid Update(){m_Text.text = SpawnEntitiesSystem.Count.ToString();}
}
性能测试:

测试环境比较恶劣,古董机。i5 十代 + 1050Ti, 越恶劣的环境越能体现性能差距。

Unity Physics:

Unity Physics,作为官方物理引擎表现差强人意,2w单位,15帧左右:

 Havok Physics:

2w单位,38帧左右,这个硬件配置下,可以说是逆天了。

 总结:

Havok Physics不愧为老牌物理引擎,2w单位下帧数竟然是Unity Physics的2.5倍。

我们不需要ECS的渲染,那么就可以把第1步的模型Prefab改为空GameObject挂载刚体和碰撞体,这样就可以纯数据物理模拟,我们只需要把空Entity的物理坐标和旋转数值同步到我们的万人同屏方案BRG渲染组件中即可实现海量物理单位同屏,同时绕过ECS的开发方式。

视频中万人同屏方案(gpu动画、渲染、索敌、避障等功能),可某宝搜店铺:【游戏开发资源商店】获取整套方案源码。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言】while循环语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步&#xff1a;下载log4net。 右键项目引用&#xff0c;进入管理NuGet包。 搜索log4net&#xff0c;下载安装。 第二步&#xff1a;创建LogHelper类。 public class LogHelper { private LogHelp…

【Android】View 的滑动

View 的滑动是 Android 实现自定义控件的基础&#xff0c;同时在开发中我们也难免会遇到 View 的滑动处理。其实不管是哪种滑动方式&#xff0c;其基本思想都是类似的&#xff1a;当点击事件传到 View 时&#xff0c;系统记下触摸点的坐标&#xff0c;手指移动时系统记下移动后…

docker 容器修改端口和目录映射

一、容器修改端口映射 一般在运行容器时&#xff0c;我们都会通过参数 -p&#xff08;使用大写的-P参数则会随机选择宿主机的一个端口进行映射&#xff09;来指定宿主机和容器端口的映射&#xff0c;例如 docker run -it -d --name [container-name] -p 8088:80 [image-name]…

Flask基础学习3

参考视频&#xff1a;41-【实战】答案列表的渲染_哔哩哔哩_bilibili flask 实现发送短信功能 pip install flask-mail # 安装依赖 我这里用登录的网易邮箱获取的授权码&#xff08;登录QQ邮箱的授权码总是断开收不到邮件&#xff09;&#xff0c; # config # config mail MAI…

云尚办公-0.0.3

5. controller层 import pers.beiluo.yunshangoffice.model.system.SysRole; import pers.beiluo.yunshangoffice.service.SysRoleService;import java.util.List;//RestController&#xff1a;1.该类是控制器&#xff1b;2.方法返回值会被写进响应报文的报文体&#xff0c;而…

Dockerfile(4) - RUN 指令详解

RUN 运行命令 shell 形式 命令在 shell 中运行Linux 上默认为 /bin/sh -cWindows 上 cmd /S /C RUN <command> exec 形式 RUN ["executable", "param1", "param2"] 必须双引号&#xff0c;不能是单引号 两种写法的实际栗子 RUN …

java高级——反射

目录 反射概述反射的使用获取class对象的三种方式反射获取类的构造器1. 获取类中所有的构造器2. 获取单个构造器 反射获取构造器的作用反射获取成员变量反射变量赋值、取值获取类的成员方法反射对象类方法执行 反射简易框架案例案例需求实现步骤代码如下 反射概述 什么是反射 反…

骨传导耳机什么牌子的好?揭秘成功法则与避坑策略

科技进步带来了骨传导耳机的兴起&#xff0c;这种耳机以其独特的优势而受到越来越多消费者的青睐。与传统的入耳式相比&#xff0c;骨传导耳机通过骨头传递声音&#xff0c;避免了对耳道的直接压迫&#xff0c;减少了对听力的潜在伤害。同时它们允许用户在享受音乐的同时&#…

unity使用Registry类将指定内容写入注册表

遇到一个新需求&#xff0c;在exe执行初期把指定内容写入注册表&#xff0c;Playerprefs固然可以写入&#xff0c;但是小白不知道怎么利用Playerprefs写入DWORD类型的数据&#xff0c;因此使用了Registry类 一. 对注册表中键的访问 注册表中共可分为五类 一般在操作时&#…

中电金信精选好文,全篇划重点~

从硅谷银行件看中美金融监管差异 2023年3月&#xff0c;硅谷银行事件引发全球金融市场震荡&#xff0c;该事件除了给美联储从暴力降息到暴力升息的极限操作敲响一记警钟之外&#xff0c;更是暴露出美国金融监管漏洞重重的现状。相较之下&#xff0c;近年来我国不断深化金融监管…

Linux NFC 子系统剖析

1.总览 linux源码中NFC在net/nfc下&#xff0c;文件结构如下图&#xff1a; hci&#xff1a;Host Controller Interface 主要是针对NFC的主机-控制器接口协议 nci&#xff1a;NFC Controller Interface 主要是NFC的控制器接口协议&#xff0c;用于NFCC(NFC Controller)和DH(…

EAP-TLS实验之H3C MSR2600-10-X1配置相关

H3C MSR2600充当802.1x流程中的NAS&#xff08;Network Access System&#xff09;角色&#xff0c;一般负责实际待验证的设备与认证服务器之间沟通的桥梁&#xff08;当然也可以配置成认证服务器角色&#xff09;工作。在挑选购买支持802.1x的路由器或交换机时需要跟厂家明确是…

【python基础学习08课_函数的嵌套、内置函数等】

一、函数 1、函数的注释 1&#xff09;如何写注释 """ 函数的注释 -- 说明这个函数的作用&#xff0c;以及参数的诠释"""三个引号之间可以注释例如&#xff1a;这是一段注释"""这是一段注释""" 2&#xff09;如…

SVN教程-SVN的基本使用

SVN&#xff08;Apache Subversion&#xff09;是一款强大的集中式版本控制系统&#xff0c;它在软件开发项目中扮演着至关重要的角色&#xff0c;用于有效地跟踪、记录和管理代码的演变过程。与分布式系统相比&#xff0c;SVN 的集中式架构使得团队能够更加协同地进行开发&…

计算机网络之应用层

域名由点和标号(label)组成, 点分割的即是标号每个标号不超过63个字符,总计不超过255个字符, 并且不区分大小写顶级域名TLD(Top Level Domain)分为三类, 国家顶级域名nTLD, 通用顶级域名gTLD, 基础结构域名ID(Infrastructure Domain). 基础结构域名只有一个即 arpa. 用于反向域…

MyBatis 学习(二)之 第一个 MyBatis 案例

目录 1 配置 MyBatis 方式 1.1 XML 配置文件 1.2 Java 注解配置 1.3. Java API 配置 2 在 MySQL 中创建一张表 3 创建一个基于 Maven 的 JavaWeb 工程 4 编写 User 实体类 5 创建 Mybatis 全局配置文件 6 编写一个 DAO 或 Mapper 接口 7 编写 SQL 映射配置文件&#…

Docker部署前后端服务示例

使用Docker部署js前端 1.创建Dockerfile 在项目跟目录下创建Dockerfile文件&#xff1a; # 使用nginx作为基础镜像 FROM nginx:1.19.1# 指定工作空间 WORKDIR /data/web# 将 yarn build 打包后的build文件夹添加到工作空间 ADD build build# 将项目必要文件添加到工作空间&a…

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…

【Python】FastAPI 项目创建 与 Docker 部署

文章目录 前言&需求描述1. 本地FastAPI1.1 Python 环境准备1.2 本地 Pycharm 创建FastAPI项目 2. Python FastAPI 部署2.1 服务器配置Python环境2.2.1 下载与配置Git、Pyenv等工具2.2.2 下载与配置Python 2.2 FastAPI 打包成镜像2.2.1 项目准备所需环境文件2.2.2 编写Docke…