小编Bur*_*tto的帖子

使用双缓冲区技术进行并发读写?

我有一个相对简单的案例:

  1. 我的程序将通过 Websockets 接收更新,并将使用这些更新来更新其本地状态。这些更新将非常小(通常 < 1-1000 字节 JSON,因此反序列化 < 1 毫秒),但会非常频繁(高达 ~1000/s)。
  2. 同时,程序将从该本地状态读取/评估并输出其结果。
  3. 这两个任务应该并行运行,并且将在程序的持续时间内运行,即永远不会停止。
  4. 本地状态大小相对较小,因此内存使用量不是一个大问题。

棘手的部分是更新需要“原子地”发生,这样它就不会从本地状态读取,例如,只写入了一半的更新。状态不限于使用原语,并且可以包含任意类 AFAICT atm,因此我无法通过使用Interlocked原子操作之类的简单方法来解决它。我计划在其自己的线程上运行每个任务,因此在本例中总共有两个线程。

为了实现这个目标,我想使用双缓冲区技术,其中:

  1. 它保留状态的两份副本,以便在写入另一份时可以读取一份。
  2. 线程可以通过使用锁来传达它们正在使用哪个副本。即 Writer 线程在写入时锁定副本;读取器线程在完成当前副本后请求访问锁;编写器线程看到读取器线程正在使用它,因此它切换到其他副本。
  3. 写入线程会跟踪在当前副本上完成的状态更新,因此当它切换到另一个副本时,它可以“赶上”。

这是这个想法的总体要点,但实际的实现当然会有点不同。

我试图查找这是否是一个常见的解决方案,但找不到太多信息,所以这让我想知道以下内容:

  1. 它可行吗,还是我错过了什么?
  2. 有更好的方法吗?
  3. 这是一个通用的解决方案吗?如果有的话,通常被称为什么?
  4. (奖励)是否有一个好的资源可供我阅读与此相关的主题?

我几乎觉得我已经走进了一个死胡同,我找不到(因为我不知道要搜索什么)更多的资源和信息来看看这种方法是否“好”。我计划用 .NET C# 编写此内容,但我认为这些技术和解决方案可以转换为任何语言。所有见解均受到赞赏。

c# parallel-processing concurrency multithreading multiprocessing

5
推荐指数
1
解决办法
1235
查看次数

可以采取什么措施来防止多人黑客攻击?

出于好奇,我一直在研究 UDP 网络项目,但我遇到了一个我无法解决的问题。我研究并理解了以下基本原理:

  1. 使用权威服务器,并给予客户端尽可能少的权限。
  2. 确保服务器使用其自己的加密密钥唯一地标识每个客户端。
  3. 通过膨胀响应数据包来阻止 DDOS 攻击。
  4. ETC..

我对 UDP 的大部分知识都来自于这些精彩的文章:https://gafferongames.com/ ;我很幸运能够使用这个,它基于作者自己的 UDP 协议并负责大部分权威保护。

现在,这是我的问题:

使用完全权威的服务器,玩家似乎仍然可以作弊。

  • 例如:

    对于格斗游戏来说,客户端有两个功能。void hit()并且void hurt,这些是让客户端刺激战斗的基本功能。

    在场景 1 中:本地玩家击中其他玩家,并将其发送到服务器。然后,服务器向被击中的玩家的客户端发送一个数据包,这将触发该hurt()功能。但如果玩家编辑了文件并删除了伤害功能,就不会发生任何事情。删除了该功能的玩家hurt()将是无敌的。

    在场景 2 中: localPlayer 被其他玩家击中并调用hurt(),并将其发送到服务器。然后,服务器将一个数据包发送到命中 localPlayer 的播放器客户端,这将触发该hit()函数。但如果 localPlayer 编辑了文件并删除了该hurt()功能,则不会发生任何情况。删除该功能的玩家hurt()将再次无敌。

我只能想到两个解决方案:

  1. 如果游戏遇到错误(因为某个功能被删除并且不存在),请断开客户端与服务器的连接。(不太好)

  2. 我在写这篇文章时想到了这一点,这可能是我的解决方案:为服务器上的每个玩家存储一个健康变量,如果它达到 0,则忽略如果游戏未编辑则不可能的任何数据包。

现在,第二个解决方案对我来说听起来不错,但我很好奇你们会做什么/会做什么,因为我是一个纯粹的初学者。很高兴听到任何建议,谢谢!

c# unity-game-engine

4
推荐指数
1
解决办法
1270
查看次数