![]() |
1
6
您应该首先阅读并理解“固定时间步”游戏循环(以下是一个很好的解释: http://www.gaffer.org/game-physics/fix-your-timestep ) 然后,您要做的是保存一个帧计数器和操作对列表。STL示例:
或者可能是成对列表的向量。要创建状态,对于每个动作(玩家交互),您都会存储帧号和执行的动作,如果动作只是“按键”<x>按下”或“按键”<x>释放,则最有可能获得最佳结果:
要回放以前的状态,每次播放器激活时间机器时都必须重置帧计数器,然后遍历每个以前状态的状态列表,查看是否有与当前帧匹配的。如果存在,则执行该状态的操作。 为了优化,可以将迭代器的列表保存到每个前一状态列表中的位置。这里有一些 伪码 为此:
我希望你能明白… 单独的线程只会使事情变得非常复杂,这样每次都会得到相同的结果,这是无法通过使用单独的线程(无法真正了解如何实现)或非固定时间的步骤游戏循环来保证的。 当涉及到图形API时,我会使用SDL,因为它可能是最容易让您入门的东西。如果您想使用3D,以后可以使用SDL中的OpenGL。 |
![]() |
2
5
这听起来很像 Braid . 你真的不想为这个并行处理-并行编程是 坚硬的 对于这样的事情,性能不应该是一个问题。 由于游戏状态向量的增长速度非常快(可能以每秒几千字节的速度增长,这取决于帧速率和存储的数据量),因此您不需要链表,因为链表在空间方面开销很大(如果布局不好,可能会因缓存未命中而带来很大的性能损失)。对于每个平行时间线,您需要一个向量数据结构。可以将每个平行时间线存储在链接列表中。每个时间线都知道它何时开始。 要运行游戏,您需要迭代所有活动的时间线,并在lockstep中从每个时间线执行一帧的操作。不需要并行处理。 |
![]() |
3
1
我以前玩过这个游戏。我不认为并行处理是可行的。您在游戏中共享了需要在进程之间共享的对象(杠杆、盒子、电梯等),可能是每个增量,从而降低了并行性的有效性。 我个人只需要保留一个操作列表,然后在随后的每个迭代中开始将它们交织在一起。例如,如果列表的格式为<[iteration.action]>,则第三次到将执行操作1.1、2.1、3.1、1.2、2.2、3.3等。 |
![]() |
4
0
在对描述进行简单的说明之后,我认为您的想法是正确的,我将有一个保存状态数据的状态对象,并将其放入一个链接列表中…我认为您不需要并行线程… 至于图形API,我只使用OpenGL,并且可以说它是相当强大的,并且有很好的C/C++ API,OpenGL也会更跨平台,因为你可以在*NIX计算机上使用MISA库。 |
![]() |
5
0
一个非常有趣的游戏想法。我认为你是对的,Parrellel计算将有利于这一设计,但不比任何其他高资源程序。 这个问题有点含糊不清。我看到你要用C++写这个,但是你为它编写了什么操作系统呢?您是否打算将其作为跨平台,以及您希望使用哪种图形,即3D、2D、高端、基于Web。 所以基本上我们需要更多的信息。 |
![]() |
6
0
并行处理不是答案。你应该简单地“记录”玩家的动作,然后在“之前的动作”中播放它们。 因此,创建一个向量(单独链接的列表)来保存动作。只需存储执行操作的帧编号(或delta),并在表示该特定实例期间的播放机的“虚拟bot”上完成该操作。您只需循环遍历状态并逐个触发它们。 当一个状态悖论仅仅因为下一个操作失败而发生时,你会得到一个容易“打破”游戏的副作用。 |
![]() |
Developer · DirectX:在向量缓冲区中存储多个顶点 7 年前 |
|
Eugen · 如何检查是否使用了真正的硬件视频适配器 7 年前 |
![]() |
IAS0601 · Directx阴影映射 7 年前 |
![]() |
Dev.K. · 处理3D动画图形着色器和相同3D动画GIF的差异 7 年前 |