请高手们从汇编的角度解答一下程序重画时候的容易闪烁的原因和解决方法

trunxzzzz 2007-01-19 03:45:01
比如直接调gdi函数为什么效率低,要用到几个指令,要访问几次内存,为什么用内存dc就好一点,用内存dc完成一次重画又要用到哪些指令,要几个周期,还有为什么directx的flip可以更快,它又用到什么指令几个周期,期待高手比较回答~~~
...全文
259 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
江城老温 2008-05-30
  • 打赏
  • 举报
回复
帮顶!
zyl910 2007-01-19
  • 打赏
  • 举报
回复
1.
DirectX的flip机制本身就是双缓冲,双缓冲绘图自然不会闪
而用GDI绘图时,还得人工创建内存位图来实现双缓冲

2.
CPU访问内存的速度远远超过显存
再结合考虑Cache的命中
有好几十倍的速度差距

3.
为了多任务,GDI命令是分批的发往设备驱动程序的
所以可能会被因其他进程绘图请求而堵塞一小段时间

注意DirectX全屏模式下只有DirectX能访问显存
而窗口模式下GDI会自动剪裁DirectX区域,使DirectX程序直接访问显存时不会造成冲突

4.
在复杂剪裁区域内的绘图效率很低
比如桌面上的窗口经常被其他窗口或控件遮掩,形成复杂的剪裁区域
而使用内存位图时,一般不设置剪裁区域,所以绘图效率很高

注意Windows系统是使用一系列小矩形来描述剪裁区域的,所以复杂的剪裁区域对于位图传送性能影响微乎其微
你见过DirectX中大量使用剪裁区域吗,除非为了与GDI兼容时才使用剪裁器
而且大都是使用BltFast快速传送位图,极少执行绘图操作
trunxzzzz 2007-01-19
  • 打赏
  • 举报
回复
直接写到设备dc上与先写到内存dc在考贝到设备dc上就想当于:你要运一批货到一个很远的地方,这段很远的路就相当于gdi接口,如过你一次只运这批货的一部分,这样在这段路上来回的时间就会很多,效率地下,但如果先装满车,在一次性运过去就会很快了,每"写"一个象素到显存就要等一段时间才能在"写"第2个,这样就会闪烁,但"拷完"一个象素在"拷"下一个象素应该就会快,那这里的"写"和"拷"的本质区别是什么?

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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