我正在尝试为实时3D游戏创建一个C++插件.虽然我相信对UDP的理论,它是如何工作的,它的优点和缺点有一个坚定的把握,但我关注的主要问题是性能,可扩展性和可能的统计数据.我知道,在UDP甚至TCP方面,我可能只知道海洋的价值下降.
问题:
在某种情况下,典型的专用服务器在任何时候都能够应对多少玩家.
现在为场景......
让我们假设我们有一个MMORPG游戏,所有玩家都可以在"游戏世界"的任何地方.每个人都向同一个服务器/服务器中心发送和接收数据,因为每个人都必须能够......在他们的路径最终交叉时看到并与其他人互动.这是一个实时的第一人称游戏,所以玩家的位置必须是最新的,非常及时.
让我们说我们有1000名(甚至10000名)在线玩家......
这里需要做三件事:
每个玩家通过UDP将其数据流式传输到游戏服务器,例如每秒14次发送.简而言之,这些数据包括每个玩家的身份,地点和内容.发送的数据已经过标准化,并针对大小和速度进行了优化,以鼓励最小的带宽使用.
服务器每秒14次接收这些分组多达1000个(用于演示目的的非虚构图),因此每秒处理14 000个分组.该处理阶段通常涉及更新中央存储器数据结构,其中玩家旧的x,y,z位置数据将用他的新位置和时间戳更新.服务器上的此数据结构包含整个游戏世界中所有玩家的所有数据.
服务器(可能是一个单独的线程,甚至可能是一个单独的机器)现在需要将数据包广播给所有其他玩家,因此他们可以更新他们的屏幕以显示地图上的其他玩家.这也是每秒发生14次.(其中14可能通常是动态数字,根据使用的CPU容量,繁忙的CPU,较少的帧速率而反之亦然).
重要的是:对于玩家X,只有他位置的视觉范围内的其他玩家的数据被发送到相应的玩家.因此,如果玩家Y在2英里外,他的数据需要发送到X,但如果玩家Z在行星的另一边,他的数据不会被分派到X作为节省带宽的尝试.这当然涉及更多的处理,因为必须使用最有效的索引解决方案来迭代和过滤数据.
现在我担心的是,从客户端机器发送数据包,将其送入服务器RAM,稍微处理更新数据,并选择性地将信息广播给其他玩家,需要时间.这意味着,服务器能够处理某个阈值,是的,取决于我的实现的有效性,所用硬件的速度和能力,当然还有其他外部因素,如互联网速度,交通和nr.太阳耀斑每秒击中地球......开个玩笑.
我试图从其他人那里了解,他们已经完成了这个过程,陷阱是什么,以及在创建多人插件时我可以期待的典型表现.
我可以很容易地说:"我想要同时为同一台服务器上的10000个人提供服务",你可能会说:"每个服务器100个是更现实和可能的数字."
所以我知道我可能需要提出一个多服务器/云计算中心来处理我的数千个请求和调度,在多台机器上分配处理负载.所以我可能有一些机器只处理接收数据,一个巨大的中央盒子,就像所有接收和调度机器以某种方式共享的内存数据库,当然还有一系列调度机器.
显然,存在技术限制,我真的不知道会发生什么以及它们是什么.并且在问题上抛出额外的CPU和服务器盒将不会成功地解决问题,因为机器之间的更多相互通信也将使该过程减慢一些.我认为你投入的CPU越多,可能会降低效率甚至在某个阈值时反转CPU工作效率.
可以而且我应该考虑P2P(Peer To Peer)进行多人游戏!
我是否现实地说我能够在任何时候满足2500名玩家的需求?
几年后可以扩展到10000名玩家吗?
我知道这个问题很长,所以请接受我真诚的道歉.
我正在开发一个多人角色扮演游戏,(不,它不是mmorpg.;)
我目前的设置是这样的.
客户端告诉服务器"我想继续前进"/"我想向后移动",服务器然后更新您的实体,并通知该区域内的所有客户有关更改.服务器还每20ms更新一个实体,并每隔100ms向客户端发送更新,这些更新包含位置,速度,旋转等.
到目前为止一切都那么好,但是我没有任何东西用于平滑客户端数据包之间的移动,我必须说,我无法让它工作.我一直在阅读有关预测,插值,死劫的内容,但对我来说这一切都很糟糕.
所以现在我正在做一些像"Position = Packet.Position"这样的事情,这会导致一个非常令人口吃的动作.
那么,我想要的帮助是,我如何获得更平稳的运动?一直在看XNA预测样本,但我无法做到正确.
谢谢// F.
我正在尝试使用游戏中心:多人游戏
到目前为止,玩家正在认证游戏中心,他们可以发送/读取分数和成就.对于多人游戏功能,我尝试了两种方法: - 使用游戏中心界面查找匹配项. - 以编程方式查找匹配项.
对于这两种方式,我有以下问题:匹配委托的匹配:player:didChangeState:方法未被调用.在apple docs中,声明如果一个玩家连接或断开连接,则会调用该委托.
在我的情况下,这个委托永远不会被调用.我想我错过了一步.在我的委托实施后(如Apple doc中所述).
- (void)match:(GKMatch *)match player:(NSString *)playerID didChangeState:(GKPlayerConnectionState)state
{
switch (state)
{
case GKPlayerStateConnected:
// handle a new player connection.
break;
case GKPlayerStateDisconnected:
// a player just disconnected.
break;
}
if (!self.matchStarted && match.expectedPlayerCount == 0)
{
self.matchStarted = YES;
// handle initial match negotiation.
}
}
Run Code Online (Sandbox Code Playgroud)
以及找到匹配的代码.
-(void) findProgrammaticMatch
{
GKMatchRequest *request = [[[GKMatchRequest alloc] init] autorelease];
request.minPlayers = 2;
request.maxPlayers = 2;
[[GKMatchmaker sharedMatchmaker] findMatchForRequest:request
withCompletionHandler:^(GKMatch *FoundMatch, NSError *error)
{ …Run Code Online (Sandbox Code Playgroud) 您认为WCF提供了开箱即用的必要管道,以支持在线多人游戏体验吗?特别是ala WoW,Ultima Online等的实时环境为什么或者为什么?
最重要的考虑因素可能是:
包含的绑定是否适合此类场景?
除了任何物理服务器要求,包含的绑定是否符合性能要求?
只是在寻找你对此事的看法!
谢谢
我目前正处于移动设备2D游戏的规划阶段,我将使用cocos2d-x在C++中制作.游戏将基于回合,并且每个回合将具有进行物理模拟的阶段.它也将是跨平台的.
我是多人网络的新手,我想知道同步物理的最佳方法是什么,因为Box2d在不同设备上的行为并不完全相同.
模拟不必同时在每个设备上进行,但我确实需要结果完全相同.理想情况下,玩家将能够在他们自己的设备上见证相同的物理模拟(即射弹运动,弹跳,碰撞)以及在他们决定开始轮到他们的对手时发生的结果.
最好的方法是什么?根据我的研究,我提出了几个解决方案.我应该编写一些服务器代码,我将在其上接受用户输入并处理所有物理模拟,然后将结果发送到每个设备?或者有没有办法在一台设备上处理模拟并将所有信息发送给另一台设备?
另外,为什么一个人通过网络发送模拟过程中发生的一切,因为我无法在每个设备上运行模拟并保证得到相同的结果?我是否只需要使用每隔几个TimeSteps发生的信息更新服务器(或设备)?
我还会考虑实现自己的物理/碰撞检测.
我正在制作一个多个玩家应该能够一次玩的游戏.这是一个2D游戏,所有角色应该能够看到对方在屏幕上移动.就像游戏一样,现在所有的设备都只是发布并将其他人提取coordinates到服务器.这是通过运行到线程来完成的:
public void StartCoordinatorFetcherThread(final Sprite Object)
{
Thread CoordinateStarter = new Thread()
{
public void run()
{
while(true)
{
Object.testing = Object.InternetObject.GetMessages();
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
CoordinateStarter.start();
}
public void StartCoordinatorPosterThread(final Sprite Object)
{
Thread CoordinatePoster = new Thread()
{
public void run()
{
while(true)
{
Object.InternetObject.PostCoordinates(Object.x,Object.y);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
CoordinatePoster.start();
}
Run Code Online (Sandbox Code Playgroud)
无论如何,我希望角色能够更顺利地移动,因为它可以"laggy"像这样做.有人知道如何实现这个目标吗?
也许我应该有一种坐标堆栈,它只是一直推动坐标,然后在游戏运行时弹出值?
任何帮助将受到高度赞赏. …
这种反作弊技术是否适用于使用私人服务器的多人游戏(公开未知的可执行文件):
当客户启动游戏时,它将每天自动更新(使用启动器).服务器也会自行更新.除非有真正的补丁,否则更新仅包含游戏对象内存布局,网络代码和着色器中的更改.这是使用自动生成和随机化(C++)类的自动化系统完成的.也许它还可以在层次结构中添加假对象,以使识别对象更难.
这样我希望比破解者更快地更新游戏,并且将反向工程,更新和发布/更新新的作弊.
这会起作用还是黑客能以某种方式解决这个机制?他们会每天做这项工作还是可以在某些时候自动完成?我该怎么做才能改进这个系统?
似乎随机化内存布局在长期内没有帮助,因为可以通过跟随可执行文件中的函数调用并从该代码中提取指针偏移来或多或少地轻松地提取布局.因此,为了有效地防止这种情况,调用结构和代码本身也需要随机化.
有没有很好的方法呢?这对自动化破解是否有效?
我正在尝试为我的坦克游戏2D(Unity)构建一个在线游戏服务器.在我的游戏中,将有2-4名玩家控制他们的坦克并互相争斗.
我试过使用Unity网络,它不适合我的游戏,因为我们必须选择房间里的1个玩家成为"服务器",这对我未来的发展来说并不是很灵活(例如当"服务器"退出,我必须做很多工作来保持其他玩家之间的联系).
然后我尝试用Nodejllàsocket.io构建我自己的服务器,用于服务器 - 客户端通信.它非常简单:从一个接收数据并将其广播到其他人.它似乎工作正常,直到物理部分进入:服务器必须信任客户端,当他们说有什么东西被击中或爆炸,然后广播到其他客户端.更不用说受骗的客户端,由于网络延迟,客户端的物理模拟会有所不同.例如,一个坦克可能会被撞到这个客户端,但它应该被覆盖在另一个的墙后面并保持活着,但是由于潜伏期,他身后的坦克会抓住子弹并爆炸.在这些情况下,服务器不知道要收听哪一个.
总之,我需要一个关于我的游戏服务器的建议:
我是否正确的方向,因为看起来像一些游戏服务器服务(如Photon,Unity网络)只是不关心如何在服务器上实现游戏逻辑.它是否使它们不是权威服务器?
我对这个领域很新,任何事都会受到赞赏!
我们发送邀请时遇到问题GKGameCenterViewController.视图控制器打开就好了,但是当我们尝试向某人发送邀请时,它会立即失败.两个帐户都启用了游戏中心邀请,并通过GKGameViewController工作找到其他玩家.这是我们用来管理邀请的代码:
一旦GKLocalPlayer经过身份验证就调用此方法(从中调用身份验证GameViewController,此代码位于单独的Game Center管理类中):
internal func authenticationChanged() {
if GKLocalPlayer.localPlayer().authenticated && !authenticated {
print("Authentication changed: player authenticated")
authenticated = true
GKLocalPlayer.localPlayer().unregisterAllListeners()
GKLocalPlayer.localPlayer().registerListener(self)
} else {
print("Authentication changed: player not authenticated")
authenticated = false
GKLocalPlayer.localPlayer().unregisterAllListeners()
}
}
Run Code Online (Sandbox Code Playgroud)
这是收到邀请时应该调用的方法,尽管考虑到邀请一发送就失败就不会调用它.
public func player(player: GKPlayer, didAcceptInvite inviteToAccept: GKInvite) {
//presentingViewController.dismissViewControllerAnimated(false, completion: nil)
print("Accepted invite")
let mmvc = GKMatchmakerViewController(invite: inviteToAccept)!
mmvc.matchmakerDelegate = self
presentingViewController.presentViewController(mmvc, animated: true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)
这两段代码都在符合GKMatchmakerViewControllerDelegate, GKGameCenterControllerDelegate, GKMatchDelegate, GKLocalPlayerListener委托和协议的同一个类中.
我创建了一个以编程方式使用实时多人游戏的游戏.它最初的目标是针对IOS 8设备.最近在迁移到IOS 9后,Game Center引发了很多问题.我无法解决的主要问题是在多人游戏中邀请朋友(用于测试).
从IOS 8到IOS 8.自动匹配工作和朋友邀请工作但是从IOS 9到IOS 9.自动匹配工作和朋友邀请不再起作用.
如果您有任何人设法让IOS 9上的Game Center邀请工作.请引导我走正确的道路.
我目前所知道的:
更新 - 9/10/15 他们关闭了IOS 8的沙盒后.自动匹配已经开始在IOS8和IOS9之间工作.但这位朋友似乎还是个问题.这位朋友也在IOS 8上停止了为我工作.
Game Center回调似乎在不同的线程上运行,导致连接崩溃的几率为80%.解决方案是在主线程上运行代码并解决它.但是线程问题并没有解决朋友的问题.
尝试与朋友请求开始匹配后,它会抛出一个错误,如下所示:
Error Domain=GKErrorDomain
Code=3
"The requested operation could not be completed due to an error communicating with the server."
UserInfo={
GKServerStatusCode=5096,
NSLocalizedDescription=The requested operation could not be completed due to an error communicating with the server.,
NSUnderlyingError=0x136e23230 {
Error Domain=GKServerErrorDomain
Code=5096
"Peer device (type: iPad) does not support a …Run Code Online (Sandbox Code Playgroud) multiplayer ×10
game-center ×3
networking ×3
ios ×2
.net ×1
android ×1
anti-cheat ×1
box2d ×1
c# ×1
c++ ×1
cheat-engine ×1
delegates ×1
friend ×1
game-engine ×1
invitation ×1
ios9 ×1
physics ×1
smoothing ×1
swift ×1
udp ×1
wcf ×1
web-services ×1