2

我正在使用 MonoGame,但这更多地与 winrt 异步和 IO 相关,所以请不要重定向到 gamedev。

我想异步加载游戏内容,以便更新加载屏幕的进度。我将每个 ContentManager.Load 调用放在一个 Task 中,然后放在我的 BeginLoading 方法中,我只是遍历所有任务并一次性启动它们。

到目前为止,这似乎在我的测试中有效,但我的问题是这是否可以扩展。

如果我为异步添加 100 个资产,这将分拆 100 个任务,这些任务将同时从磁盘 al 中读取。WinRT 可以这样扩展吗?

事实上,我是否应该将任务数量限制为核心/物理胎面的数量?还是我应该只有一个活动任务?

4

1 回答 1

1

创建 100 个任务不一定会启动 100 个同时执行的并发线程。您受限于可用的池线程数量,以及 TPL 的东西是并发运行的合理数量的任务。在 4 核机器上,您可能不会获得超过三个或四个并发任务。

也就是说,您最好启动一个任务,然后遍历您的资产列表并一次加载它们。由于多个线程向同一个驱动器发出 I/O 请求,这些线程很可能会花费大量时间在磁盘上等待,并且不会在并发处理方面做太多事情。让许多线程进行加载几乎没有任何好处,因为它们大部分时间都处于空闲状态。如果您发现您的多个加载程序线程比您启动一个一次加载所有资产的单个线程需要更长的时间来完成,我不会感到惊讶。

我不明白创建 100 个单独的任务,每个任务加载一个资产,比按顺序加载这 100 个资产的单个任务更容易编码。我想不出你怎么能创建这样的数据结构。

简而言之,您不必将任务数量限制为可用内核的数量;TPL 将为您做到这一点。但是你最好只做一个任务。充其量,使用多个并发线程会稍微好一点,但这不太可能。

于 2013-07-26T03:22:42.003 回答