| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 967 人关注过本帖
标题:在对本版本中“构建自己的图形库”的改进中遇到的问题
只看楼主 加入收藏
tr0217
Rank: 1
等 级:等待验证会员
帖 子:53
专家分:2
注 册:2009-5-3
结帖率:50%
收藏
已结贴  问题点数:10 回复次数:5 
在对本版本中“构建自己的图形库”的改进中遇到的问题
上半年我对此版本中“构建自己的图形库”系列帖中给出的代码进行了改进。我的目标是
1、让各种色深、各种分辨率的图形模式编程具有同一性
2、提高位图的显示速度、基本图形绘制的速度
3、再增加一些基本图形绘制方法

做这些事情的原因是是为了方便从TC开始学习编程的同学们学习计算机图形学。因为AMD、INTEL高于奔腾D E2180的cpu型号不支持tc中的图形库。其原因是,计算机显示图形的底层实现标准VBE已经改变了好几次,继续对很旧的不再使用的标准提供支持是没有必要的。

一开始这三项任务都算是基本完成。把代码打包上传了。过了一段时间,拿出来编译,忽然发现提高位图显示的几个函数工作不当。百思不的其解,因为上传到网络后没有改写过代码呀。匆匆忙忙的检查了一下代码,虽然发想了几个错误,但这些bug不会在我的测试中表现出来,因为测试中没有考虑退化情况。

后来又很忙,国家测绘局的事情、软考复习、找工作等。国家测绘局的事最混账,把我软考的时间挤的还剩十多天。现在总算闲些了,又把代码改了下。但是我还是没发现自己错在哪儿。个人觉得把错误避免了,却不知道错误在那儿绝对不是我想要。所以我把有错误的代码和改正了的代码都发出来希望各位有时间时帮忙找找。

correct.rar 中放的是改正过的代码;另外一个放的就是错误的代码。

在说一下提高位图显示速度的方法,显示位图一点一点的绘制,那么我就一行一行的绘制,用memcpy把一行的信息写入视频缓存。观察内存页的大小和一样像素值所需的内存的多少,我得出来下面的结论

        /*容易知道一行像素最多跨两个内存页,一行像素可以分别
        占用第一页和占用第二页的两部分*/

那么在显示位图时只有某些行需要换页,对于需换页的行一分为二,用两次memcpy,其余的用一次memcpy这样能显著提高绘制速度。

但是我这样改写好后,绘制16位位图时是成功的,但绘制24位位图时只能绘制左边一半。但算法的想法是没有错的,代码到底错在那,也需要论坛里的各位帮帮忙。
correct.rar (561.32 KB)

GrSVGA.rar (4.44 KB)
搜索更多相关主题的帖子: 图形 构建 改进 
2009-12-17 21:52
tr0217
Rank: 1
等 级:等待验证会员
帖 子:53
专家分:2
注 册:2009-5-3
收藏
得分:0 
如果有其它的改进方法,也请不吝贴出来。
2009-12-17 21:55
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:0 
DOS 下的图形编程,如果仅仅基于 VBE 的标准去做,是没有办法的得到 2D 硬件加速的,也就是说所有的绘图操作,位块传送操作,都是通过 CPU 对显存的读写操作来实现的,都是软件的实现,速度自然上不来。

其实 DOS 图形编程中,最大的性能瓶颈是在于对显存的读写操作上,其他的运算操作开销相对很小,比如换页,乘法,除法,即使是对于整屏的绘制来说,换页的操作也不会超过100次。在位块传送(即位图显示)中,如果采用双字的读写(即 word),其速度会比采用字节读写快一倍,可惜 TC 中无法使用 32bit 的读写,否则速度可以更快。

DOS 现在还有一点应用的空间,比如 dos 启动盘,一键还原什么的,可以基于 DOS 去做。不过现在又有了 WinPE。

[ 本帖最后由 RockCarry 于 2009-12-18 09:57 编辑 ]
2009-12-18 09:55
tr0217
Rank: 1
等 级:等待验证会员
帖 子:53
专家分:2
注 册:2009-5-3
收藏
得分:0 
以下是引用RockCarry在2009-12-18 09:55:43的发言:

DOS 下的图形编程,如果仅仅基于 VBE 的标准去做,是没有办法的得到 2D 硬件加速的,也就是说所有的绘图操作,位块传送操作,都是通过 CPU 对显存的读写操作来实现的,都是软件的实现,速度自然上不来。

其实 DOS 图 ...
恩,我的意思也是一次传送的越多速度越快。所以我用memcpy一次传送一行,这样显示16位位图时很快。
2009-12-18 09:59
RockCarry
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:13
帖 子:662
专家分:58
注 册:2005-8-5
收藏
得分:10 
TC 库函数的 memcpy 的内部实现是优化的,关键是在于显存读写,TC 里面每次最大的读写单位是 16bit,memcpy 不过也是对要传送的数据,在一个循环中,每次以 16bit 的单位进行传送的,当然对于没有对齐的的地址和长度,还需要进行额外的操作。
即使是使用 movsb 和 movsw 等汇编指令进行优化,在 cpu 内部也是将其转换为一组微代码执行。movsb 每次的内存访问仍然是 1byte ,而 movsw 则是 1word,所以 movsw 比 movsb 快一倍,可惜的是 TC 不支持 movsd,无法进一步优化。


[ 本帖最后由 RockCarry 于 2009-12-18 10:57 编辑 ]
2009-12-18 10:56
tr0217
Rank: 1
等 级:等待验证会员
帖 子:53
专家分:2
注 册:2009-5-3
收藏
得分:0 
以下是引用RockCarry在2009-12-18 10:56:04的发言:

TC 库函数的 memcpy 的内部实现是优化的,关键是在于显存读写
谢谢,知道了。就是说TC2.0不能编译出有更高优化级别的指令。当然也不能调用显卡驱动,及读写显卡里的显存。TC能做的任务就是按VBE标准,将内存的一部分作为显存进行操作,使用的都是CPU的通用指令,没有图形图像的专用指令。所以就更不可能有更进一步的优化。
是不是在24位读写时,也是由于memcpy的内部原因导致了,只能绘制左边一半呢?
2009-12-21 16:29
快速回复:在对本版本中“构建自己的图形库”的改进中遇到的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018032 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved