游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2733|回复: 6

不知能不能再优化?

[复制链接]

5

主题

31

帖子

33

积分

注册会员

Rank: 2

积分
33
发表于 2004-5-17 13:25:00 | 显示全部楼层 |阅读模式
我是这样实现Alpha混合的:
  首先,将显存的位图Blt到内存;
  然后,在内存中逐象素混合;
  最后,再Blt到显存中,Flip显示.
我感觉速度还是比较慢,请问:能不能再优化?谢谢!

50

主题

992

帖子

1012

积分

金牌会员

Rank: 6Rank: 6

积分
1012
发表于 2004-5-17 13:50:00 | 显示全部楼层

Re:不知能不能再优化?

读写显存的速度会很慢,这种方法不是很好

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-5-17 19:54:00 | 显示全部楼层

Re:不知能不能再优化?

可以这样,自己在内存中建立一个BackBuffer,将所有的显示工作写入这个BackBuffer,然后在这个BackBuffer中进行Alpha混合,最后将这个BackBuffer的内容拷贝到PrimarySurface中。也就是说,不使用DX帮你建立的BackBuffer,而是只建立一个PrimarySurface,用自己建立的BackBuffer充当后缓冲页,与PrimarySurface进行换页。这样所有的工作全部在内存中进行,只进行一次内存->显存的操作,效率应该高一些,我以前学习ddraw时,每次使用的都是dx帮你建立的BackBuffer,效率大概只有几十帧,换成这种方法后,效率提高了10倍(我用的是Radeon LE)。

9

主题

31

帖子

31

积分

注册会员

Rank: 2

积分
31
发表于 2004-5-20 19:59:00 | 显示全部楼层

Re:不知能不能再优化?

楼上的说建立一个PrimarySurface,用自己建立的BackBuffer充当后缓冲页,与PrimarySurface进行换页。
我想知道怎么与PrimarySurface进行换页,自己用内存拷贝吗?我觉得速度好象是快了一点点,但好象没有你说的那么快吧?而且我觉得这样做的话,屏幕好象有点抖动,没有FLIP来的平滑呀!
我是这样初始化的,先建立一个主页面外带一个BACKBUFFER后台缓存,再建几个放在内存中的离屏页面,平常数据操作都在离屏页面之间进行,然后BLTFAST到BACKBUFFER后缓存,然后再FLIP翻页!不知这样对不对?

18

主题

573

帖子

573

积分

高级会员

Rank: 4

积分
573
发表于 2004-5-21 01:03:00 | 显示全部楼层

Re:不知能不能再优化?

1、抱歉,前一次没有看看自己原来写的代码(大概有一年左右了,最近才把这些代码翻出来),这几天看了看。具体过程跟原来的一样,但是是让ddraw帮你建立PrimarySurface,然后按照常规方法,从PrimarySurface中得到一个BackSurface,然后自己建立一个OffSurface,大小与BackSurface一致,所有的Alpha渲染工作就在这个OffSurface中进行,当时我想的是将这个OffSurface建在内存中,所有的需要Alpha的Surface也建在内存中,这样就避免了内存->显存的读写操作,Alpha运算将在内存中进行,然后将这个OffSurface的内容拷贝到BackSurface中(我用的是Blt方法),然后就是BackSurface与PrimarySurface的Flip了,这样的确比直接在BackSurface中进行Alpha混合速度快一些,真的是十倍左右的速度提升,原来的只有几十帧,换成这种方法后,有100~150多帧。
2、还有就是当时我试验过,但是只是在自己的机器上(XP1800+,Radeon LE),自己建立一个BackBuffer,然后将其用Blt函数拷贝到PrimarySurface来代替Flip操作,的确比直接用常规方法建立的BackSurface-&gtrimarySurface的Flip要快,但是因为当时测试的静态画面,没有进行动态画面的测试,所以会存在画面抖动的情况。

85

主题

824

帖子

878

积分

高级会员

Rank: 4

积分
878
QQ
发表于 2004-5-21 15:14:00 | 显示全部楼层

Re:不知能不能再优化?

其实只要使用MMX和SSE优化了程序,Blt时并不会花多少时间的

5

主题

31

帖子

33

积分

注册会员

Rank: 2

积分
33
 楼主| 发表于 2004-5-22 19:04:00 | 显示全部楼层

Re: 不知能不能再优化?

我说的太简单了,下面给出我画透明Bar的函数,请问在这基础之上能不能优化.
其中:
typedef unsigned short COLOR16;  // 16bits color
typedef COLORREF       COLOR32;  // 32bits color
函数中所有未定义的量都是全局变量

void DDAlphaBar(LPDIRECTDRAWSURFACE7 lpdds, int x1, int y1, int x2, int y2, COLOR32 color, int alpha)  
{
        int x, y;
        COLOR16 color16 = RGB16Bit(color);
       
        if(x1 < 0)
        {
                if(x2 < 0) return;
                x1 = 0;
        }
        else
        {
                if(x2 >= SCREEN_WIDTH)
                {
                        if(x1 >= SCREEN_WIDTH) return;
                        x2 = SCREEN_WIDTH - 1;
                }
        }
        if(y1 < 0)
        {
                if(y2 < 0) return;
                y1 = 0;
        }
        else
        {
                if(y2 >= SCREEN_HEIGHT)
                {
                        if(y1 >= SCREEN_HEIGHT) return;
                        y2 = SCREEN_HEIGHT - 1;
                }
        }

        int width = x2 - x1 + 1, height = y2 - y1 + 1;

        DDCreateSurface(lpDDTemp, width, height, 0); // 0表示建在内存中
        DDBltFast(lpDDTemp, 0, 0, lpdds, x1, y1, width, height, 0);

        if(DDBeginDraw(lpDDTemp)) //获取页面指针存入GraphBuffer
        {
                for(x = 0; x < width; x++)
                {
                        for(y = 0; y < height; y++)
                        {
                                GraphBuffer[GraphPitch * y + x] = _AlphaPixel(GraphBuffer[GraphPitch * y + x], color16, alpha);
                        } // end for y
                } // end for x
                DDEndDraw(lpDDTemp); //页面解锁
                DDBltFast(lpdds, x1, y1, lpDDTemp, 0, 0, width, height, 0);
        } // end if
} // end DDAlphaBar
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-1 06:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表