- 浏览: 242144 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
saiyaren:
你对hiphop的深入程度到了什么程度了?想和你进行探讨一下
facebook hiphop php vm 实现概述 -
eric_weitm:
lj3362569 写道可以再讲具体点么?还有现有的hipho ...
facebook hiphop php vm 实现概述 -
lj3362569:
可以再讲具体点么?还有现有的hiphop不支持哪些功能?
facebook hiphop php vm 实现概述
3D MMORPG客户端的一般架构
一、前言
通常说的游戏指的是real-time interactive video game, 这里面交互性指的是玩家的操作会影响画面的显示(这是与电影、动画片等的区别),由于系统会对玩家的操作进行反馈,所以这类的游戏更真实,更吸引人,real-time 是指玩家的操作、环境的变化必须要实时的在画面上表现出来。普通PC上运行的客户端游戏是video game的一种,其利用通用的计算机实现了实时交互性的效果。
本质上PC是数字计算机,即信号是离散的(与连续相对)、数字的,所有连续的效果通过足够快的更新画面来实现,实际上电影、电视都是用离散来模拟连续。因为一般人眼的反应时间大概是毫秒这个量级,所以使用离散来模拟连续是可行的。
二、几个基本术语
gameplay:大概是“玩法”的意思
gamepad (also called joypad or control pad):游戏手柄
MMORPG:Massively multiplayer online role-playing game
Skeletal animation(骨骼动画):模型的动画实际上是连续的多个离散的顶点位置集合,顶点动画是将这些位置的集合事先计算好,在使用时直接放入显卡进行渲染,
骨骼动画是在每一帧中计算各个抽象的骨头的变换矩阵,之后在渲染时由显卡负责将这些变换作用到起初设定的skin上面。
ragdoll physics:骨骼动画里面的每个bone(rigid bodies )之间建立了一种相互约束的关系(比如胳膊只能向里面弯曲,这样可以模拟人体的运动),这样使动画效果更真实
三、3D MMORPG客户端要解决的一些问题(需求)
1、实时性(战场、玩家信息等数据要实时的更新)
2、保证帧平稳(画面播放要平稳、不能有快进或卡住的感觉),由于是实时进行计算所以这个还是有一定难度的
3、不能卡住整个线程
4、3d模型的效果要真实(主要是物理模拟等)
四、数据结构
一般游戏的规则是由server端来计算的,client本质上是一个状态“播放器”,为了更有效的实时的显示出最新的状态,本地要保存一个player和环境的数据结构(如果所有数据实时的从server端取回,则render只能在消息回调中执行,这样会卡帧),为了体现最新的状态client要不停的显示需要的数据结构,这样只要刷新的足够快,用户就会觉得是实时同步更新的。MMO中核心的数据结构是player,这个结构server端和client端基本是一致的(client端的ID用来标记server端的一个对象)。
对于3D游戏而言一个屏幕上显示的内容只是虚拟世界的一小部分,整个世界一般用场景图结构来表示
五、运行时基本逻辑
1、游戏不仅有游戏中的状态,还有很多其他的状态,比如登陆服务器、设置操作界面、查看装备属性等,可以利用state来封装一种状态,state之间的切换构成了最上层的层次结构,state具体的切换细节可以用有限状态机来描述。
2、具体一个state中的基本逻辑
void System::Run()
{
Start(); /// 初始化定时器
while (mRunning) // 帧循环
{
Step(); // 一步tick
}
LOG_DEBUG("System: Exiting...");
exitCallback(); // 退出,清理资源
LOG_DEBUG("System: Done Exiting.");
}
void System::Step()
{
static bool first = true;
if (first)
{
InitVars(); // 初始化
first = false;
}
SystemStep();
}
void SystemImpl::SystemStep()
{
const Timer_t lastClockTime = mTickClockTime;
mTickClockTime = mClock.Tick();
const double realDT = mClock.DeltaSec(lastClockTime, mTickClockTime);
// update real time variable(s)
mRealClockTime += Timer_t(realDT * 1000000);
if (mPaused)
{
mTotalFrameTime = 0.0; // reset frame timer for stats
mWasPaused = true;
EventTraversal(0.0, realDT);
PostEventTraversal(0.0, realDT);
Pause(realDT);
CameraSynch(0.0, realDT);
FrameSynch(0.0, realDT);
Frame(0.0, realDT);
}
else
{
if (!mUseFixedTimeStep)
{
mTotalFrameTime = 0.0; // reset frame timer for stats
mWasPaused = false;
// update simulation time variable(s)
const double simDT = realDT * mTimeScale;
mSimulationTime += simDT;
mSimTimeSinceStartup += simDT;
mSimulationClockTime += Timer_t(simDT * 1000000);
EventTraversal(simDT, realDT); // 先处理事件
PostEventTraversal(simDT, realDT);
PreFrame(simDT, realDT); // 主要是物理模拟等
CameraSynch(simDT, realDT); // 摄像机
FrameSynch(simDT, realDT);
Frame(simDT, realDT); // 画一帧
PostFrame(simDT, realDT);
}
else
{
SystemStepFixed(realDT);
}
}
FinishFrameStats();
}
总结:一帧里面的基本操作包括:
1、事件处理,即从上一帧到这一帧之间缓存的事件需要一一进行处理。这些事件包括本地的键盘鼠标操作,server传过来的message等。
这些事件的处理逻辑主要包括:
1》角色移动、转向等(内部是更改mesh的matrix4等属性、以及摄像机的操作等)
2》跳跃、走动 ----切换动画数据
3》切换人物 -----改变摄像机的target
4》拉近视角、拉远视角 --------摄像机操作
5》自动寻路 --------寻找关键点、播放走路动画
6》攻击、发技能 --------播放特定粒子效果、动画等
7》触发某个界面元素 --------进行相应逻辑处理、向server发相应请求等
8》拾取物品 --------2d ----3d ----3d object(即顺着摄像机方向创建射线、之后找出相交的object,向server发拾取的请求)
2、物理模拟
1》碰撞检测(求交点等),可以实现人物贴着地面行走、摄像机不会掉到地面以下、人物不会跑出地图边界,人物在坡上时不会悬空等效果
2》反向动力学模拟, 可以实现ragdoll 效果,
3》流体力学等复杂的物理模拟, 基本上牛顿经典力学所涉及的速度、加速度、质量,运动学等都可以做到(如人物走时会受摩擦力影响、人物跳下时会有重力加速度效果),牛X的游戏可以模拟出流体力学(这样就会体现出空气阻力、游泳时的浮力、阻力,水流动时的表面张力等)等更逼真的效果
3、preframe
1》计算骨骼动画的当前transform矩阵(之前先是在物理引擎中计算)、顶点动画的当前数据,摄像机移动的当前位置等动画相关数据
2》计算粒子系统当前的状态
3》计算音效、背景音乐等当前的数据
4、update场景
1》计算摄像机新的变换矩阵
2》根据摄像机matrix4更新modelView matrix、 projection matrix等(之所以使用matrix4x4是因为显卡支持4阶矩阵并行计算,注意不是并发是真正的并行,这是GPU的特点)
3》根据新的视锥体进行场景剔除(cull),一般室外场景是八叉树裁剪、室内场景是二叉树裁剪
4》更新每个node的orientation,position、scale等属性(主要是要将父节点的数据传递给子节点)
5、渲染场景
1》依次渲染renderQueue中的mesh,(这里面可以根据shader等来分组进行渲染、进而提高效率,GPU的特点是并行计算快,但是切换状态时很费时间)
1.1》为GPU绑定顶点数据、
1.2》设置vertixshader和pixelshader的参数
1.3》执行shader程序(这里面可以作一些特效)
2》post effect特效
6、播放一帧音效、音乐
六、静态结构
client端的代码基本上可以包括以下组件:
GUI(游戏内的悬浮button等)、渲染、场景管理、动画、粒子、物理模拟、AI、网络、窗口界面(qt等)、音效、脚本、IO事件、game框架、摄像机管理、player封装等
一、前言
通常说的游戏指的是real-time interactive video game, 这里面交互性指的是玩家的操作会影响画面的显示(这是与电影、动画片等的区别),由于系统会对玩家的操作进行反馈,所以这类的游戏更真实,更吸引人,real-time 是指玩家的操作、环境的变化必须要实时的在画面上表现出来。普通PC上运行的客户端游戏是video game的一种,其利用通用的计算机实现了实时交互性的效果。
本质上PC是数字计算机,即信号是离散的(与连续相对)、数字的,所有连续的效果通过足够快的更新画面来实现,实际上电影、电视都是用离散来模拟连续。因为一般人眼的反应时间大概是毫秒这个量级,所以使用离散来模拟连续是可行的。
二、几个基本术语
gameplay:大概是“玩法”的意思
gamepad (also called joypad or control pad):游戏手柄
MMORPG:Massively multiplayer online role-playing game
Skeletal animation(骨骼动画):模型的动画实际上是连续的多个离散的顶点位置集合,顶点动画是将这些位置的集合事先计算好,在使用时直接放入显卡进行渲染,
骨骼动画是在每一帧中计算各个抽象的骨头的变换矩阵,之后在渲染时由显卡负责将这些变换作用到起初设定的skin上面。
ragdoll physics:骨骼动画里面的每个bone(rigid bodies )之间建立了一种相互约束的关系(比如胳膊只能向里面弯曲,这样可以模拟人体的运动),这样使动画效果更真实
三、3D MMORPG客户端要解决的一些问题(需求)
1、实时性(战场、玩家信息等数据要实时的更新)
2、保证帧平稳(画面播放要平稳、不能有快进或卡住的感觉),由于是实时进行计算所以这个还是有一定难度的
3、不能卡住整个线程
4、3d模型的效果要真实(主要是物理模拟等)
四、数据结构
一般游戏的规则是由server端来计算的,client本质上是一个状态“播放器”,为了更有效的实时的显示出最新的状态,本地要保存一个player和环境的数据结构(如果所有数据实时的从server端取回,则render只能在消息回调中执行,这样会卡帧),为了体现最新的状态client要不停的显示需要的数据结构,这样只要刷新的足够快,用户就会觉得是实时同步更新的。MMO中核心的数据结构是player,这个结构server端和client端基本是一致的(client端的ID用来标记server端的一个对象)。
对于3D游戏而言一个屏幕上显示的内容只是虚拟世界的一小部分,整个世界一般用场景图结构来表示
五、运行时基本逻辑
1、游戏不仅有游戏中的状态,还有很多其他的状态,比如登陆服务器、设置操作界面、查看装备属性等,可以利用state来封装一种状态,state之间的切换构成了最上层的层次结构,state具体的切换细节可以用有限状态机来描述。
2、具体一个state中的基本逻辑
void System::Run()
{
Start(); /// 初始化定时器
while (mRunning) // 帧循环
{
Step(); // 一步tick
}
LOG_DEBUG("System: Exiting...");
exitCallback(); // 退出,清理资源
LOG_DEBUG("System: Done Exiting.");
}
void System::Step()
{
static bool first = true;
if (first)
{
InitVars(); // 初始化
first = false;
}
SystemStep();
}
void SystemImpl::SystemStep()
{
const Timer_t lastClockTime = mTickClockTime;
mTickClockTime = mClock.Tick();
const double realDT = mClock.DeltaSec(lastClockTime, mTickClockTime);
// update real time variable(s)
mRealClockTime += Timer_t(realDT * 1000000);
if (mPaused)
{
mTotalFrameTime = 0.0; // reset frame timer for stats
mWasPaused = true;
EventTraversal(0.0, realDT);
PostEventTraversal(0.0, realDT);
Pause(realDT);
CameraSynch(0.0, realDT);
FrameSynch(0.0, realDT);
Frame(0.0, realDT);
}
else
{
if (!mUseFixedTimeStep)
{
mTotalFrameTime = 0.0; // reset frame timer for stats
mWasPaused = false;
// update simulation time variable(s)
const double simDT = realDT * mTimeScale;
mSimulationTime += simDT;
mSimTimeSinceStartup += simDT;
mSimulationClockTime += Timer_t(simDT * 1000000);
EventTraversal(simDT, realDT); // 先处理事件
PostEventTraversal(simDT, realDT);
PreFrame(simDT, realDT); // 主要是物理模拟等
CameraSynch(simDT, realDT); // 摄像机
FrameSynch(simDT, realDT);
Frame(simDT, realDT); // 画一帧
PostFrame(simDT, realDT);
}
else
{
SystemStepFixed(realDT);
}
}
FinishFrameStats();
}
总结:一帧里面的基本操作包括:
1、事件处理,即从上一帧到这一帧之间缓存的事件需要一一进行处理。这些事件包括本地的键盘鼠标操作,server传过来的message等。
这些事件的处理逻辑主要包括:
1》角色移动、转向等(内部是更改mesh的matrix4等属性、以及摄像机的操作等)
2》跳跃、走动 ----切换动画数据
3》切换人物 -----改变摄像机的target
4》拉近视角、拉远视角 --------摄像机操作
5》自动寻路 --------寻找关键点、播放走路动画
6》攻击、发技能 --------播放特定粒子效果、动画等
7》触发某个界面元素 --------进行相应逻辑处理、向server发相应请求等
8》拾取物品 --------2d ----3d ----3d object(即顺着摄像机方向创建射线、之后找出相交的object,向server发拾取的请求)
2、物理模拟
1》碰撞检测(求交点等),可以实现人物贴着地面行走、摄像机不会掉到地面以下、人物不会跑出地图边界,人物在坡上时不会悬空等效果
2》反向动力学模拟, 可以实现ragdoll 效果,
3》流体力学等复杂的物理模拟, 基本上牛顿经典力学所涉及的速度、加速度、质量,运动学等都可以做到(如人物走时会受摩擦力影响、人物跳下时会有重力加速度效果),牛X的游戏可以模拟出流体力学(这样就会体现出空气阻力、游泳时的浮力、阻力,水流动时的表面张力等)等更逼真的效果
3、preframe
1》计算骨骼动画的当前transform矩阵(之前先是在物理引擎中计算)、顶点动画的当前数据,摄像机移动的当前位置等动画相关数据
2》计算粒子系统当前的状态
3》计算音效、背景音乐等当前的数据
4、update场景
1》计算摄像机新的变换矩阵
2》根据摄像机matrix4更新modelView matrix、 projection matrix等(之所以使用matrix4x4是因为显卡支持4阶矩阵并行计算,注意不是并发是真正的并行,这是GPU的特点)
3》根据新的视锥体进行场景剔除(cull),一般室外场景是八叉树裁剪、室内场景是二叉树裁剪
4》更新每个node的orientation,position、scale等属性(主要是要将父节点的数据传递给子节点)
5、渲染场景
1》依次渲染renderQueue中的mesh,(这里面可以根据shader等来分组进行渲染、进而提高效率,GPU的特点是并行计算快,但是切换状态时很费时间)
1.1》为GPU绑定顶点数据、
1.2》设置vertixshader和pixelshader的参数
1.3》执行shader程序(这里面可以作一些特效)
2》post effect特效
6、播放一帧音效、音乐
六、静态结构
client端的代码基本上可以包括以下组件:
GUI(游戏内的悬浮button等)、渲染、场景管理、动画、粒子、物理模拟、AI、网络、窗口界面(qt等)、音效、脚本、IO事件、game框架、摄像机管理、player封装等
发表评论
-
camunda 源代码解析(一)
2020-03-06 17:53 2953壹 基本概念 一、任 ... -
spring cloud gateway 分析一 主流程和层次
2020-02-14 19:27 550一、debug的调用栈如下: DispatcherHand ... -
B端产品学习笔记
2018-12-01 22:25 803B端产品学习笔记 一、B端产品分类:协作办公 即时通讯 企 ... -
大数据、数据仓库和ETL
2018-07-27 20:50 4386一、背景 大量原来线下的业务电子化之后,产生了 ... -
单机与分布式的组件差异
2018-07-25 15:51 709一、单机程序 1、用内存进程队列实现解耦合和异步 ... -
大数据数据仓库 《大数据之路:阿里巴巴大数据实践》 读书笔记
2018-07-17 18:11 856一、基本概念 1 ... -
ElasticSearch 三 建立索引快的原因
2018-07-09 18:02 834https://blog.csdn.net/u010994 ... -
ElasticSearch 二 查询快的原因
2018-07-09 17:25 2459https://www.jianshu.com/p/ ... -
ElasticSearch 一 基本概念
2018-07-09 17:22 5021、Indices 索引,类似于mysql的Database ... -
后端技术的演化
2018-01-05 18:04 558一、应用分类: 数据库交易类、数据处理(大数据、机器学习、 ... -
pandas 小技巧
2018-01-05 17:34 5911、筛选数据 complaints[['Complaint ... -
区块链技术概览
2017-12-05 16:47 1520区块链技术概览 一、 ... -
区块链技术概览
2017-12-05 16:44 23写道 区块链技术概览 ... -
c++以太坊编译
2017-12-04 16:22 710c++以太坊编译 https://github.com/ ... -
编译solc
2017-12-01 17:27 3646git clone https://github.com/ ... -
深度学习思考和理解 一 统计学和信息论
2017-09-18 11:00 8661、世界是不确定的,所有的函数表达式y=f(x) 只在理论中 ... -
基于camunda的工作流开发
2017-07-11 09:21 14873一、定义 工作流(Wor ... -
数据挖掘概览
2017-06-30 17:22 572数据、信息、知识、智 ... -
服务端相关技术总结
2017-06-16 10:38 432服务端相关技术总结 在实际产品中,主要涉及到的计算 ... -
django源代码解析
2017-06-08 11:12 907一、wsgi: webserver与app ...
相关推荐
Unity3D开发的MMORPG游戏服务器和客户端 Unity3D开发的MMORPG游戏服务器和客户端源码,服务端是用PhotonServer开发,全部解压后900多mb。 所以请不要商用,仅限学习使用
学生可以通过这个项目深入理解游戏开发的全貌,包括游戏逻辑设计、3D建模、动画系统、网络编程以及服务器架构等多方面知识。同时,这也能锻炼团队协作和项目管理能力,因为大型游戏项目往往需要多人协同开发。 在...
在本项目中,我们关注的是一个使用C#编程语言和Unity3D引擎开发的网络角色扮演游戏(MMORPG)的本科毕业设计。这个设计涵盖了游戏开发的多个关键方面,包括客户端、服务器端以及两者之间的通信机制。以下是这个项目...
Unity 3D支持UNET网络框架,用于处理客户端-服务器通信和游戏状态同步。开发者需要理解如何利用UNET编写网络代码,确保游戏的稳定性和公平性。 2. **角色系统**:RPG游戏中的角色通常有复杂的属性、技能和装备系统...
Unity引擎是游戏开发领域广泛使用的工具,尤其在3D游戏开发中占据主导地位。它支持多平台发布,包括Windows、Mac、iOS、Android以及各大游戏主机,拥有强大的物理引擎、光照系统和可视化脚本工具,使得非编程背景的...
网页MMORPG游戏则是指无需下载客户端,通过浏览器即可直接访问并游玩的MMORPG游戏。 ##### 2.1 特点 - **跨平台性**:玩家可以使用不同的设备(如PC、平板电脑等)进行游戏。 - **低门槛**:相较于传统的客户端游戏...
今天我们将深入探讨“MMORPG永恒大陆”——Eternal Lands的112版源码,这是一份包含了客户端和地图编辑器的珍贵资料。 Eternal Lands是一款基于Web的MMORPG,以其丰富的角色扮演元素和独特的世界观吸引了众多玩家。...
总的来说,通过分析"unity+kbengine开发的mmorpg网络游戏demo源码",我们可以深入学习到Unity3D的图形编程、游戏逻辑实现,以及KBEngine的网络架构和服务器编程。这不仅有助于我们掌握游戏开发的技术细节,还能提高...
本项目以C#编程语言为依托,深入探讨了如何利用Unity3D引擎构建一款网络角色扮演游戏(MMORPG)的全过程。以下将详细解析其中涉及的关键知识点。 1. Unity3D引擎基础:Unity3D提供了丰富的图形渲染、物理引擎、碰撞...
Unity是一款强大的跨平台游戏开发引擎,广泛用于创建2D和3D游戏,包括大型多人在线角色扮演游戏(MMORPG)。"uMMORPG插件包"是一个专门为Unity设计的工具集,旨在简化开发多人在线游戏的过程,特别是MMORPG类型的...
这涉及到客户端-服务器架构,确保玩家的动作在所有客户端间同步,防止作弊,并处理延迟问题。 5. **AI(人工智能)**:非玩家角色(NPCs)的行为由AI控制,包括基本的路径寻路和复杂的交互行为。AI的设计可以使用...
2. **网络架构**:MMORPG的核心是支持大量的并发用户,因此网络架构的设计至关重要。开发者需要考虑服务器的分布式部署、负载均衡、数据同步策略(如时间切片、延迟同步等)以及如何处理玩家间的交互。 3. **客户端...
它的高效性和灵活性使得C++成为制作大型游戏,特别是MMORPG的理想选择,能够满足高性能计算和复杂系统架构的需求。 在“www.mmorpg.com-master”这个压缩包中,我们可以推测出这是一个开源的MMORPG项目源码,包含...
开发者可以从客户端源码中学习游戏引擎的使用、UI设计、3D模型和动画的处理。 3. **数据库脚本**:游戏中的角色信息、道具、任务等数据通常存储在数据库中。源码中的数据库脚本会揭示如何设计数据库结构,如何进行...
开发这样一个MMORPG客户端,开发团队需要关注以下几个技术点: - **网络同步**:实现客户端与服务器之间的实时通信,处理玩家的动作、状态同步,确保游戏世界的公平性和一致性。 - **性能优化**:优化图形渲染、...
GMRJ的服务器/客户端架构是MMORPG的关键,它要求高效的数据同步和网络通信,Java的Socket编程和多线程支持有助于实现这一目标。 地图和游戏元素的生产是GMRJ的另一大亮点。这通常涉及到2D或3D图形渲染、地形生成...
在当今的Web开发领域,JavaScript已经从一个简单的客户端脚本语言发展成为构建复杂应用的核心工具。"JSMMORPG"项目就是一个典型的例子,它展示了如何利用JavaScript技术来创建一个大型多人在线角色扮演游戏...
3. **游戏引擎架构**:GameOfMir引擎可能采用了常见的游戏引擎架构,如客户端-服务器架构,其中客户端负责用户界面和交互,而服务器端处理游戏逻辑、玩家状态和世界状态。 4. **服务器端开发**:引擎的服务器部分...
- 这将涉及到服务器端和客户端的编程,数据库设计,网络架构,以及复杂的用户交互和社交系统。 学习过程中,梁健雄参考了多本专业书籍,如《Visual C++游戏设计》、《Visual C++网络游戏建模与实现》、《Java游戏...
网络游戏的发展历程见证了互联网技术的进步,从早期的文字MUD(多用户地下城)到如今的3D大型多人在线角色扮演游戏(MMORPG),以及各种类型的竞技游戏、策略游戏和休闲游戏。 网络游戏的核心在于网络接触器,这是...