framebuffer
放弃了在flash player上继续做bway3d,决定把3D引擎的工作都转移到linux下来。现只是刚入门径,就已經尝到了甜头。
选择引擎的渲染方式经过一段时间,最开始想用GKT,QT之类的,发现它们都是对xlib的封装(我厌倦用封装过很多很多层的东西),就转而去学xlib,学x协议。看了x协议就明白它的绘图效率是起不来的的:照我狭隘理解,普通的绘图程序会调用系统提供的API,例如GDI模型就是:绘图程序向内核发送绘图请求(通过API)->内核调用相关模块完成绘图。但经典的x-window模型是:工作站上的绘图程序(client)发送绘图请求给server->运行在瘦客户机上的xserver调用相关模块完成绘图。这个模型初衷是基于网络的【远程工作站+瘦客户机】,相当于远程桌面,它比腾讯的远程操控快很多,但若是运行在pc上,xserver就是累赘了。为什么绘图程序不能直接跟内核打交道,而要xserver代理?于是就想到直接获得对显卡的操纵,此时svgalib映入眼帘...但折腾了好久,源码编译过不了,国内几乎没有资料。大概是在google svgalib的时候知道了framebuffer。
已经想好用framebuffer来做光栅化渲染,log some tips as following:
1,FrameBuffer 只是一个提供显示内存和显示芯片寄存器从物理内存映射到进程地址空间中的设备。所以,对于应用程序而言,如果希望在 FrameBuffer 之上进行图形编程,还需要自己动手完成其他许多工作。
2,LCD会定期(通常60HZ)扫描framebuffer到屏幕上,因此写入framebuffer的pixelVlaue会在一个扫描周期内被显示到屏幕上。
3,linux的framebuffer刚好够一个屏幕用,看资料上说andriod的framebuffer就两倍于屏幕大小。如此做双buffer方便的多。不知道linux怎么想的。
3,framebuffer的试验在tty下做才有效果,如果想在xwidnow下做,得设置xwindow使用framebuffer驱动。我是从这篇帖子上学到的:
---------------------
Linux下的显卡驱动有两层, 一个是kernel层的也就是framebuffer驱动, 另一个是Xserver层驱动, 在进入X- windows之前是由framebuffer来驱动, 进入X-windows之后由XSERVER层的驱动作用(/etc/X11 /xorg.conf中可以设置显卡等驱动), 当然如果你想要在X-WINDOWS上用framebuffer驱动也可以, 可以使用Xserver中 的fbdev驱动, 这个驱动可以指定你要使用kernel层的framebuffer, 比如在xorg.conf中这样写
Section "Device" Identifier "Videocard0" Driver "fbdev" VendorName "Videocard vendor" BoardName "VESA driver (generic)" BusID "PCI:0:14:0" Option "fbdev" "/dev/fb1" #使用/dev/fb1这个framebuffer驱动 EndSection
----------------------
本人linux没有/etc/X11/xorg.conf文件,我是在/usr/share/X11/xorg.conf.d下新建一个00-screen.conf文件,把上面的内容复制进去的。 重启电脑后我的framebuffer测试程序就可以在x桌面上绘图了。此模式下鼠标有些闪。
4,发现往framebuffer里写数据比往普通内存里写慢的多,因此我在内存里开出一块后台绘制区,绘制完成了再拷贝到framebuffer,一是防闪,二就是减少写开销。现在还不知道是什么原因。
5,framebuffer的line_length是硬件决定的,不要用xres_virtual*bits_per_pixel/8去算。
posted on 2013-03-08 16:48 weiweishuo 阅读(1111) 评论(0) 编辑 收藏 举报