社区
C#
帖子详情
请教一个GDI+的问题
zhengdaolin
2009-02-05 01:24:59
我做了一个form,form的背景是用drawline画出来的一些线段
form中还有一个小球,用鼠标可以控制小球移动
随着小球的移动,背景中的线段也会跟着做相应的变化
我现在的方法是控制在mousemove方法中,记录鼠标位置
每一次鼠标移动后,就用白色把form刷一遍
然后重新画背景线和小球
但是这种方法感觉效率比较低,速度有点慢
请问有什么其他的解决方案吗?
...全文
248
26
打赏
收藏
请教一个GDI+的问题
我做了一个form,form的背景是用drawline画出来的一些线段 form中还有一个小球,用鼠标可以控制小球移动 随着小球的移动,背景中的线段也会跟着做相应的变化 我现在的方法是控制在mousemove方法中,记录鼠标位置 每一次鼠标移动后,就用白色把form刷一遍 然后重新画背景线和小球 但是这种方法感觉效率比较低,速度有点慢 请问有什么其他的解决方案吗?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
GDI+
中如何设置画图模式?
请教
各位大虾: 我最近碰到
一个
问题
,我想在文档中画
一个
运动的目标,本来的设想是用异或模式清掉前一位置上的目标图标,然后再画当前位置的目标图标,但是我在
GDI+
加中没有找到相应的设置画图模式的函数,想
请教
一下
GDI+
中有没有这样设置画图模式的函数?如果有,是什么?如果没有我应该怎么解决这样的
问题
?我也想过用背景色去清前一位置上的目标图标,但这样遇到目标重合的情况,会把两个目标都清掉!我也
请教
各位仁兄 ,如何给delphi7增加
gdi+
的功能?
请教
各位仁兄 ,如何给delphi7增加
gdi+
的功能? Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiMultimedia/html/delphi_20060927174050285.html 在网上下载了
一个
GPDraw V0.8 按说明安装时却出错,提示 ‘loadlibrary(''d:...
c#
GDI+
的双缓冲
问题
GDI+
的双缓冲
问题
一直以来的误区:.net1.1 和 .net 2.0 在处理控件双缓冲上是有区别的。 .net 1.1 中,使用:this.SetStyle(ControlStyles.DoubleBuffer, true); .net 2.0中,使用:this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true); 导致画面闪烁的
GDI波形图的绘制以及坐标系的添加
在前面已经介绍了一些,GDI的基础知识,这里主要说一下,在项目中遇到的
问题
和使用双缓存需要注意的东西,以提醒自己,也给看到博客的朋友一些警醒,不要犯同样的错误。在绘制多个坐标系的时候遇到的
问题
: 首先界面的原点是在左上角,Y轴向下为正,X轴正常(向右为正),所以绘制的时候一定要计算好原点 的位置,再以X轴长和Y轴长绘制,代码如下: //设置画笔,常用的RGB值在htt
GDI
http://blog.csdn.net/byxdaz/article/details/5949590 编程windows图形数据结构mfc任务 图形设备接口(GDI)是
一个
可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏幕输出。GDI负责Windows的所有图形输出,包括
C#
111,130
社区成员
642,542
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章