小弟正在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就一直循环地打出这些消息,程序一直没执行。跪求帮忙呀!!!!
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就一直循环地打出这些消息,程序一直没执行。跪求帮忙呀!!!!
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的方式很多所以很容易出错
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,但是当执行到一部分,也就是循环到一部分过后,就不执行了。出现了我上面说的情况。望帮忙。