我有一个相对简单的案例:
棘手的部分是更新需要“原子地”发生,这样它就不会从本地状态读取,例如,只写入了一半的更新。状态不限于使用原语,并且可以包含任意类 AFAICT atm,因此我无法通过使用Interlocked原子操作之类的简单方法来解决它。我计划在其自己的线程上运行每个任务,因此在本例中总共有两个线程。
为了实现这个目标,我想使用双缓冲区技术,其中:
这是这个想法的总体要点,但实际的实现当然会有点不同。
我试图查找这是否是一个常见的解决方案,但找不到太多信息,所以这让我想知道以下内容:
我几乎觉得我已经走进了一个死胡同,我找不到(因为我不知道要搜索什么)更多的资源和信息来看看这种方法是否“好”。我计划用 .NET C# 编写此内容,但我认为这些技术和解决方案可以转换为任何语言。所有见解均受到赞赏。
c# parallel-processing concurrency multithreading multiprocessing
出于好奇,我一直在研究 UDP 网络项目,但我遇到了一个我无法解决的问题。我研究并理解了以下基本原理:
我对 UDP 的大部分知识都来自于这些精彩的文章:https://gafferongames.com/ ;我很幸运能够使用这个库,它基于作者自己的 UDP 协议并负责大部分权威保护。
现在,这是我的问题:
使用完全权威的服务器,玩家似乎仍然可以作弊。
例如:
对于格斗游戏来说,客户端有两个功能。void hit()并且void hurt,这些是让客户端刺激战斗的基本功能。
在场景 1 中:本地玩家击中其他玩家,并将其发送到服务器。然后,服务器向被击中的玩家的客户端发送一个数据包,这将触发该hurt()功能。但如果玩家编辑了文件并删除了伤害功能,就不会发生任何事情。删除了该功能的玩家hurt()将是无敌的。
在场景 2 中: localPlayer 被其他玩家击中并调用hurt(),并将其发送到服务器。然后,服务器将一个数据包发送到命中 localPlayer 的播放器客户端,这将触发该hit()函数。但如果 localPlayer 编辑了文件并删除了该hurt()功能,则不会发生任何情况。删除该功能的玩家hurt()将再次无敌。
我只能想到两个解决方案:
如果游戏遇到错误(因为某个功能被删除并且不存在),请断开客户端与服务器的连接。(不太好)
我在写这篇文章时想到了这一点,这可能是我的解决方案:为服务器上的每个玩家存储一个健康变量,如果它达到 0,则忽略如果游戏未编辑则不可能的任何数据包。
现在,第二个解决方案对我来说听起来不错,但我很好奇你们会做什么/会做什么,因为我是一个纯粹的初学者。很高兴听到任何建议,谢谢!