QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

视频游戏《光环 4》的 Actor 模型设计和实现

  • 2015-03-18
  • 本文字数:1257 字

    阅读完需:约 4 分钟

在开始设计光环(Halo)系列视频游戏的下一代——光环4 的时候,现有的游戏引擎与可用的服务已经无法满足游戏的需求了,因此开发者基于 Actor 模型设计了一套全新的解决方案,并使用 Orleans 框架完成了这套模型的实现。在 QCon 伦敦大会上, Caitie McCaffrey 在演讲中为听众介绍了他们设计与创建这个新游戏背后的服务的过程。

McCaffrey 原本在微软游戏工作室就职,目前则在 Twitter 担任分布式系统工程师的职位。他提到了在游戏开发过程中所遇到的一个架构上的挑战,是如何设计该游戏将要面对的海量访问的负载。在光环 4 上线当天,共有 100 万独立在线用户参与了游戏,这个数字在一周之内就上升到了 400 位,游戏时间总和超过了 3000 万小时。为了应对如此庞大的负载,该项目选择了在云端进行托管,更具体地说是托管在 Azure 上,毕竟光环 4 是微软所推出的游戏。其它的挑战还包括如何保证游戏能够始终在线运行,这就要求服务器永远保持可用状态,还要尽量降低延迟,并且提高并发能力。

在寻找能够满足该项目需求的解决方案过程中,项目组的目光投向了 Actor 模型。从本质上说,Actor(角色)是并发的基础,该模型的核心概念在于:作为并发计算的基元,每个 Actor 将通过异步消息发送的方式与另一个 Actor 进行通信。当某个 Actor 收到一条消息之后,它可以选择将消息发送给其它 Actor,或是创建一个新的 Actor,也可以修改它的内部状态。这样一来,就能够高效地将某个 Actor 的所有数据保存在同一个地方,因此 McCaffrey 和他的团队通过实现这些保持状态的服务,创建了一套能够保持状态的中间层,它一方面具有缓存的高性能优点,另一方面也不会产生由于并发造成的问题。

项目组在微软内部四处寻找可行的方案,他们最终发现了 Orleans 框架,这是一个用于创建基于 Actor 模型的分布式系统的运行时与编程模型。Orleans 框架与其它 Actor 模型框架最重要的不同之处在于它所独有的概念:虚拟 Actor。这个虚拟 Actor 永远不会被创建或是销毁,从逻辑上来说它是永远存在的。虚拟 Actor 所具有的关键思想,一是地址的透明性,即发送给某个 Actor 的消息会被自动路由至该 Actor,无论该 Actor 的地址在哪里;二是能够在不重新进行部署的情况下进行自动横向扩展。

McCaffrey 声称,在使用了新技术的全新架构中,服务器的 CPU 利用率能够持续稳定在 90% 的水平上,并且能够实现接近线性增长的可扩展性,能够轻易地应对负载的变量,这一点在访问量突发性增长的时刻相当实用,例如当游戏刚刚上线的时候。

McCaffrey 相信,如果没有 Orleans 这个框架,光环 4 的项目就不可能获得成功。由于 Orleans 能够为开发者编写在分布式环境中运行的代码提供极大的帮助,因此寻找合适的开发者也变得简单了许多。并且由于它提高了开发者的生产力,因此开发者能够专注于提高游戏的用户体验,让它的表现更加出色。

McCaffrey 在一篇较早的博客帖子中,曾经介绍了使用 Orleans创建RESTful 服务的过程。

对于实现Actor 模型的不同途径,InfoQ 之前曾经专门进行过讨论和报告

查看英文原文: Building Halo 4, a Video Game, Using Actor Model

2015-03-18 06:123070
用户头像

发布了 428 篇内容, 共 184.5 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

面试官:React怎么做性能优化

beifeng1996

React

【牛客刷题-算法】NC22 合并两个有序的数组

清风莫追

算法 数组 10月月更

【一Go到底】第五天---指针

指剑

Go golang 10月月更

Mac下vagrant从安装到体验

程序员欣宸

vagrant 虚拟机 10月月更

说说你对Vue的keep-alive的理解

bb_xiaxia1998

Vue

硬核好文!网络拓扑类型:总线、环形、星形、网状、树形、点对点、混合

wljslmz

网络技术 网络拓扑 10月月更

【牛客刷题-算法】NC25 删除有序链表中重复的元素-I

清风莫追

算法 链表 10月月更

微服务通信

穿过生命散发芬芳

微服务 10月月更

令人头秃的js隐式转换面试题,你能做对吗

loveX001

JavaScript

Fiddler(二) - 使用Fiddler做抓包分析

No Silver Bullet

fiddler 抓包分析 10月月更

InetAddress.getLocalHost() 执行很慢?

xiaoxi666

网络 网络库

什么是 Python 垃圾回收机制中的引用计数

宇宙之一粟

Python 垃圾回收机制 引用计数 10月月更

经常会采坑的javascript原型应试题

loveX001

JavaScript

Fiddler(一) - Fiddler简介

No Silver Bullet

fiddler 10月月更 抓包工具

说说Vue响应式系统中的Watcher和Dep的关系-面试进阶

bb_xiaxia1998

Vue

【C语言难点突破】指针入门讲解

Geek_65222d

10月月更

网络请求模块(2)

张立梵

Python. 爬虫必备知识讲解 10月月更

Collections之Arraylist源码解读(五)

知识浅谈

ArrayList 10月月更

【愚公系列】2022年10月 Go教学课程 018-分支结构之switch

愚公搬代码

10月月更

面向对象究竟是什么鬼?该如何理解?

乌龟哥哥

10月月更

基于IDE和dlv远程调试Kubernetes组件

琦彦

Go Kubernetes 调试 10月月更 delve

Vue3入门指北(八)v-model

Augus

Vue3 10月月更

书单推荐|宅家不动过国庆,好书相伴不寂寞

图灵社区

书单 国庆节

2022-10-04:以下go语言代码输出什么?A:{123} main.T{x:123} B:{123} T{x:123} C:boo boo D:boo main.T{x:123}。 packag

福大大架构师每日一题

golang 福大大 选择题

80%的前端开发都答不上来的js异步面试题

loveX001

JavaScript

Vue是怎样监听数组的变化的?

bb_xiaxia1998

Vue

C++学习---_IO_new_fdopen函数原理分析学习

桑榆

c++ 源码分析 10月月更

【牛客刷题-算法】NC16 对称的二叉树

清风莫追

算法 二叉树 10月月更

React-Hooks怎样封装防抖和节流-面试真题

beifeng1996

React

老生常谈React的diff算法原理-面试版

beifeng1996

React

最长回文串

掘金安东尼

10月月更 算法、

视频游戏《光环4》的Actor模型设计和实现_DevOps & 平台工程_Jan Stenberg_InfoQ精选文章