小弟正在android上开发光线追踪程序。新开了一个线程执行光线追踪的的程序,这个线程比较耗时。执行了很久过后,log就打出了消息:
04-17 08:36:12.908: WARN/dalvikvm(759): HeapWorker may be wedged: 9501ms spent inside Lcom/android/internal/os/BinderInternal$GcWatcher;.finalize()V
04-17 08:36:17.879: INFO/dalvikvm-heap(759): Clamp target GC heap from 18.000MB to 16.000MB
04-17 08:36:17.950: DEBUG/dalvikvm(759): GC freed 0 objects / 0 bytes in 5057ms
04-17 08:36:17.958: INFO/dalvikvm-heap(759): Clamp target GC heap from 16.000MB to 16.000MB
04-17 08:36:17.971: INFO/dalvikvm-heap(759): Grow heap (frag case) to 16.000MB for 8-byte allocation
04-17 08:36:17.989: INFO/dalvikvm(759): Debugger is attached -- suppressing HeapWorker watchdog
04-17 08:36:24.399: INFO/dalvikvm-heap(759): Clamp target GC heap from 18.000MB to 16.000MB
04-17 08:36:24.641: DEBUG/dalvikvm(759): GC freed 0 objects / 0 bytes in 6671ms
04-17 08:36:24.678: INFO/dalvikvm-heap(759): Clamp target GC heap from 16.000MB to 16.000MB
04-17 08:36:24.688: INFO/dalvikvm-heap(759): Grow heap (frag case) to 16.000MB for 28-byte allocation
然后Log就一直循环地打出这些消息,程序一直没执行。跪求帮忙呀!!!!

解决方案 »

  1.   

    我不知道你的光线追踪程序都加了什么Log,我怀疑程序执行了,只不过你logcat看不到。
    04-17 08:36:17.971: INFO/dalvikvm-heap(759): Grow heap (frag case) to 16.000MB for 8-byte allocation
    你可以不可以简单说下 你程序的实现 。我没做过什么光线追踪,但是我从没见过这种Log打出来过,我想你的程序还是执行了,执行的TAG没打出来,只有dalvikvm的信息打出。 建议查查你的打印Log的语句吧 .java的还好,若是用到jni  .cpp ,log的方式很多所以很容易出错
      

  2.   

    在surfaceview中的surfaceCreated线程开始一个新的线程
    public void surfaceCreated(SurfaceHolder holder) {
    sp = new SceneParser(context, "setting/scene6_01_sphere.txt");
    rt = new RayTracer(sp, 0, 0.0f, false, false, false, false, 0, 0, 0,
    false, false, 0, 0, false, false, false, 0, 0.0f, 0.0f, 0.0f,false, 0, 0.0f, 0.0f, 0.0f);
    // 开启绘图线程
    new Thread(this).start();
    }
    然后在线程的run中写draw的方法
    public void run() {
    while (mbLoop) {
    try {
    Thread.sleep(100);
    } catch (Exception e) {
    }
    tracingtime = System.currentTimeMillis();
                            //光线追踪的绘制过程
    draw();
    tracingtime = System.currentTimeMillis() - tracingtime;
    synchronized (mSurfaceHolder) {
    // 锁定画布,得到canvas
    Canvas canvas = mSurfaceHolder.lockCanvas();
    if (null == mSurfaceHolder || null == canvas) {
    return;
    }
    Paint paint = new Paint();
                                    //将光线追踪绘制的结果buffer绘制到canvas上。
    cImage.draw(canvas, paint);
    paint.setColor(Color.YELLOW);
    paint.setTextSize(10);
    canvas.drawText("draw() 时间:" + (float)tracingtime/1000 + "ms", 10, 10, paint);

    // 绘制后解锁,绘制后必须解锁才能显示
    mSurfaceHolder.unlockCanvasAndPost(canvas);
    // 暂时只让循环run一次
    mbLoop = false;
    }
    }
    }
    //在draw方法中实现:
    // 绘图方法
    public void draw() {
                  //省略前面代码...........
                   
                    //对每个像素发出射线。
    for (int i = 0; i < screenWidth; i++) {
    Log.e("Draw()", "i = " + i);
    for (int j = 0; j < screenHeight; j++) {
                         //生成光线,与每个图元求交,计算颜色,记录到CImage的buffer中
    }
    }
            }
    其中上面二重循环是执行了的,并且也打出了一部分log,但是当执行到一部分,也就是循环到一部分过后,就不执行了。出现了我上面说的情况。望帮忙。