当前位置:操作系统 > 安卓/Android >>

Android游戏编程之Su易做图ceView进行连续渲染

Su易做图ceView类是一个用于处理Su易做图ce的视图,也是Android API提供的另一个类。
什么是Su易做图ce?它是一个抽象的原是缓冲区,被屏幕组合器用于渲染特定视图。屏幕组合器是Android上所有渲染的幕后推手,并最终负责将所有的像素点推送到GPU。
我们的目标就是在一个独立的线程中执行渲染,而不用大量占用UI线程,因为UI线程还有很多工作要做。Su易做图ceView类提供了一种在UI线程之外的线程中进行渲染的方式。
 
Su易做图ceHolder和锁定
为了在UI线程之外的另一个不同线程中渲染到Su易做图ceView,我们需要获得一个Su易做图ceHolder类的实例,如下所示:
Su易做图ceHolder holder = su易做图ceView.getHolder();
Su易做图ceHolder是Su易做图ce的一个包装,可为我们做一些辅助工作。它提供两个方法:
Canvas Su易做图ceHolder.lockCanvas();
Su易做图ceHolder.unlockAndPost(Canvas canvas);
第一个方法锁定Su易做图ce用于渲染并返回一个可用的Canvas实例。第二个方法解锁Su易做图ce并确保通过Canvas进行绘制的内容可显示在屏幕上。我们将在渲染线程中使用这两个方法以获取Canvas,通过它进行渲染并最终确保我们渲染的图像能在屏幕上可见。我们必须确保传递到Su易做图ceHolder.unlockAndPost()方法的Canvas与从Su易做图ceHolder.lockCanvas()方法接收的相同。
当Su易做图ceView被实例化时,Su易做图ce并没有立即创建。相反,它是异步创建的。每当活动暂停或再次恢复而重新创建时,该Su易做图ce都将被销毁。
 
Su易做图ce的创建与有效性
只要Su易做图ce没有生效,我们就不能从Su易做图ceHolder中获取Canvas。不过,我们可以通过下面的语句来查看Su易做图ce是否已被创建:
boolean isCreated = su易做图ceHolder.getSu易做图ce().isValid();
如果该方法返回true,我们就可安全的锁定该Su易做图ce并通过接收到的Canvas来在其上进行绘制。我们必须绝对确保在调用Su易做图ceHolder.lockCanvas()之后再次解锁Su易做图ce,否则我们的活动可能会锁定手机。
 
综合运用
下面看一个实例,其中使用Su易做图ceHolder在一个单独线程中执行渲染。
[java]  
package org.example.ch04_android_basics;  
  
import java.util.Random;  
  
import android.app.Activity;  
import android.content.Context;  
import android.graphics.Canvas;  
import android.os.Bundle;  
import android.view.Su易做图ceHolder;  
import android.view.Su易做图ceView;  
import android.view.Window;  
import android.view.WindowManager;  
  
public class Su易做图ceViewTest extends Activity {  
    FastRenderView renderView;  
  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
        requestWindowFeature(Window.FEATURE_NO_TITLE);  
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
                WindowManager.LayoutParams.FLAG_FULLSCREEN);  
        renderView = new FastRenderView(this);  
        setContentView(renderView);  
    }  
  
    @Override  
    protected void onPause() {  
        // TODO Auto-generated method stub  
        super.onPause();  
        renderView.pause();  
    }  
  
    @Override  
    protected void onResume() {  
        // TODO Auto-generated method stub  
        super.onResume();  
        renderView.resume();  
    }  
      
    class FastRenderView extends Su易做图ceView implements Runnable{  
        Thread renderThread = null;  
        Su易做图ceHolder holder;  
        Random rand = new Random();  
        volatile boolean running = false;  
          
        public FastRenderView(Context context) {  
            super(context);  
            // TODO Auto-generated constructor stub  
            holder = getHolder();  
        }  
          
        public void resume(){  
            running = true;  
            renderThread = new Thread(this);  
            renderThread.start();  
        }  
          
        public void run(){  
            while(running){  
                if(!holder.getSu易做图ce().isValid())  
                    continue;  
                  
                Canvas canvas = holder.lockCanvas();  
                canvas.drawRGB(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255));  
                holder.unlockCanvasAndPost(canvas);  
            }  
        }  
          
        public void pause(){  
            running = false;  
            while(true){  
                try{  
                    renderThread.join();  
                    break;  
                }catch(InterruptedException e){  
                    // retry  
                }  
            }  
        }  
    }  
}  
 
在onCreate()方法中,我们启动了全屏幕模式,创建FastRenderView实例并将其设置为活动的内容视图。
这次我们重写了onResume()方法。在该方法中,我们通过调用FastRenderView.resume()方法间接启动渲染线程,该方法将在内部处理所有操作。这就意味着该线程在活动创建时就启动(在执行onCreate()之后总是会调用onResume()方法)。当该活动从暂停状态恢复时,也将重新启动该线程。
当然,这也意味着我们必须在某个地方停止该线程;否则,我们需要在每次调用onResume()方法时创建一个新的线程。应该在onPause()方法内执行该操作。当调用FastRenderView.pause()方法时,将会完全停止该线程。该方法在线程完全停止之前不会返回
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,