我为我的 MMORPG 在线游戏编写了一个代码,我注意到它会导致一些尖峰/延迟,并且功耗和 CPU 持续非常高。
基本上我制作了假玩家。每个“机器人”都像玩家一样行事。它使用循环对每个机器人的某些操作进行工作。代码非常庞大,并且有很多回调。如果我生成大约 300-350 个机器人,则完成所有机器人的平均循环时间为 600-700 毫秒。这意味着重新检查行动会被延迟并且速度不快。它应该每 200 毫秒重新检查一次机器人的操作。但我生成的越多,它的延迟就越多,因此每个机器人都会等到循环完成才能继续。
所以我所做的是将每 300 个机器人(使用自动执行的动态代码)拆分到一个线程池,以便每个 300 组同时执行循环。所以我最终有 600 个机器人,这意味着 2 组 300 个,每组平均 300 毫秒,这还可以,但任务管理器和 CPU 的功耗成本非常高,约为 30-70%。
是否有其他方法可以为许多机器人运行复杂且庞大的代码,而不会给 CPU 使用线程池或任何其他建议带来压力?
在我看来,这像是 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在使用多线程时不会那么高