Java 为什么这个简单的小程序使用up>;50%的CPU?
我写了一个简单的小程序作为制作游戏的基础,它已经占用了我超过50%的CPU。我使用的是3ghz P4,内存为1.5gb,所以我知道它不应该占用那么多空间Java 为什么这个简单的小程序使用up>;50%的CPU?,java,applet,cpu,Java,Applet,Cpu,我写了一个简单的小程序作为制作游戏的基础,它已经占用了我超过50%的CPU。我使用的是3ghz P4,内存为1.5gb,所以我知道它不应该占用那么多空间 import java.awt.*; import java.applet.*; public class applettest extends Applet implements Runnable { long lastFrame; public void init() { (new Thread(th
import java.awt.*;
import java.applet.*;
public class applettest extends Applet implements Runnable {
long lastFrame;
public void init() {
(new Thread(this)).start();
}
public void paint(Graphics g) {
g.drawString("Welcome to Java!!", 50, 60 );
}
public void run() {
while(true) {
// code here
repaint();
try{
// wait 16 milliseconds to cap frame rate to 60 fps
while (System.nanoTime() < lastFrame + 160000000) {
Thread.yield();
}
lastFrame = System.nanoTime();
}
catch(Exception e){}
}
}
}
import java.awt.*;
导入java.applet.*;
公共类applettest扩展Applet实现可运行{
长框架;
public void init(){
(新线程(此)).start();
}
公共空间涂料(图g){
g、 抽绳(“欢迎来到爪哇!!”,50,60);
}
public void run(){
while(true){
//代码在这里
重新油漆();
试一试{
//等待16毫秒,将帧速率限制为60 fps
而(System.nanoTime()
尝试用替换
这将保证帧之间的时间至少为16ms。如果渲染时间小于16ms,并且没有任何其他线程占用CPU,则渲染时间将以60fps的速度运行
您最初的解决方案将强制执行16ms最小值,但它必须反复保持系统时间(使用CPU),直到经过必要的时间
注意事项:
是一个异步调用(即)repaint()
是一个异步调用(即)repaint()
- 由于java没有使用CPU的第二个核心,您可能只看到了50%
您的代码将尽可能快地完成加法和比较
// wait 16 milliseconds to cap frame rate to 60 fps
while (System.nanoTime() < lastFrame + 16000000) {
Thread.yield();
}
//等待16毫秒,将帧速率限制为60 fps
而(System.nanoTime()
使用Thread.sleep(16)而不是紧密的while循环进行大量的数学运算。由于java没有使用CPU的第二个核心,您可能只看到了50% 您的代码将尽可能快地完成加法和比较
// wait 16 milliseconds to cap frame rate to 60 fps
while (System.nanoTime() < lastFrame + 16000000) {
Thread.yield();
}
//等待16毫秒,将帧速率限制为60 fps
而(System.nanoTime()
使用Thread.sleep(16)而不是紧密的while循环和大量的数学运算。您正在忙着等待,直到时间达到某个阈值。但是,如果没有其他线程需要时间,屈服并不意味着线程停止运行
如果你想等待并减少CPU的使用,考虑线程。睡眠
< p>你正在忙着等待,直到时间达到某个阈值。但是,如果没有其他线程需要时间,屈服并不意味着线程停止运行如果你想等待并减少CPU的使用,考虑线程。睡眠< /P> < P>注意1600000毫微秒=1.6毫秒,所以你可能没有按照你预期的那样长时间睡觉。
< P>注意1600000毫微秒=1.6毫秒,因此,您可能没有按预期的时间睡眠。Thread.sleep和繁忙等待之间的区别在于,当您将线程置于睡眠状态时,您告诉计算机在x秒内不需要做任何事情,而pc会让其他进程使用该时间然而,在繁忙的等待中,您告诉您的机器不断运行循环代码,即使它没有真正完成任何事情。Thread.sleep和繁忙等待之间的区别在于,当你让线程进入睡眠状态时,你告诉计算机在x秒内你不需要做任何事情,而pc会让其他进程使用这段时间
然而,在忙碌的等待中,你告诉你的机器不断地运行循环代码,即使它没有真正完成任何事情。很抱歉,这篇文章更多地是“和更多信息…”类型,而不是直接回答,我认为现在已经给出了答案——我只是认为在注释中不要丢失东西是有帮助的 这个线程似乎显示了对诸如thread.sleep()和thread.yield()之类的方法实际做什么的许多误解(公认是典型的)。我以前写过一些人们可能会感兴趣的材料,我试图澄清其中的一些问题:(包括不同负荷水平下的行为图表),而且——尽管这里没有提到,但相关的是,人们可能会对我的观点感兴趣
顺便说一句,在这种情况下,使用System.nanoTime()通常没有任何好处:在任何情况下,您只需将时间四舍五入到最接近的毫秒。我会让你省去检索纳秒时钟时间的笨拙计算和潜在开销(尽管后者也不是那么糟糕),只需使用好的ole传统系统。currentTimeMillis()。如果你的帖子睡过头了,下次就少睡一会儿吧。很抱歉,这篇帖子更多的是“和更多信息…”类型,而不是直接回答,我想现在已经给出了答案——我只是觉得在评论中不要把东西弄丢是有帮助的 这个线程似乎显示了对诸如thread.sleep()和thread.yield()之类的方法实际做什么的许多误解(公认是典型的)。我以前写过一些人们可能会感兴趣的材料,我试图澄清其中的一些问题:(包括不同负荷水平下的行为图表),而且——尽管这里没有提到,但相关的是,人们可能会对我的观点感兴趣 顺便说一句