gpt4 book ai didi

Java代码似乎只使用了两个并发线程

转载 作者:行者123 更新时间:2023-11-29 05:57:25 26 4
gpt4 key购买 nike

我有大约 40000 个对象可能需要重新绘制。它们中的大部分都不在屏幕上,所以看起来我可以通过同时进行检查来节省很多工作。但是,我的 CPU 使用率从未超过 15%,所以它似乎仍然只使用一个内核。我是否正确实现了线程?如果是这样,为什么我的所有核心都没有被使用?有没有更好的方法来利用我所有的核心?

public void paintComponent(Graphics g)
{
super.paintComponent(g);

if (game.movables.size() > 10000)
{
final int size = game.drawables.size();
final Graphics gg = g;
Thread[] threads = new Thread[8];
for (int j = 0; j < 8; ++j)
{
final int n = j;
threads[j] = new Thread(new Runnable()
{
public void run()
{
Drawable drawMe;
int start = (size / 8) * n;
int end = (size / 8) * (n + 1);
if (n == 8) end = game.drawables.size(); // incase size
// % 8 != 0
for (int i = start; i < end; ++i)
{
drawMe = game.drawables.get(i);
if (drawMe.isOnScreen())
{
synchronized (gg)
{
drawMe.draw(gg);
}
}
}
}
});
threads[j].start();
}

try
{
for (int j = 0; j < 8; ++j)
threads[j].join();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else
{
for (Drawable drawMe : game.drawables)
{
if (drawMe.isOnScreen())
{
drawMe.draw(g);
}
}
}
}

最佳答案

正如已经指出的那样,同步 (gg) 正在有效地序列化所有绘图,因此由于线程,您可能比单线程代码创建和其他开销。

然而,我写这篇文章的主要原因是 Swing(这大概是)不是线程安全的。所以这个程序的行为不仅可能是坏的,而且是未定义的。

像这样的线程错误在某些具有某些 Java 运行时参数和某些图形驱动程序的机器上表现为古怪的行为。到过那里。做到了。不好。

JOGL将使您能够直接访问 GPU,这是加速渲染的最可靠方式。

关于Java代码似乎只使用了两个并发线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11534116/

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