游戏是蓝牙联机游戏,现在比如有A,B两个手机,当我手触摸A手机屏幕后,手机会通过蓝牙将手指触摸在A手机上的坐标发送给B手机,B手机收到坐标后会根据坐标绘制一个小球,从而实现手指在A手机上滑动而B手机显示一个在移动的小球。
但是现在遇到的问题是B手机在绘制移动的小球时延迟非常的大,没办法做到实时性,并且当手指滑动过长时间后软件会崩溃。求教解决办法,下面是我根据坐标绘图的代码void SimpleDraw() {  
    
        Canvas canvas = sfh.lockCanvas();// 关键:获取画布  
       
        Paint mPaint = new Paint();  
        mPaint.setColor(Color.GREEN);// 画笔为绿色  
        mPaint.setStrokeWidth(2);// 设置画笔粗细  
        canvas.drawCircle(x, y, 45, mPaint);  
        //System.out.print(Integer.parseInt(xx)); 
        sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像  
    
    
    }  

    void ClearDraw() {  
        Canvas canvas = sfh.lockCanvas();  
        canvas.drawColor(Color.BLACK);// 清除画布  
        sfh.unlockCanvasAndPost(canvas);  
  
    }  要实时绘图显示小球位置只需调用一下两个函数即可ClearDraw();
SimpleDraw();

解决方案 »

  1.   


    我之前试过只在B手机上放一个textview来显示A手机的触摸数据,这时候倒是挺快的,数据实时同步,就是只要把绘图小球加进去后就变慢了
      

  2.   


     void SimpleDraw(float xx,float yy) {  
        
            Canvas canvas = sfh.lockCanvas();// 关键:获取画布  
           
            Paint mPaint = new Paint();  
            mPaint.setColor(Color.GREEN);// 画笔为绿色  
            mPaint.setStrokeWidth(2);// 设置画笔粗细  
            canvas.drawCircle(xx, yy, 20, mPaint);  
            sfh.unlockCanvasAndPost(canvas);// 解锁画布,提交画好的图像  
        }  

        void ClearDraw() {  
            Canvas canvas = sfh.lockCanvas();  
            canvas.drawColor(Color.BLACK);// 清除画布  
            sfh.unlockCanvasAndPost(canvas);  
        }  
        
        
        
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    // TODO Auto-generated method stub
    //获得触摸的坐标
          x = event.getRawX();
          y = event.getRawY(); 
        
         switch (event.getAction()) 
         {
         //触摸屏幕时刻
         case MotionEvent.ACTION_DOWN:      break;
         //触摸并移动时刻
         case MotionEvent.ACTION_MOVE:      break;
         //终止触摸时刻
         case MotionEvent.ACTION_UP:
         break;
         }

    if (x+"".length()>0 || y+"".length()>0) {
    sendMessageHandle(x+""+"  "+y+"");
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 

    }else
    Toast.makeText(mContext, "发送内容不能为空!", Toast.LENGTH_SHORT).show();


    return super.onTouchEvent(event);
    }
    private void init() {    
    list = new ArrayList<deviceListItem>();
    mAdapter = new deviceListAdapter(this, list);

    disconnectButton= (Button)findViewById(R.id.btn_disconnect);
    disconnectButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View arg0) {
    // TODO Auto-generated method stub
            if (Bluetooth.serviceOrCilent == ServerOrCilent.CILENT) 
    {
             shutdownClient();
    }
    else if (Bluetooth.serviceOrCilent == ServerOrCilent.SERVICE) 
    {
    shutdownServer();
    }
    Bluetooth.isOpen = false;
    Bluetooth.serviceOrCilent=ServerOrCilent.NONE;
    Toast.makeText(mContext, "已断开连接!", Toast.LENGTH_SHORT).show();
    }
    });
    }        private Handler LinkDetectedHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
             Toast.makeText(mContext, (String)msg.obj, Toast.LENGTH_LONG).show();
             if(msg.what==1)
             {
             list.add(new deviceListItem((String)msg.obj, true));
             }
             else
             {
             list.add(new deviceListItem((String)msg.obj, false));
             }
    mAdapter.notifyDataSetChanged();

            }
            
        };  
        
       //用来显示接收到的对方手机的触摸坐标 
        private Handler LinkDetectedHandler2 = new Handler() {
            @Override
            public void handleMessage(Message msg) {
             xy.setText((String)msg.obj);
             ClearDraw();
    Scanner input = new Scanner(xy.getText()+"");
             SimpleDraw((int)(input.nextFloat()),(int)(input.nextFloat()));
            }
            
        };    
        
        @Override
        public synchronized void onPause() {
            super.onPause();
        }
        @Override
        public synchronized void onResume() {
            super.onResume();
            if(Bluetooth.isOpen)
            {
             Toast.makeText(mContext, "连接已经打开,可以通信。如果要再建立连接,请先断开!", Toast.LENGTH_SHORT).show();
             return;
            }
            if(Bluetooth.serviceOrCilent==ServerOrCilent.CILENT)
            {
    String address = Bluetooth.BlueToothAddress;
    if(!address.equals("null"))
    {
    device = mBluetoothAdapter.getRemoteDevice(address);
    clientConnectThread = new clientThread();
    clientConnectThread.start();
    Bluetooth.isOpen = true;
    }
    else
    {
    Toast.makeText(mContext, "address is null !", Toast.LENGTH_SHORT).show();
    }
            }
            else if(Bluetooth.serviceOrCilent==ServerOrCilent.SERVICE)
            {               
             startServerThread = new ServerThread();
             startServerThread.start();
             Bluetooth.isOpen = true;
            }
        }
    //开启客户端
    private class clientThread extends Thread { 
    public void run() {
    try {
    //创建一个Socket连接:只需要服务器在注册时的UUID号
    socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
    //连接
    Message msg2 = new Message();
    msg2.obj = "请稍候,正在连接服务器:"+Bluetooth.BlueToothAddress;
    msg2.what = 0;
    LinkDetectedHandler.sendMessage(msg2);

    socket.connect();

    Message msg = new Message();
    msg.obj = "已经连接上服务端!可以发送信息。";
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg);
    //启动接受数据
    mreadThread = new readThread();
    mreadThread.start();

    catch (IOException e) 
    {
    Log.e("connect", "", e);
    Message msg = new Message();
    msg.obj = "连接服务端异常!断开连接重新试一试。";
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg);

    }
    }; //开启服务器
    private class ServerThread extends Thread { 
    public void run() {

    try {
    /* 创建一个蓝牙服务器 
     * 参数分别:服务器名称、UUID  */
    mserverSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(PROTOCOL_SCHEME_RFCOMM,
    UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));

    Log.d("server", "wait cilent connect...");

    Message msg = new Message();
    msg.obj = "请稍候,正在等待客户端的连接...";
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg);

    /* 接受客户端的连接请求 */
    socket = mserverSocket.accept();
    Log.d("server", "accept success !");

    Message msg2 = new Message();
    String info = "客户端已经连接上!可以发送信息。";
    msg2.obj = info;
    msg.what = 0;
    LinkDetectedHandler.sendMessage(msg2);
    //启动接受数据
    mreadThread = new readThread();
    mreadThread.start();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    };
    /* 停止服务器 */
    private void shutdownServer() {
    new Thread() {
    public void run() {
    if(startServerThread != null)
    {
    startServerThread.interrupt();
    startServerThread = null;
    }
    if(mreadThread != null)
    {
    mreadThread.interrupt();
    mreadThread = null;
    }
    try {
    if(socket != null)
    {
    socket.close();
    socket = null;
    }
    if (mserverSocket != null)
    {
    mserverSocket.close();/* 关闭服务器 */
    mserverSocket = null;
    }
    } catch (IOException e) {
    Log.e("server", "mserverSocket.close()", e);
    }
    };
    }.start();
    }
    /* 停止客户端连接 */
    private void shutdownClient() {
    new Thread() {
    public void run() {
    if(clientConnectThread!=null)
    {
    clientConnectThread.interrupt();
    clientConnectThread= null;
    }
    if(mreadThread != null)
    {
    mreadThread.interrupt();
    mreadThread = null;
    }
    if (socket != null) {
    try {
    socket.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    socket = null;
    }
    };
    }.start();
    }
    //发送数据
    private void sendMessageHandle(String msg) 
    {
    if (socket == null) 
    {
    Toast.makeText(mContext, "没有连接", Toast.LENGTH_SHORT).show();
    return;
    }
    try {
    OutputStream os = socket.getOutputStream(); 
    os.write(msg.getBytes());
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    }

    //读取数据
        private class readThread extends Thread { 
            public void run() {
            
                byte[] buffer = new byte[1024];
                int bytes;
                InputStream mmInStream = null;
                
    try {
    mmInStream = socket.getInputStream();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
                while (true) {
                    try {
                        // Read from the InputStream
                        if( (bytes = mmInStream.read(buffer)) > 0 )
                        {
                        byte[] buf_data = new byte[bytes];
         for(int i=0; i<bytes; i++)
         {
         buf_data[i] = buffer[i];
         }
    String s = new String(buf_data);
    Message msg = new Message();
    msg.obj = s;
    msg.what = 1;
    LinkDetectedHandler2.sendMessage(msg);
                        }
                    } catch (IOException e) {
                     try {
    mmInStream.close();
    } catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
    }
                        break;
                    }
                }
            }
        }