避免并发修改

Avoiding Concurrent Modification

假设我正在制作一款游戏,其中屏幕在帧速率限制内尽可能频繁地更新,但对象仅在游戏时钟上更新。如何在不冒并发修改风险的情况下渲染复杂对象?例如,如果我需要渲染引擎访问有关 class 对象的详细信息以做出图形决策,而这些对象可能会同时被游戏引擎更改。

我想在渲染之前对对象进行深度复制是可行的,但在复制过程中不会发生同样的问题吗?我假设在逐个复制数组列表时编辑它会导致问题。正是在这样的时候,我假设有一些我只是不知道的行业标准。

这是一个复杂的问题,但我会尽量给你一些我在处理这个问题时发现的建议。首先是数组和列表的问题。我发现有用的是根据您用来保存对象的列表生成一个新列表。这样您只需要在创建新列表时小心编辑列表即可。完成后可以丢弃创建的列表。如果可以的话,还要避免从列表中删除项目或更改它们在列表中的位置。这使得引入并发问题变得容易得多。

现在是渲染问题。假设您一次只有一个线程渲染。我发现创建一个保持更改并在每个渲染周期结束或开始时进行实际更改的对象很有用,这样您可以随时更改对象,但更改直到下一个渲染周期才会生效。