解决方案 »

  1.   

    timer其实在线程里回调的事件
    你加了lock,一次没有处理完,下一次会阻塞住,排队等待执行,造成线程越来越多,都在阻塞
    而如果遇到lock直接跳出,当然会丢帧不能把大图切成小块,多线程同时进行绘制吗
      

  2.   

    用timer,那么每次进入timer,先停掉timer,然后处理,处理完再打开timer用线程,cpu高,估计你代码问题,耗时的操作有没有放到线程里
      

  3.   

    其实就是“跳帧”的概念
    如果你一秒30帧,那就要求1/30秒内必须处理完一次重绘,如果处理不完,就要跳过下一次重绘        object lockObject = new object();
            bool ticking = false;        void timer_Tick(object sender, EventArgs e)
            {
                lock (lockObject)
                {
                    if (ticking)
                    {
                        return;
                    }
                    ticking = true;
                }            Task.Run(...);            ticking = false;
            }
      

  4.   

    你没说绘制是用的什么办法,还有把bitmap画到界面上的方式。
    如果你是用LockBits拿到了bitmap对应的非托管内存,那么是可以对这块内存并发访问的(当然前提是你的算法不会冲突)。
    追求效果的话也不应该在timer触发的时候才画好当前帧。应该是预先画好后面的帧,定时画到界面上。如果只是透明度的改变,不是太大的图片应该也不需要多线程绘制。之前解决别的问题的时候比较两个3200*1200的图片画到第三张图上去debug方式也就80ms。一般流畅动画效果画到25帧,40ms一帧就可以了。
      

  5.   

    我的绘制方法就是using(Graphics g = Graphics.FromImage(_canvas)) 内存那个就不考虑了
      

  6.   

    这个问题我大概解决了  最后解决方案就是传递一个线程同步的上下文(SynchronizationContext)每次 进行绘制刷新的时候把消息同步到UI线程来完成  也不需要锁定 不知道低层实现机制是什么 但是解决问题了...