unity 实现千人同屏

news2024/11/20 0:30:29

作为开发人员,我们总是关注性能,包括CPU和GPU。随着场景变得越来越大越来越复杂,保持良好的性能变得越来越有挑战性,尤其是当我们添加越来越多的角色时。我和我在上海的同事在帮助客户时经常遇到这个问题,所以我们决定花几周时间致力于一个旨在提高角色实例化性能的项目。我们把产生的技术称为动画实例化。

我们经常用来实现户外场景GPU实例化,如草和树。要不是SkinnedMeshRenderer(比如人物),我们不能用实例化,因为蒙皮是在CPU上计算的,一个一个提交给GPU。一般来说,我们不能通过一次提交就画出所有的角色。当场景中有大量SkinnedMeshRenderers时,这会导致大量绘制调用和动画计算。

我们已经找到了一种方法来降低CPU成本,并用动画实例化来补充Unity中的GPU实例化。你可以在GitHub上获取我们的代码。请注意,这是定制的实验性解决方案,直到最近,我们才与少数企业支持客户分享它。现在,我们准备好接受更多反馈,请让我们知道您的想法直接在项目注释中!

目标

我们这个实验项目的最初目标是:

  • 实例化SkinnedMeshRenderer

  • 实现尽可能多的动画特性

  • 《牛津小词典》

  • 支持移动平台

  • 选择

由于时间限制,我们的目标并没有全部实现。支持的动画功能有:根运动、附件、动画事件(尚不支持的功能:过渡、动画层)。此外,请记住,这仅适用于使用OpenGL ES 3.0和更新版本的移动平台。

然而,我们认为实验成功地证明了这种方法可以产生有趣的结果。让我们深入了解一些细节。

动画生成

在为角色使用实例化之前,我们需要生成动画。我们把一个角色的动画制作成纹理。这些纹理被称为动画纹理。纹理用于GPU上的蒙皮。

发展

这个生成器从附属于游戏对象的Animator组件中收集动画。它还收集动画事件。从Mecanim系统转移到动画实例化很方便。如果要在角色上附加某些东西,需要在“附件设置”中指定可以附加某些东西的骨骼。

当我们完成生成动画纹理时,动画实例脚本将在运行时加载动画信息。请注意,动画信息不是动画剪辑文件。

举例说明

应用动画实例很简单。让我们将动画实例脚本添加到我们生成的游戏对象中。每顶点骨骼参数控制每顶点计算的骨骼数量。这里需要注意的重要一点是,拥有更少的骨骼可以提高性能,但会降低准确性。

发展

接下来,我们需要修改着色器以支持实例化。基本上,你需要的是将这些线添加到你的着色器中。它不会影响您的着色,但会向蒙皮添加顶点着色器。

#include “AnimationInstancingBase.cginc”

#pragma vertex vert

技术性能分析

我们使用了稍微修改过的版本的演示场景机械动画场景示例并在iPhone 6上测试了它的性能。让我们仔细看看原始和实例化示例的分析器视图。

中央处理器

最初的项目产生了300个字符,我们的FPS大约是15。为了达到至少30 FPS,我们必须将字符数限制在150左右。在动画实例版本中,我们可以生成900个角色,同时保持30 FPS。

发展

发展

如你所见,CPU上的计算降低了项目的速度。

使用实例化项目,我们减少了动画计算(骨骼和皮肤等)。)很多在CPU上。那样的话,我们就可以产生五到六倍的角色了!

发展

发展

在测试场景中,绘制环境需要大约80次绘制调用。这个角色有三个素材。所以我们有三个绘制调用来渲染一个角色。

如果没有实例化,生成250个字符需要大约1100次绘制调用(3 *250个字符+它们的阴影)。

使用动画实例化时,在生成800个角色后,绘制调用仅增加到大约50个。可以看到,实例化列中有4800个批处理绘制调用,48个批处理(3 * 8字符+ 3 * 8阴影)。这是因为我们每批提交100个字符。

发展

发展

国家政治保卫局。参见OGPU

这项技术增加了一点GPU成本,因为我们在GPU上放置了皮肤。如果角色有阴影,我们必须在阴影通道中再次为角色蒙皮。但是,它提高了整体帧速率,因为它降低了CPU成本。通常CPU成本是游戏中人群模拟的最大问题。

记忆

额外的内存用于存储动画纹理。纹理保持皮肤矩阵。我们使用RGBAHalf格式纹理。我们假设一个角色有N块骨头,每块骨头四个像素(一个矩阵);我们生成一个M个关键帧的动画。所以一个动画花费N * 4 * M * 2 = 8NM字节。如果一个角色有50块骨骼,我们生成30个关键帧,那么一个动画就有50 * 4 * 30 = 6000个像素。所以一个1024*1024的纹理最多可以存储174个动画。

结论

我们发现,如果你有很多SkinnedMeshRenderers,动画实例化可以显著降低CPU成本。它适合类似的敌人,如僵尸等人群。

我们希望这个实验项目提供一些洞察力,可以照亮你自己的项目的性能挑战,并让你有能力建立更复杂的场景。当然,未来的工作有很多途径,比如支持过渡、动画层等等。

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

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

相关文章

springcloud-gateway

网关zuul: https://github.com/Netflix/zuul/wiki Spring Cloud 网关gateway:Spring Cloud Gateway Spring Cloud Gateway Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关; 但在2.x版本中,zuul的升级—…

【韩顺平Linux】学习笔记4

【韩顺平Linux】学习笔记4一、Linux组的介绍1.1文件/目录所有者1.2 组的创建1.3 其它组1.4 权限的基本介绍1.5 权限说明案例1.6 修改权限-chmod1.7 修改文件/目录所有者-chown/-chgrp二、crond任务调度三、at定时任务一、Linux组的介绍 在Linux中,每个用户都属于一个…

AtCoder Beginner Contest 284.(A--E)

AtCoder Beginner Contest 284A - Sequence of Strings1、问题2、代码B - Multi Test Cases1、问题2、代码C - Count Connected Components1、问题:2、思路:——并查集、DFS3、代码方法1:并查集方法2:DFSD - Happy New Year 20231…

Linux内核学习笔记——内核页表隔离KPTI机制(源码分析)

KPTI(Kernel PageTable Isolation)全称内核页表隔离,它通过完全分离用户空间与内核空间页表来解决页表泄露。 KPTI中每个进程有两套页表——内核态页表与用户态页表(两个地址空间)。 内核态页表只能在内核态下访问,可以创建到内核和用户的映射&#xf…

单体的 TienChin 和微服务的 TienChin 有何异同?

有不少小伙伴希望松哥能整一个微服务的实战项目,微服务这块技术点其实松哥是讲过很多了,图文版的教程视频版的教程都有,不过确实缺乏一个项目,所以我在想等 TienChin 项目搞完之后,和小伙伴们也来一起搞一个微服务的项…

nacos2.0客户端注册流程分析

版本介绍 copy几个jar包出来康康把 spring-cloud-starter-alibaba-nacos-config-2021.0.4.0.jar spring-cloud-starter-alibaba-nacos-discovery-2021.0.4.0.jar nacos-client-2.0.4.jar 注册流程 读取Spring Boot装载配置文件 spring.factories,找到启动类 Nac…

一步一步学爬虫(4)数据存储之Elasticsearch搜索引擎存储

Elasticsearch搜索引擎存储1. Elasticsearch 介绍2. Elasticsearch 相关概念3. 准备工作3.1 下载程序3.2 解压缩,配置文件修改4. 创建索引5. 删除索引6. 插入数据7. 更新数据8. 删除数据9. 查询数据10. 总结想查数据,就免不了搜索,而搜索离不…

【微信小程序】全局数据共享

小程序中的全局数据共享方案在小程序中可以使用mobx-miniprogram配合mobx-miniprogram-bindings实现全局数据共享。● mobx-miniprogram用来创建Store实例对象● mobx-miniprogram-bindings用来把Store中的共享数据或方法,绑定到组件或页面中使用npm install --save…

Python虚拟环境

学习视频:安装不算完事,只有理解了虚拟环境才算真正掌握 Python 环境 同类笔记:Python虚拟环境 目录 一、什么是虚拟环境 二、虚拟环境相关工具的使用和原理 创建虚拟环境 虚拟环境目录分析 虚拟环境的激活 虚拟环境做了什么 退出虚…

【论文精读】360MVSNet

今天读的是发表在WACV2023上的MVS文章,该文章提出了基于全景相机的MVS pipeline。 文章链接:点击前往 代码链接:暂未开源。 文章目录Abstract1. Introduction2. Related works3. Method3.1 Feature Extraction3.2 360 Spherical Sweeping3.2.…

【经典笔试题2】

test1 test2 test3 test4 test5 test1 int main() {int a[5] { 1, 2, 3, 4, 5 };int *ptr (int *)(&a 1);printf( "%d,%d", *(a 1), *(ptr - 1));return 0; } 程序的结果是什么?首先分析代码,a是数组名,是数组首元素…

详解Web服务器与http https协议工作过程

Web服务器 URL URI URL是URI的一个子集 www www所用的协议 http请求报文分析 状态码(空行:最后一 个响应头部之后是一个空行,发送回车符和换行符,通知服务器以下不再有响应头部。) 网址解析 网址注释实例 HTT…

从工厂方法到注解的小例子

目录一、背景介绍二、思路&方案三、过程过程图一过程图二过程图三过程图四(运行时的图)代码四、总结五、升华一、背景介绍 上篇"自定义注解和注解解析器",通过小例子介绍了自定义注解的运用;本篇继续基于小例子来实现工厂方法,以及注解实…

linux Regmap API

1.针对 I2C 和 SPI 设备寄存器的操作都是通过相关的 API 函数进行操作的。这样 Linux 内核中就会充斥着大量的重复、冗余代码,但是这些本质上都是对寄存器的操作,所以为了方便内核开发人员统一访问I2C/SPI 设备的时候,为此引入了 Regmap 子系…

如何用智能地教狗狗上厕所

背景 22年养了一只很可爱的小狗狗,我其实就一个问题:为啥这么可爱的狗狗会拉屎撒尿呀? 自从崽崽来了我们家之后,最让我们头疼的就是它乱拉、乱尿的问题了,以前会在家里到处乱来,最近一段时间好了很多&…

机器学习(整体结构)

国科大《机器学习》内容,周晓飞老师讲的挺不错的,浅显易懂。 本来是想整理下课程内容的,然而动手后才发现内容过多(很想吐槽,为啥这么多模型?不能相互替代么?)简略画个思维导图算啦…

探索SpringMVC-HandlerAdapter之RequestMappingHandlerAdapter-返回值处理

前言 上回我们回答了ReqeustMappingHandlerAdapter调用目标方法的参数解析问题,今天我们再来回答第二个问题:怎么处理方法调用的返回值。 深入分析返回值处理需求 RequestMapping处理器的返回值类型 相信很多同学对于这个返回值的第一个反应就是返回一…

图解JDK1.7中HashMap头插法扩容造成的死循环问题

JDK1.7中HashMap头插法扩容造成的死循环问题 文章目录JDK1.7中HashMap头插法扩容造成的死循环问题一、背景二、源码解读三、图解单线程环境中扩容多线程环境中扩容四.总结一、背景 HashMap是线程不安全的,在并发使用HashMap时很容易出现一些问题,其中最…

ArcGIS基础实验操作100例--实验66符号图层的保存与加载

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台:ArcGIS 10.6 实验数据:请访问实验1(传送门) 高级编辑篇--实验66 符号图层的保存与加载 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

【OpenGL】基础光照

介绍 现实世界中的光照是极其复杂,难以计算的,因此OpenGL的光照使用的是简化的模型,其中一个模型被称为冯氏光照模型(Phong Lighting Model)。 冯氏光照模型的主要结构由三个分量组成: 环境(Ambient)光照漫反射(Diffuse)光照镜…