• 主题:【铁吧梦吧一家亲】希望铁吧的亲们多回归梦吧帮助新人。
  • 确实如此。给梦吧一些帮助是应该的,但是也不可一厢情愿,更不可以铁吧为代价。铁吧的小而精的传统可千万不要丢失了。  
    同意!只知吃垃圾快餐的家伙们,你给他们健康精美的食物,他们还觉得不过瘾,太清淡呢。  
    我用手机和iPad,容易忽视招唤。。。  
    看你能否守住神棍们的猛攻!  
    啊?!好吧,我就贴一篇多年前我以profx这个网名写的塞班编程系列文章,用来证明我还是懂点编程的。在当时那会儿我写的这个系列挺受欢迎的。  
    在Prox的故乡,一个美丽而遥远的星球,计算设备早已没有了屏幕显示的概念。一切图像都以思想的速度在脑海中呈现!多么美好啊!可是,自从来到地球这个落后的星球,落后的科技使他不得不重新考虑很多问题。缓慢的屏幕图像刷新速度就是问题之一。

    好比下面这样一段代码。虽然能够正确地显示图像,却伴随着令人头晕的屏幕闪烁。而且那些小方块会按着顺序一个接一个的出现,纺若一条小虫(Profx很不喜欢的一种食品)!

    voidCMyView::Draw(constTRect&aRect)const
    {
    CWindowGc&gc=SystemGc();
    TRectrect=Rect();
    gc.Clear(rect);
    for(inti=0;i100;i+=2){
    ***rawRect(TRect(TPoint(i,i),TSize(50,50)));
    }
    }
    怎么会这样呢?很简单,直接往屏幕上画图的速度是很慢的。这个问题在制作动画的时候尤其明显,因为我们可能要在一秒中之内刷新屏幕几十次。如果按每秒二十五屏的速度来刷新的话,就意味着我们要在一秒中之内画一千多个小方块!

    Profx通过中央电脑查到古时候有一种叫做DoubleBuffering的办法可以解决这个问题。其实很简单:
    一、在内存里生成一个和屏幕同样大小的buffer
    二、在内存里(Off-screenBuffer)画图
    三、把Off-screenBuffer画到屏幕上
    这样做的好处有二:
    一、写内存远比写屏(IO)快多了
    二、无论所画图形有多复杂,我们只需要做一次IO操作!
    下面我们来看看具体做法:
    一、在你的mmp文件里加这么几行:
    LIBRARYfbscli.lib
    LIBRARYbitgdi.lib
    二、假设你的Viewclass叫做CMyView。在MyView.h里加入:
    #includefbs.h
    ...
    private:
    CFbsBitmap*iOffScrnBmp;
    CFbsBitmapDevice*iOffScrnBmpDevice;
    CFbsBitGc*iOffScrnContext;
    三、在MyView.cpp里加入:
    voidCMyView::ConstructL(constTRect&aRect)
    {
    ...
    iOffScrnBmp=new(ELeave)CFbsBitmap;
    User::LeaveIfError(iOffScrnBmp-Create(Size(),EColor4K));
    iOffScrnBmpDevice=CFbsBitmapDevice::NewL(iOffScrnBmp);
    User::LeaveIfError(iOffScrnBmpDevice-CreateContext(iOffScrnContext));
    }
    说明一下。上面的代码除了生成了我们所需的Off-screenBuffer,即一个4096色的CFbsBitmap之外,还在它上面加了一个iOffScrnContext。这个东西(CFbsBitGc)是我们用来往我们的buffer上面画图用的工具。

    继续:
    CMyView::~CMyView()
    {
    deleteiOffScrnBmp;
    deleteiOffScrnBmpDevice;
    deleteiOffScrnContext;
    }
    voidCMyView::Draw(constTRect&aRect)const
    {
    //把我们的buffer清空
    iOffScrnContext-Clear(Rect());
    //在buffer里画方块,而不是在屏幕上
    for(inti=0;i100;i+=2){
    iOffScrnContext-DrawRect(TRect(TPoint(i,i),TSize(50,50)));
    }
    //一次性把buffer画到屏幕上
    CWindowGc&gc=SystemGc();
    gc.BitBlt(TPoint(0,0),iOffScrnBmp);
    }
    哈哈!虽然离profx的星球上的技术还有一定差距,至少闪烁和“蠕虫现象”都消失了!Profx觉得,地球这个地方,还是可以继续呆下去的。  
    嘿嘿,你看出亮点啦,令我生出知音的感觉!谢谢夸奖!  
    秋秋真是精辟  
    小心蚂蚁把你绑去练辟邪剑法  
    吆喝也很重要啊  
    但是独孤九剑打不过葵花宝典的。。。  
    叩见帮主!  
    也许会被新来的,不熟悉铁帮历史,正愁没机会表现的那帮子给乱刀砍死。。。  
    遇上葵花一刀肯定还是不行呀  
    哦。。。我说的是练葵花前要挨的那一刀。。。  
    自己哪里下的去手啊  
    写的好。梦境是意识参与的结果,我们作为观察者的同时也是创造者。我在与潜意识共舞和破而后立那两篇文章中也有表达相似的意思。  
    现实世界也大体如此  
    关键令狐冲学的独孤九剑只是独孤求败早年的剑法而已  
    等到把一批新人变成老朋友了再接纳更多的新人,这样会比较好些。就像吃饭,我的习惯是吃完一道菜再吃另一道。。。