垂直中断(vertical blank interrupt)和水平中断(horizontal blank interrupt)。
ndsl的硬件在屏幕上绘图的时候,是从上到下,从左到右,每个屏幕象素点依次绘制的。如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/bc714e31fefefa0727123043ac7ddedc.gif)
绘制的过程是一行一行地绘制,每当绘制完一行。黑色箭头所指示,就引发一个水平中断(Hblank
interrupt)。当所有的行都被绘制,相当于完成了一次红色箭头所指示的路径,硬件引发一个垂直中断(Vbland
interrupt)。当然,完成这些过程,是否引发中断,还要设置对应的寄存器。
interrupt)。当所有的行都被绘制,相当于完成了一次红色箭头所指示的路径,硬件引发一个垂直中断(Vbland
interrupt)。当然,完成这些过程,是否引发中断,还要设置对应的寄存器。
为什么需要这些中断?举个例子:
![](https://i-blog.csdnimg.cn/blog_migrate/45c4049cd2f55988cecbe9eb48e45422.gif)
如上图:最左边的文字是经过的时间,每一行的左边图形表示当时显存的内容,右边表示当时屏幕的显示内容。实际上,显存是一块线性的连续内存,并且每一个单位(8bit或者16bit)对应屏幕上的一点。但是为了具像,所以把显存抽象成跟屏幕一样是个矩形。另外要指出:nds是每1/60秒(2/120秒)绘制一次屏幕。
下面是对上图的解释:
0秒的时候:
内存的内容是一个正方形,硬件准备绘图,这时屏幕上什么也没有。
1/120秒的时候:
硬件把内存一半的内容绘制到屏幕上,屏幕上出现半个正方形。
再过了0.01/120秒的时候(也就是1.01/120):
这时你的程序希望显示一个三角形,于是就把整个内存的内容改写成三角形了,而在这短短的时间内,nds的绘制屏幕的硬件并没有停止,而是继续把显存的内容绘制到屏幕上,也就是绘制了第三行那小小的红色块。不过这些似乎并没有太大影响。
2/120秒的时候:
绘制的硬件完成了内存下半部红色区域所指示的内容的绘制,本来你写的程序以为要显示一个三角形,但实际上却显示成了右图所示的一个类似T状的图形。这并不是你所希望的结果。
实际上的程序和情况会比这个更加复杂和不可预知。因此,垂直和水平中断向量就是为了克服这个问题而引入的。
当完成了一次屏幕绘制的时候,就引发一个垂直中断。通过引发这个中断,这个时候就不再绘制屏幕,用户可以在这个时候更新显存,等到更新完毕的时候,设置好所有要显示的内容的时候,再让硬件进行绘制。这样就能够保证显示出来的东西是你所希望的东西了。