gpt4 book ai didi

java - AsyncExecutor 看起来不是异步的

转载 作者:行者123 更新时间:2023-11-30 10:34:12 25 4
gpt4 key购买 nike

这个问题已经过编辑,以提供尽可能多的关于问题的信息,正如有人建议我应该做的那样。既然有赏金——这似乎是正确的做法。祝大家好运!

如果您觉得我没有包含某些内容,请不要忘记您可以随时提出其他问题!

简介

我正在开发一个系统,当一个角色使用各种不同的噪音四处走动时,它会按程序生成地形——主要是 perlin-simplex-noise .世界本身具有三个维度,尽管它被视为 top-down in two dimensions在游戏中。

对于那些习惯于程序生成地形的人来说,您会意识到使用多线程是必要的,以免在渲染器线程中造成延迟峰值。在 LibGDX 的帮助下,这正是我一直在尝试做的事情的 AsyncExecutor , 以及同一个图书馆的 AsyncTask ,这是在 AsyncExecutor 提供的线程上运行的任务。

问题

我的问题是 AsyncExecutor 看起来根本不是异步的。它会在我的渲染器线程中导致滞后峰值,理论上这可能是由于它使用了渲染器线程也使用的资源。然而,问题是渲染器线程会生成新的“ block ”——我称之为区域——然后 AsyncExecutor 会处理这些 block 。在 AsyncExecutor 完全生成资源之前,渲染器线程不允许渲染该资源。

区域处理器

我有一个名为 RegionHandler 的类,它在玩家移动的方向放置新区域并从相反的方向移除区域——为了让程序不必知道超过 13 x一次 9 个区域。

这里有一段简短的代码,解释了它是如何工作的——注释是为了简化对代码不同部分的讨论:

// These ‘if’s are triggered when the player moves
// to a certain position
if(addLeft)
{
// Adds new regions to the left and removes to the right
// ...

// Submit ‘RegionLoader’ task to ‘asyncExecutor’
// with regions that needs be generated as well as ‘toSends’ which is
// also part of that generation
asyncExecutor.submit(new RegionLoader(toGenRegions, toSends));
}
else if(addRight)
{
// Adds new regions to the right and removes to the left
// ...

// Same as previous ‘submit’ to the ‘asyncExecutor’
asyncExecutor.submit(new RegionLoader(toGenRegions, toSends));
}

if(addBottom)
{
// Adds new regions to the bottom and removes to the top
// ...

// Same as previous ‘submit’ to the ‘asyncExecutor’
asyncExecutor.submit(new RegionLoader(toSend, toSends));
}
else if(addTop)
{
// Adds new regions to the top and removes from the bottom
// ...

// Same as previous ‘submit’ to the ‘asyncExecutor’
asyncExecutor.submit(new RegionLoader(toSend, toSends));
}

asyncExecutor其实就是AsyncExecutorRegionLoader实现了AsyncTask接口(interface)。我已经测试过这段代码需要多长时间才能运行 - 这段代码的运行时间从未超过一毫秒。

Region 在列表中处理:

List<List<Region>> regions;

区域加载器

此类是一个任务,具有由 AsyncExecutor 运行的能力。

private class RegionLoader implements AsyncTask<Object>
{
private List<Region> regions;
private List<ToSendInner> toSends;

public RegionLoader(
List<Region> regions,
List<ToSendInner> toSends)
{
this.regions = regions;
this.toSends = toSends;
}

@Override
public Object call() throws Exception
{
// Generates the ‘Region’s it has been given inside the constructor
// ...

return null;
}
}

一旦 call() 完成,它会将一个 boolean 设置为 true 以允许呈现特定的 Region

此外

尽管 AsyncExecutor 是异步的,但它偶尔会在渲染器线程内引起延迟峰值。如前所述,这可能是由于 AsyncExecutor 使用与渲染器线程相同的资源,但渲染器线程仅在允许时渲染 Region——为此我不明白为什么这就是导致延迟峰值的原因。

到目前为止我尝试了什么

我试过使用常规 Java 线程,但是 I read somewhere由于 LibGDX 支持 Android 开发并且 Android 在多线程方面不具备相同的功能,因此这些可能无法正常工作——但我可能真的错了!

此外

也许有人在他们的游戏开发生涯中遇到过类似的问题?如果是这样,也许有人可以指出正确的方向?

最佳答案

我会查看您的垃圾收集的效果,因为您似乎正在将新的 Region 对象传递给任务。尝试重新使用/重新填充现有区域。

关于java - AsyncExecutor 看起来不是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41785799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com