除了线程池还有其他方式吗?

问题描述 投票:0回答:1

我为我的 MMORPG 在线游戏编写了一个代码,我注意到它会导致一些尖峰/延迟,并且功耗和 CPU 持续非常高。

基本上我制作了假玩家。每个“机器人”都像玩家一样行事。它使用循环对每个机器人的某些操作进行工作。代码非常庞大,并且有很多回调。如果我生成大约 300-350 个机器人,则完成所有机器人的平均循环时间为 600-700 毫秒。这意味着重新检查行动会被延迟并且速度不快。它应该每 200 毫秒重新检查一次机器人的操作。但我生成的越多,它的延迟就越多,因此每个机器人都会等到循环完成才能继续。

所以我所做的是将每 300 个机器人(使用自动执行的动态代码)拆分到一个线程池,以便每个 300 组同时执行循环。所以我最终有 600 个机器人,这意味着 2 组 300 个,每组平均 300 毫秒,这还可以,但任务管理器和 CPU 的功耗成本非常高,约为 30-70%。

是否有其他方法可以为许多机器人运行复杂且庞大的代码,而不会给 CPU 使用线程池或任何其他建议带来压力?

java
1个回答
0
投票

在我看来,这像是 ForkJoinPool 的工作...... 假设您有自己的机器人:

class Bot {
  public void exe() {
    // Implementation of the exe method
    System.out.println("Executing bot: " + this);
  }
}

您的机器人在列表中:

 List<Bot> bots = IntStream.range(0, 10)
                              .mapToObj(i -> new Bot())
                              .collect(Collectors.toList());

然后创建一个 BotTask:

class BotTask extends RecursiveAction {
private static final int THRESHOLD = 10;
private final List<Bot> bots;
private final int start;
private final int end;

public BotTask(List<Bot> bots, int start, int end) {
    this.bots = bots;
    this.start = start;
    this.end = end;
}

@Override
protected void compute() {
    if (end - start <= THRESHOLD) {
        for (int i = start; i < end; i++) {
            bots.get(i).exe();
        }
    } else {
        int mid = (start + end) / 2;
        BotTask leftTask = new BotTask(bots, start, mid);
        BotTask rightTask = new BotTask(bots, mid, end);
        invokeAll(leftTask, rightTask);
    }
}
}

然后是像 main 一样使用 ForkJoinPool 的东西

public class ForkJoinExample {
public static void main(String[] args) {
    ForkJoinPool pool = new ForkJoinPool();
    BotTask task = new BotTask(bots, 0, bots.size());
    pool.invoke(task);
}
}

这样也许CPU在使用多线程时不会那么高

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.