设为首页 加入收藏

TOP

用户界面――屏幕和键盘(二)
2014-11-23 21:36:47 】 浏览:1240
Tags:用户界面 屏幕 键盘
在有些应用中,需要尽可能快地写屏幕,这样的程序可能包括:


  ·文本编辑器。如果不能很快地写屏幕,则由用户输入文本所造成的屏幕滚动和其它有关操作可能会显得太慢。


  ·活动的文本。在同一区域快速地打印字符,是获得动画效果的一种常用手段,如果不能快速地把文本打印到屏幕上,那么动画就太慢了,视觉效果就不会好。


  ·监视器程序。这样的程序要连续地监视系统、其它程序或硬件设备,它可能需要每秒在屏幕上打印多次状态的更新信息,而通过标准c库函数实现的屏幕打印对这样的程序来说很可能显得太慢。


  那么,在这些情况下应该怎么办呢 有三种办法可以加快程序写屏幕的速度:选用额外开销较小的打印函数;使用提供了快速打印功能的软件包或函数库;跳过操作系统,直接写屏幕。下面将按从简到繁的顺序分析这几种办法。


  选用额外开销较小的打印函数


  有些打印函数的额外开销比别的打印函数要多。“额外开销”是指与其它函数相比,某个函数必须做的额外工作。例如,printf()的额外开销就比puts()多。那么,为什么会这样呢


  puts()函数是很简单的,它接受一个字符串并把它写到显示器屏幕上。当然,printf()函数也能做同样的工作,但它还要做大量其它的工作――它要分析送给它的字符串,以找出指示如何打印内部数据的那部分特殊代码。


  也许你的程序中没有特殊字符,而且你也没有传递任何这样的字符,但不幸的是,printf()无法知道这一点,它每次都必须检查字符串中是否有特殊字符。


  函数putch()和puts()之间也有一点微小的差别――在只打印单个字符时,putch()的效果更好(额外开销更少)。


  遗憾的是,与真正把字符写到屏幕上所带来的额外开销相比,这些C函数本身的额外开销是微不足道的。因此,除了在一些特殊情况下之外,这种办法对程序员不会有太大的帮助。


  使用提供了快速打印功能的软件包或函数库


  这可能是有效地提高写屏速度的最简单的办法。你可以得到这样的一个软件包,它或者会用更快的版本替换编译程序中固有的打印函数,或者会提供一些更快的打印函数。


  这种办法使程序员的工作变得十分轻松,因为他几乎不需要改动自己的程序,并且可以使用别人花了大量时间优化好了的代码。这种办法的缺点是这些代码可能属于另一个程序员,在你的程序中使用它们的费用可能是昂贵的。此外,你可能无法把你的程序移植到另一种平台上,因为那种平台上可能没有相应的软件包。


  不管怎样,对程序员来说,这是一种既实用又有效的办法。


  跳过操作系统,直接写屏幕


  由于多种原因,这种办法有时不太令人满意。事实上,这种办法在有些计算机和操作系统上根本无法实现。此外,这种办法的具体实现通常会因计算机的不同而不同,甚至在同一台计算机上还会因编译程序的不同而不同。


  不管怎样,为了提高视频输出速度,直接写屏是非常必要的。对全屏幕文本来说,你可能可以每秒种写几百屏。如果你需要这样的性能(可能是为了视频游戏),采用这种办法是值得的。


  因为每种计算机和操作系统对这个问题的处理方法是不同的,所以要写出适用于所有操作系统的程序是不现实的。下文将介绍如何用Borland c在MS-DOS下实现这种办法。即使你不使用这些系统,你也应该能从下文中了解到正确的方法,这样你就可以在你的计算机和操作系统上写出类似的程序了。


  首先,你需要某种能把数据写到屏幕上的方法。你可以创建一个指向视频缓冲区的指针。在MS-DOS下使用Borland C时,可以用下述语句实现这一点:


  char far*Sereen=MK_FP(0xb800,Ox0000);


  far指针所指向的地址并不局限于程序的数据段中,它可以指向内存中的任何地方。MK_FP()产生一个指向指定位置的far指针。有些其它的编译程序和计算机并不要求区分指针的类型,或者没有类似的函数,你应该在编译程序手册中查找相应的信息。


  现在,你有了一个“指向”屏幕左上角的指针。只要你向该指针所指向的内存位置写入若干字节,相应的字符就会从屏幕的左上角开始显示。下面这个程序就是这样做的:


  #include


  main()


  {


  int a:


  char far*Screen=MK_FP(Oxb800。Ox0000):


  for(a=0;a<26;++a)


  sereen[a*2]=\'a\'+a:


  return(O);


  }


  该程序运行后,屏幕顶端就会打印出小写的字母表。


  你将会发现,字符在视频缓冲区中并不是连续存放的,而是每隔一个字节存放一个。这是为什么呢 这是因为一个字符虽然仅占一个字节,但紧接着它的下一个字节要用来存放该字符的颜色值。因此,屏幕上显示的每个字符在计算机内存中都占两个字节:一个字节存放字符本身,另一个字节存放它的颜色值。


  这说明了两点:首先,必须把字符写入内存中相隔的字节中,否则你将会只看到相隔的字符,并且带有古怪的颜色。其次,如果要写带颜色的文本,或者改变某个位置原有的颜色,你就需要自己去写相应的颜色字节。如果不这样做,文本仍然会按原来的颜色显示。每个描述颜色的字节既要描述字符的颜色(即前景色),又要描述字符的背景色。一共有16种前景色和16种背景色,分别用颜色字节的低4位和高4位来表示。


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇gdb基础调试本机可执行文件 下一篇BCB中用Sender参数实现代码重用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目