看看 Meta的低延迟云游戏基础设施

c7b68224b0a39b19c1c79f603cca5e13.png

为应对提供快速、流畅、无抖动游戏和超低端到端延迟的挑战,社交媒体巨头 Meta 创建了一个能够在单个服务器上运行多个游戏的基础设施(为了经济效率),同时保持数据安全。

Meta的工程师们认为,这个低延迟的游戏平台也可以作为Metaverse的基础。

Facebook 于 2020 年推出其云游戏平台,为用户提供跨所有浏览器的原生 Android 和 Windows 手机游戏的快速访问。伴随着大量的访问而来的是大量的对开发人员和工程的挑战。

网络、托管和集群管理

Meta 提供低端到端延迟的第一步是物理延迟——减少云游戏基础设施与玩家本身之间的距离——Meta 使用边缘计算并部署在靠近大量玩家的边缘。边缘计算的目标是“拥有一个统一的托管环境,以确保可以尽可能流畅地运行尽可能多的游戏。”

08483ad7a80975f1acf919ee3d9ef7ce.png

边缘计算站点越多,用户延迟越低。

接下来,Meta 的目标是“确保可以尽可能流畅地运行尽可能多的游戏。”。

为此,Meta 与 Nvidia 合作,在GPU 之上构建了一个托管环境。Meta 相信这一步将提供“加载和流式传输游戏所需的高保真度和低延迟”。

集群管理是端到端延迟减少挑战的最后一部分。为此,Meta 使用了其内部的 Twine 集群管理。Twine 在边缘协调游戏服务器,而自定义构建编排服务管理流信号。Windows 和 Android 都有不同的托管解决方案,可以提供更大的灵活性。

415abc83947d448c9c10409d7466b87f.png

Meta 的云游戏基础设施 

音频和视频流

高音频和视频质量可以说是云游戏最重要的事情。人物可以跳,但音视频不能。Meta 工程师选择了带有安全实时传输协议 (SRTP) 的 WebRTC 用于流式传输用户输入和视频/音频帧。

工程师们仔细研究了他们目前使用的工作流程:

玩家执行了一个动作(让角色跳跃)—>点击事件被捕获并发送到服务器—>游戏模拟器收到事件—>游戏渲染了一个包含动作结果的帧(角色跳跃)—>捕获了渲染帧,使用视频编码器对其进行复制和编码—> 帧被打包以适合用户数据报协议 (UDP) 数据包 —> 通过网络发送到播放器 —> 数据包被解码为帧并为播放器渲染。

尽管每个动作都被快速执行,但所有这些动作加起来可能会导致看似缓慢的性能。

修改后的工作流程包括更少的步骤:

57f85817b0b5cc3fdaf38eaeef92993b.png

GPU 编码有助于减少视频和音频流的延迟。

现在,当游戏渲染一帧时,它会在 GPU 中渲染,并且在编码之前不会离开 GPU 内存。因此,新进程不会使用 GPU 和主服务器之间的大部分 PCI 总线。为了进一步提高效率,此过程还创建了一个最终小于原始帧的编码帧。

为了继续推动改进延迟,当需要解码时,视频会在音频之前发送,这与当前音频和视频一起发送的做法背道而驰。Meta 还可以利用玩家电脑显示器或手机屏幕的固有延迟。屏幕以一定的速率(例如,30fps 或 60fps)一帧一帧地渲染。Meta 可以使用帧之间那些难以察觉的间隔来帮助吸收一些抖动并平滑视频。对于支持更高 FPS 的设备,延迟可以进一步降低。

安全

该系统服务于基于 Windows 和 Android 的系统,固有地承担了这些环境的安全挑战,并且还需要保护免受 DDOS 攻击等威胁。

为确保安全,Meta 的云游戏基础设施与其核心数据完全分离。就云游戏基础设施的保护方式而言,安全威胁在开发的各个阶段都进行了测试,从设计开始,一直持续到实施和测试。这包括威胁建模、安全代码审查、模糊测试和安全测试。Meta 也有外部公司执行安全评估作为额外的保护层。

云游戏的下一步是什么?

在技术改进方面,Meta 目前正在与移动网络载体合作以改善移动网络的延迟,并与芯片组网络合作以改善用户设备的延迟。工程团队还在研究新的容器技术,以提供更好的流传输效率,并继续确保安全措施与所有增长领域保持同步。

开发人员还可以通过系统兼容性和更好的开发、测试、调试和分析工具来寻找即将到来的重大改进。

原文链接:

https://thenewstack.io/a-look-at-metas-low-latency-metaverse-infrastructure/

be3b2646c5e51d83004c35ae3d707dfa.png

25b422742b527586fbfec8dc639e8f8e.png

### 回答1: 您好,以下是Java基础面试题(2022最新版汇总): 1. Java中的四种访问修饰符是什么?它们分别代表什么含义? 答:Java中的四种访问修饰符是public、protected、default和private。它们分别代表公共的、受保护的、默认的和私有的含义。 2. Java中的八种基本数据型是什么? 答:Java中的八种基本数据型是byte、short、int、long、float、double、char和boolean。 3. Java中的自动装箱和拆箱是什么? 答:Java中的自动装箱和拆箱是指将基本数据型自动转换为对应的包装型,以及将包装型自动转换为对应的基本数据型。 4. Java中的final关键字有哪些用途? 答:Java中的final关键字有三种用途:用于修饰变量,表示该变量的值不可改变;用于修饰方法,表示该方法不可被重写;用于修饰,表示该不可被继承。 5. Java中的抽象和接口有什么区别? 答:Java中的抽象和接口都不能被实例化,但是抽象可以包含非抽象方法,而接口只能包含抽象方法。另外,一个只能继承一个抽象,但是可以实现多个接口。 6. Java中的多态是什么? 答:Java中的多态是指同一个方法可以根据不同的对象调用出不同的行为。它实现的方式有两种:重载和重写。 7. Java中的异常处理机制是什么? 答:Java中的异常处理机制是指通过try-catch-finally语句块来捕获和处理程序运行时可能出现的异常情况,保证程序的稳定性和可靠性。 8. Java中的线程是什么?如何创建线程? 答:Java中的线程是指程序执行的最小单位,它可以独立运行,也可以与其他线程共享资源。创建线程的方式有两种:继承Thread和实现Runnable接口。 9. Java中的集合框架有哪些?它们之间有什么区别? 答:Java中的集合框架包括List、Set、Map和Queue等。它们之间的区别在于:List是有序的、可重复的集合;Set是无序的、不可重复的集合;Map是键值对的集合;Queue是先进先出的队列。 10. Java中的反射是什么?有什么作用? 答:Java中的反射是指在程序运行时动态地获取的信息,并可以在运行时操作的属性和方法。它的作用在于:可以实现动态代理、动态生成代码、动态加载等功能。 ### 回答2: Java是一种广泛使用的编程语言,它的应用覆盖多个领域,包括机器学习、大数据、企业级应用等。而Java开发人员也是当前市场上非常火热的职业之一。为了进入一家Java开发企业或者获取Java开发岗位,需要通过Java基础面试。 下面我将介绍Java基础面试题,并提供一些答案和解释: 1. 什么是Java? Java是一种面向对象的编程语言,被广泛应用于开发各种应用程序,包括Web应用程序、移动应用程序、桌面应用程序等。 2. 什么是面向对象编程? 面向对象编程是一种编程范型,它将程序分解为对象,每个对象都有自己的数据和方法,对象之间可以相互交互。面向对象编程通常具有封装、继承和多态等特性。 3. Java应用程序的基本结构是什么? Java应用程序的基本结构包括定义,变量定义,方法定义和语句执行。 4. 什么是Java虚拟机? Java虚拟机是Java平台的核心组件之一,它提供了一个运行Java程序的环境。Java虚拟机可以在不同的操作系统上运行Java程序,实现了跨平台运行的目的。 5. 什么是Java语言的基本数据型? Java语言的基本数据型包括byte、short、int、long、float、double、boolean和char。 6. 如何声明一个变量? 在Java中,声明一个变量需要指定变量的型和名称。例如,int count = 10; 7. 什么是包? 包是在Java中管理和接口的一种方式。包可以将相关的和接口组织在一起,以便更好地管理代码。 8. 什么是Java中的异常? 异常是在程序执行期间出现的错误,它包含了错误信息、错误型和错误的上下文。 9. 什么是Java中的多线程? 多线程是Java中一种并发处理的方法,它允许程序同时执行多个任务。Java中的线程可以通过继承Thread或实现Runnable接口来创建。 10. Java中的继承关系是什么? 继承是Java中一种对象之间的关系,它允许子继承父的属性和方法。子可以通过继承父来扩展自己的功能。 以上是常见的Java基础面试题,希望能够对Java开发者提供帮助。在面试过程中,还需要我们展示自己的编程能力和实际应用经验。只有掌握了扎实的Java基础、熟悉常见的应用场景、具备实际经验并且具备坚实的编程能力,才能获得Java开发岗位。 ### 回答3: Java作为目前最热门的编程语言之一,在面试中也是一个重点考察的领域。下面对于Java基础面试题进行汇总和解答。 1. Java常见的数据型有哪些? 答:Java常见的数据型有基本数据型和引用数据型两种。基本数据型包括byte、short、int、long、float、double、boolean、char;引用数据型包括、数组、接口。 2. int和Integer有什么区别? 答:int是Java中的一种基本数据型,使用时直接声明并赋值即可;而Integer是int的包装型,是一个对象,需要通过new来进行初始化,也可以使用自动装箱和拆箱进行转换。 3. StringStringBuilder的区别? 答:String是一个不可变的,一旦创建就不能修改,修改需要重新创建对象;StringBuilder是一个可变的,可以通过append、insert等方法修改字符串,节省内存和时间。 4. 抽象和接口的区别? 答:抽象和接口都是用于描述行为的概念,但是抽象更偏向于在层次结构中描述一种抽象的,它可以拥有抽象方法和具体实现方法,可以有构造函数,但不能被实例化;而接口更偏向于描述一种能力,只能包含抽象方法、常量和默认方法,不能有构造函数,需要实现接口才能使用。 5. 静态和非静态的区别? 答:静态属性或方法属于,而非静态属性或方法属于实例,也就是说同一个属性或方法,静态的只有一份,非静态每次实例化时都有自己的一份;静态变量在的加载时初始化,公用一份内存,一旦被修改,则所有的对象都会共享该值;非静态变量在每次实例化时初始化,属于独立变量。 6. final关键字的作用? 答:final关键字可以修饰、方法和变量,表示不可修改、不可继承或不可重写。final修饰的变量是一个常量,一旦初始化后就不能修改;final修饰的方法不能被子重写;final修饰的不能被继承。 7. try-catch-finally语句的应用? 答:try-catch-finally语句用于捕获程序中的异常,在try块中尝试执行一段可能会出现异常的代码,如果出现异常则会转到catch块中处理异常,最后无论是否出现异常都会执行finally块中的语句。finally块一般用于释放资源或进行清理操作,如关闭数据库、文件等。 8. 在Java中如何实现多线程? 答:Java中实现多线程有两种方式:继承Thread和实现Runnable接口。继承Thread需要重写run方法,而实现Runnable接口需要实现run方法。另外,还可以使用线程池、同步锁、信号量、线程等待等方式实现多线程。 9. 快速判断一个字符串是否是数字? 答:可以使用正则表达式或Java自带的API进行判断。正则表达式可以使用\d+匹配数字,Java自带的API可以使用try-catch捕获NumberFormatException异常来判断。 10. Java中的反射是什么? 答:Java中的反射是指程序在运行时可以动态获取和操控的信息和对象的属性或方法,包括的名称、属性和方法。可以通过反射来获取的所有信息,包括私有的成员变量和方法,也可以在运行时创建对象、调用方法等。但是由于反射操作需要消耗一定的资源,因此不适合在频繁执行的代码中使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值