请教一个GDI+的问题

zhengdaolin 2009-02-05 01:24:59
我做了一个form,form的背景是用drawline画出来的一些线段
form中还有一个小球,用鼠标可以控制小球移动
随着小球的移动,背景中的线段也会跟着做相应的变化
我现在的方法是控制在mousemove方法中,记录鼠标位置
每一次鼠标移动后,就用白色把form刷一遍
然后重新画背景线和小球

但是这种方法感觉效率比较低,速度有点慢
请问有什么其他的解决方案吗?
...全文
248 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
FlyinFish 2009-08-30
  • 打赏
  • 举报
回复
你这个问题主要是重画过于频繁,一般来说要根据软件具体使用情况来找寻降低重画的方法。
我接触过一些游戏设计常用的解决方案:
1,通过Timer来触发重画,一般10~30桢每秒就看不出来了
2,把重画的逻辑分离到另一个线程,这样一般情况下就不会影响到用户操作了。你甚至可以限制另一个线程的kernel time占用量,不过对于这样的软件多少有点overkill.

方案1一般的实现方法也有几种,比较简单的是每次重画之后记录下时间,然后在OnMouseMove事件中判断距离上次重画的时间。
方案2稍微有些麻烦,因为你需要考虑到GDI+对threading的兼容性,不过具体我就不太了解了。
Cherishny 2009-02-06
  • 打赏
  • 举报
回复
看用picturebox 填充form 直接绘到picturebox 上怎么样 个人想法
zhengdaolin 2009-02-06
  • 打赏
  • 举报
回复
回复17楼
refresh只能重绘原来的bitmap
我提到的重绘不仅仅是针对闪烁问题
我bitmap的内容也是要变化的
所以我要先把bitmap清空,然后重新在bitmap上画东西
再把bitmap放到form上显示出来
我上面所有提到的重绘问题,都设计到图片本身内容的变更
zhengdaolin 2009-02-06
  • 打赏
  • 举报
回复
你的意思是重新开一个bitmap,原来的bitmap就不要了吗?
这里没说清楚,我的这个Graphics是bitmap的Graphics
[Quote=引用 16 楼 agentianle 的回复:]
既然你是双缓冲,还调用"Graphics.Clear(Color.White);"干嘛?

奇怪的作法!
[/Quote]
guoyichao 2009-02-06
  • 打赏
  • 举报
回复
如果仅仅每次清屏和画个鼠标点都觉得慢的话,那只能说明要么你机器太差,要么说你双缓冲用法不对。
wwei466 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhengdaolin 的回复:]
回复17楼
refresh只能重绘原来的bitmap
我提到的重绘不仅仅是针对闪烁问题
我bitmap的内容也是要变化的
所以我要先把bitmap清空,然后重新在bitmap上画东西
再把bitmap放到form上显示出来
我上面所有提到的重绘问题,都设计到图片本身内容的变更
[/Quote]

原来的就可以不要了,直接重绘bitmap。
清空后再画,待然耗费资源了。
wwei466 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 zhengdaolin 的回复:]
回复17楼
refresh只能重绘原来的bitmap
我提到的重绘不仅仅是针对闪烁问题
我bitmap的内容也是要变化的
所以我要先把bitmap清空,然后重新在bitmap上画东西
再把bitmap放到form上显示出来
我上面所有提到的重绘问题,都设计到图片本身内容的变更
[/Quote]

原来的就可以不要了,直接重绘bitmap。
wsf205 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 goldenbull9 的回复:]
典型的双缓冲应用场景,创建一个内存Bitmap,每次MouseMove事件,在这个内存位图上画画,画完之后调用Invalidate和Update,在OnPaint里面简单的把内存Bitmap用DrawImage直接贴一下就行,然后效率问题就集中在MouseMove事件中的画图操作上了,这个就看你自己算法的优化了
[/Quote]
觉得有一定道理了哦,楼主可以试一下在MouseMove的时候把图像的中间不分呈现,而MouseUp的时候呈现最终图像
CraxyMouse 2009-02-05
  • 打赏
  • 举报
回复
http://blog.csdn.net/dunao/archive/2009/02/05/3865053.aspx
wwei466 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zhengdaolin 的回复:]
由于我现在即使一条线都不画,感觉上还是有点慢
我觉得是不是因为我每次mousemove的时候,都要清空画面的关系
我用的方法是Graphics.Clear(Color.White);
不知道这样效率是不是会比较低
有没有什么比较快的清空画面的方法?

引用 12 楼 wwei466 的回复:
主要有两个方法
1。优化gdi+画图
一般来说GraphhicPath的效率要比多条直线一条条的DrawLine要快很多。
其他的也一样。
2。优化你的计算方法
鼠标移动后…
[/Quote]
为什么使用Graphics.Clear(Color.White);
你不是双缓冲画图片吗?直接form的refresh()不久可以了吗。

看来你这样是说不清楚地,把具体的要求说说,或者代码贴出来。
天乐 2009-02-05
  • 打赏
  • 举报
回复
既然你是双缓冲,还调用"Graphics.Clear(Color.White);"干嘛?

奇怪的作法!


qlzf11140820 2009-02-05
  • 打赏
  • 举报
回复
学习
zhengdaolin 2009-02-05
  • 打赏
  • 举报
回复
这个我也想过,但是感觉比较难
因为随着鼠标动的不光是小球
还有若干根线,而且还有背景
背景也是需要计算出来的
所以这个问题比较复杂,不太好实现

[Quote=引用 9 楼 huwei001982 的回复:]
你这个不是双缓冲的问题,双缓冲又不是万能的

你只重画小球移动过的部分就行了
[/Quote]
zhengdaolin 2009-02-05
  • 打赏
  • 举报
回复
由于我现在即使一条线都不画,感觉上还是有点慢
我觉得是不是因为我每次mousemove的时候,都要清空画面的关系
我用的方法是Graphics.Clear(Color.White);
不知道这样效率是不是会比较低
有没有什么比较快的清空画面的方法?

[Quote=引用 12 楼 wwei466 的回复:]
主要有两个方法
1。优化gdi+画图
一般来说GraphhicPath的效率要比多条直线一条条的DrawLine要快很多。
其他的也一样。
2。优化你的计算方法
鼠标移动后你要计算位置背景线段的起始点和终点吧。优化这个计算的方法,自然就显得快很多了。
[/Quote]
wwei466 2009-02-05
  • 打赏
  • 举报
回复
主要有两个方法
1。优化gdi+画图
一般来说GraphhicPath的效率要比多条直线一条条的DrawLine要快很多。
其他的也一样。
2。优化你的计算方法
鼠标移动后你要计算位置背景线段的起始点和终点吧。优化这个计算的方法,自然就显得快很多了。
justindreams 2009-02-05
  • 打赏
  • 举报
回复
双缓存主要是解决闪屏问题,效率与这个关系不大。
烈火蜓蜻 2009-02-05
  • 打赏
  • 举报
回复
关注一下
huwei001982 2009-02-05
  • 打赏
  • 举报
回复
你这个不是双缓冲的问题,双缓冲又不是万能的

你只重画小球移动过的部分就行了
zhengdaolin 2009-02-05
  • 打赏
  • 举报
回复
我现在用的就是双缓冲,但是还是 觉得有点慢
[Quote=引用 7 楼 goldenbull9 的回复:]
典型的双缓冲应用场景,创建一个内存Bitmap,每次MouseMove事件,在这个内存位图上画画,画完之后调用Invalidate和Update,在OnPaint里面简单的把内存Bitmap用DrawImage直接贴一下就行,然后效率问题就集中在MouseMove事件中的画图操作上了,这个就看你自己算法的优化了
[/Quote]
goldenbull9 2009-02-05
  • 打赏
  • 举报
回复
典型的双缓冲应用场景,创建一个内存Bitmap,每次MouseMove事件,在这个内存位图上画画,画完之后调用Invalidate和Update,在OnPaint里面简单的把内存Bitmap用DrawImage直接贴一下就行,然后效率问题就集中在MouseMove事件中的画图操作上了,这个就看你自己算法的优化了
加载更多回复(6)

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧