public void run()
    {
        while(!isInitialized)
            try
            {
                Thread.sleep(200L);
            }
            catch(InterruptedException interruptedexception) { }
        do
        {
            for(int j = 0; j < pixls2; j++)
            {
                int k = pix0[j];
                int l = pix0[j + 1];
                int i1 = pix0[j + m_nAppX];
                int j1 = pix0[j + m_nAppX + 1];
                int i = (k & 0xff0000) >> 16;
                int k1 = ((((l & 0xff0000) >> 16) - i) * ru >> 8) + i;
                i = (k & 0xff00) >> 8;
                int l1 = ((((l & 0xff00) >> 8) - i) * ru >> 8) + i;
                i = k & 0xff;
                int i2 = (((l & 0xff) - i) * ru >> 8) + i;
                i = (i1 & 0xff0000) >> 16;
                int j2 = ((((j1 & 0xff0000) >> 16) - i) * ru >> 8) + i;
                i = (i1 & 0xff00) >> 8;
                int k2 = ((((j1 & 0xff00) >> 8) - i) * ru >> 8) + i;
                i = i1 & 0xff;
                int l2 = (((j1 & 0xff) - i) * ru >> 8) + i;
                int i3 = ((j2 - k1) * rv >> 8) + k1;
                int j3 = ((k2 - l1) * rv >> 8) + l1;
                int k3 = ((l2 - i2) * rv >> 8) + i2;
                pix0[j] = i3 << 16 | j3 << 8 | k3 | 0xff000000;
            }            rend();
            offImage.newPixels(0, 0, m_nAppX, m_nAppY);
            try
            {
                Thread.sleep(m_sleepTime);
            }
            catch(InterruptedException interruptedexception1) { }
        } while(true);
    }    public void update(Graphics g)
    {
        paint(g);
    }    public void paint(Graphics g)
    {
        g.drawImage(dbImg, 0, 0, this);
    }    public void start()
    {
        if(isError)
            return;
        isRunning = true;
        if(runner == null)
        {
            runner = new Thread(this);
            runner.start();
        }
    }    public void stop()
    {
        if(runner != null)
        {
            runner.stop();
            runner = null;
        }
    }    public boolean mouseMove(Event event, int i, int j)
    {
        m_mouseX = i;
        m_mouseY = j;
        return true;
    }    public boolean mouseDown(Event event, int i, int j)
    {
        m_mouseX = i;
        m_mouseY = j;
        int k = (int)(rand.nextDouble() * 256D);
        int l = (int)(rand.nextDouble() * 256D);
        int i1 = (int)(rand.nextDouble() * 256D);
        int j1 = k << 16 | l << 8 | i1 | 0xff000000;
        int k1 = 0;
        for(int l1 = 0; l1 < bits; l1++)
        {
            if(bit_f[l1] != 0)
                continue;
            bit_px[l1] = m_mouseX;
            bit_py[l1] = m_mouseY;
            double d = rand.nextDouble() * 6.2800000000000002D;
            double d1 = rand.nextDouble();
            bit_vx[l1] = Math.sin(d) * d1;
            bit_vy[l1] = Math.cos(d) * d1;
            bit_l[l1] = (int)(rand.nextDouble() * 100D) + 100;
            bit_p[l1] = (int)(rand.nextDouble() * 3D);
            bit_c[l1] = j1;
            bit_sx[l1] = m_mouseX;
            bit_sy[l1] = m_nAppY - 5;
            bit_f[l1] = 2;
            if(++k1 == bit_max)
                break;
        }        if(bit_sound > 1)
            sound2.play();
        return true;
    }    public boolean mouseExit(Event event, int i, int j)
    {
        m_mouseX = i;
        m_mouseY = j;
        return true;
    }    void rend()
    {
        boolean flag = false;
        boolean flag1 = false;
        boolean flag2 = false;
        for(int k = 0; k < bits; k++)
            switch(bit_f[k])
            {
            default:
                break;            case 1: // '\001'
                bit_vy[k] += rand.nextDouble() / 50D;
                bit_px[k] += bit_vx[k];
                bit_py[k] += bit_vy[k];
                bit_l[k]--;
                if(bit_l[k] == 0 || bit_px[k] < 0.0D || bit_py[k] < 0.0D || bit_px[k] > (double)m_nAppX || bit_py[k] > (double)(m_nAppY - 3))
                {
                    bit_c[k] = 0xff000000;
                    bit_f[k] = 0;
                } else
                if(bit_p[k] == 0)
                {
                    if((int)(rand.nextDouble() * 2D) == 0)
                        bit_set((int)bit_px[k], (int)bit_py[k], -1);
                } else
                {
                    bit_set((int)bit_px[k], (int)bit_py[k], bit_c[k]);
                }
                break;            case 2: // '\002'
                bit_sy[k] -= 5;
                if((double)bit_sy[k] <= bit_py[k])
                {
                    bit_f[k] = 1;
                    flag2 = true;
                }
                if((int)(rand.nextDouble() * 20D) == 0)
                {
                    int i = (int)(rand.nextDouble() * 2D);
                    int j = (int)(rand.nextDouble() * 5D);
                    bit_set(bit_sx[k] + i, bit_sy[k] + j, -1);
                }
                break;
            }        if(flag2 && bit_sound > 0)
            sound1.play();
    }    void bit_set(int i, int j, int k)
    {
        int l = i + j * m_nAppX;
        pix0[l] = k;
    }
}
/*********************************end*******************************

解决方案 »

  1.   

    这段代码是反编译出来的,我也仔细过该代码,好象并不存在什么bug的问题。不过它的计算量是相当大的,每次run()都要对所有的像素点进行计算(一个点牵涉到附近四个点)和所有烟火的亮点的位置进行计算(烟火未爆炸前,默认为150个亮点)。我用P4的机器拖这个程序都有一些吃力的感觉,特别是在烟花多的时候。Java(TM) Plug-in1.4.1 for ie(j2re1.4.1) ,安装以后,applet的运行速度明显降低了,这一点我也做过测试的,原因不明!
      

  2.   

    to  laig11(如此这般) 对啊,但是java plugin 1.3上ie打开运行都ok, 没什么感觉,  不过看“window任务管理器”里的性能 cpu已经在90%--95%了,但是不象安装了java plugin1.4.1里的cpu 100%啊..............
      

  3.   

    安装的plugin越是高版本,消耗的系统资源就越多,提供的功能也越多。这个是没有办法的事情啊,已经不是我们程序员可以控制的了。如果你在NetScape上运行烟花程序的话,可以让你更加吒舌。
      

  4.   

    这个程序好像没有什么错误呀,也没有你所说的什么严重bug或隐含错误。只不过是运行这个程序的时候消耗的内存实在是太大而已,这就好像你装jb3的时候感觉非常快,可你装jb7的时候感觉特别慢一样,并不是什么程序的问题,而是你的所用的工具的问题。
      

  5.   

    to maple92(枫) :  兄弟啊,你有没有搞错啊, “只不过是运行这个程序的时候消耗的内存实在是太大而已”-------并没有消耗很大的内存啊,我的机子是256MB的, 只是消耗很大的cpu才对啊!!!!!!!!!!!
      

  6.   

    do
            {
                for(int j = 0; j < pixls2; j++)
                {
                    int k = pix0[j];
                    int l = pix0[j + 1];
                    int i1 = pix0[j + m_nAppX];
                    int j1 = pix0[j + m_nAppX + 1];
                    int i = (k & 0xff0000) >> 16;
                    int k1 = ((((l & 0xff0000) >> 16) - i) * ru >> 8) + i;
                    i = (k & 0xff00) >> 8;
                    int l1 = ((((l & 0xff00) >> 8) - i) * ru >> 8) + i;
                    i = k & 0xff;
                    int i2 = (((l & 0xff) - i) * ru >> 8) + i;
                    i = (i1 & 0xff0000) >> 16;
                    int j2 = ((((j1 & 0xff0000) >> 16) - i) * ru >> 8) + i;
                    i = (i1 & 0xff00) >> 8;
                    int k2 = ((((j1 & 0xff00) >> 8) - i) * ru >> 8) + i;
                    i = i1 & 0xff;
                    int l2 = (((j1 & 0xff) - i) * ru >> 8) + i;
                    int i3 = ((j2 - k1) * rv >> 8) + k1;
                    int j3 = ((k2 - l1) * rv >> 8) + l1;
                    int k3 = ((l2 - i2) * rv >> 8) + i2;
                    pix0[j] = i3 << 16 | j3 << 8 | k3 | 0xff000000;
                }            rend();
                offImage.newPixels(0, 0, m_nAppX, m_nAppY);
                try
                {
                    Thread.sleep(m_sleepTime);
                }
                catch(InterruptedException interruptedexception1) { }
            } while(true);
    这里的while(true)其实不用无限循环,只要循环(pixls2+1)次就可以了,你可以把条件改为while(j<pixls2+1)。j要在do循环外定义。
      

  7.   

    to maple92(枫) 按照您以上说的,结果烟花失真了!!! 放完后,成了一颗颗椰子树了....... 没有清除掉了
      

  8.   

    应该是无限循环的,否则该线程就运行停止了。一次循环的动作就是屏幕所有点的灰度变暗。你就用一般的IE浏览器看好了,何必装plugin呢?我想你的初衷就是为了哄GF开心而已,她的机器的软件配置会有那么复杂吗?
      

  9.   

    to  maple92(枫) : 您再仔细看看to  laig11(如此这般) : 是啊,初衷是为了MYGF开心, 但是发现问题存在了,我不解决了总感觉心里不苏服啊!!! 她用的是我的机子, 还有为什么要用 plugin j2re 1.4.1的原因是我相应其他的程序里用到好多swing 组件, 而以前的plugin 不支持在 applet里显示 swing组件!
      

  10.   

    呵呵........-----------------------------------------------------------------
    ★签名★
        www.3ren.net  ---中国三人网技术论坛(精点java例程)