模仿联众的对战俄罗斯:
问题1:
   我创建了两个线程,分别管理对手和自己的俄罗斯方块(在各自的线程中对主线程的VIEW进行画图).
   现在已经实现,当我处理自己一方的时候(一个人玩),画图程序很好运行。
   但是当我开始对战,两个线程同时对VIEW进行画图时,有时候会出现黑色一块,白色一块(我是小块更新,所以InValidRect这么一小方块,大概是没有画成功,或者是没有更新成功,但是返回函数多是成功的)
   不过出现的几率不高,但是一盘玩下来,总会有一两次,所以很影响程序的效果.
虽然联众有时候也会发生这个情况,但是几率很小,玩N盘,才偶尔有这个情况(没有正确更新).
   
   不过我把对战取消,自己玩时,更本就不会出现这个问题.
(注:两个线程同时操作VIEW时,没有用同步,不知道会不会是这个问题)
问题2:
   对战时,对手的俄罗斯数据怎么处理?自己的俄罗斯方块运行多是通过动作实现的(旋转,往下掉等),
   如果对手也是通过发送过来的动作来处理,那么好象数据量太大了(导致画图频繁),
   还有一个方法大概就是传递俄罗斯方块的位置信息,和本方采用不同的画图方法( 直接采用位置更新,不需要通过动作计算位置了.)对于这两种(传递动作,传递位置信息)哪种适合?

解决方案 »

  1.   

    问题1:
      线程中的CDC你是怎么传递的,是传的句柄还是指针?最好还是传句柄。另外,本人感觉InvalidRect不大好用。想想其它办法
    问题2:
      用第二种办法吧
      

  2.   

    楼主是使用GDI绘图吗?如果是两个线程,最好加上Lock,否则对同一资源操作可能会有问题。我写过一个小游戏,当时是这么解决的,由于对战的时候Socket的消息是不一定的,所以肯定要用多线程,我写了一个类,专门对于界面进行更新(我当时用的是Dialog),线程中的数据通过Update()接口将要更新的数据放入这个类中,由这个类进行统一界面刷新(这个类有帧控制)。而不是分别由线程管理刷新,线程只负责管理数据,不用管理图形是怎么画上去的。
    不知道这样能否解决楼主的问题。
    两个线程同时拥有CDC可能会有一些麻烦。
      

  3.   

    我现在的方式改为代码还是在两个线程里面,不过要画图时,发个消息到主线程,然后,由主线程调用线程里的画图函数,这样两个线程的同步交给了主线程,由消息机制处理.
    现在出现黑块的情况好多了,没有以前那么多了,但是还是会出现。我用的是GetDC(m_hWnd),这样得到的是HDC,不知道用HDC,和直接用CDC有什么区别?