游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4413|回复: 9

[探讨]对应用层完全隐藏脏矩形实现的一个方案

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-9-3 23:47:00 | 显示全部楼层 |阅读模式
脏矩形系统有个问题就是,要不要让应用层去关心哪块区域要弄脏? 似乎,要做到完全隐藏,很难? 就是代价很高?

我想了一个方案:
首先,我的脏矩形是这样的,把窗口以64×32的尺寸划分成众多的block,然后把所有的绘制动作都添加到各自涉及到的block下,然后最后以block为单位,一一绘制.
比如,我要在100,100,200,200的地方绘制一个图像,那么首先找到所影响到的每个block,然后记录绘制信息,把整个图像的绘制分摊给每个block,
最后在一帧结束前,遍历所有的block,把图像绘制出来,然后就可以通过设定某某块block为脏,来达到脏矩形的功能.

然而,我期望我给应用层提供的绘制接口是这样的:
void Draw_Bmp(BYTE* pBmp, int width, int height, int x, int y);

然后应用层只管拿这个接口随心所欲的绘制他想绘制的图像就行了,而不用关心脏矩形问题。

以下是自动检测某个block是否被弄脏的方案:
1:为所有的block准备各自的一份链表,以记录该block下所有的绘制动作,然后再准备一份,用于备份上一帧的所有绘制动作,
2:绘制图像时,仅简单的记录绘制动作到各自的block下,
3:在一帧结束前,开始检测,即:对每个block下的所有绘制动作,和上一帧相比较,只要有一丝不相同(像素指针不同,或xy坐标不同,或宽高不同),就判定为该块脏了

大概就是这样..
欢迎查补缺漏..

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-9-4 17:11:00 | 显示全部楼层

Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案

今天把代码正式封装了一下(代码总行数仅734行),用的是SetDIBitsToDevice()函数,
结果帧数之高,让我瞠目结舌,达到了3500帧

我列个表,比对一下:
1:什么都不渲染的情况下,得到的FPS是260帧,这是极限,就是纯粹的调用SetDIBitsToDevice()填充背景色的速度,
2:渲染120个128×126的角色动画,再加上一个800×600的法术动画,在未使用脏矩形的情况下,FPS为45帧
3:和第2条一样,但是开启了脏矩形,得到的FPS是3500帧
4:同样是绘制这些图片,改用DX9得到的速度只有200帧!!

PS:以上的FPS计算是通过输出文件得知的,而不是通过绘制文本

这是输出的结果:
一帧消耗:16 fps:250
一帧消耗:15 fps:264
一帧消耗:16 fps:239
一帧消耗:15 fps:261
一帧消耗:16 fps:262
一帧消耗:16 fps:267
一帧消耗:15 fps:262
一帧消耗:16 fps:268
一帧消耗:31 fps:44
一帧消耗:16 fps:45
一帧消耗:32 fps:44
一帧消耗:31 fps:46
一帧消耗:31 fps:45
一帧消耗:32 fps:45
一帧消耗:15 fps:44
一帧消耗:32 fps:45
一帧消耗:31 fps:44
一帧消耗:31 fps:46
一帧消耗:32 fps:45
一帧消耗:16 fps:3373
一帧消耗:15 fps:3490
一帧消耗:16 fps:3461
一帧消耗:16 fps:3477
一帧消耗:15 fps:3433
一帧消耗:16 fps:3429
一帧消耗:15 fps:3541
一帧消耗:16 fps:3409
一帧消耗:16 fps:3516
一帧消耗:15 fps:3391
一帧消耗:16 fps:3584
一帧消耗:16 fps:3444

以下是gdi和dx9的源码:
http://www.newmuhon.com/files/gdi_dx9.rar

加了fps绘制,效果图:

0

主题

37

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2012-9-6 15:16:00 | 显示全部楼层

Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案

不是做客户端的,纯顶了

0

主题

37

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2012-9-6 15:20:00 | 显示全部楼层

Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案

拿你的code跑没有图,左上角显示300-400帧

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-9-6 18:07:00 | 显示全部楼层

Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案

numpfish: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案

拿你的code跑没有图,左上角显示300-400帧


在main.cpp那个MainLoop()函数里面,把"if (0)" 这条去掉就可以了,我打包代码的时候给疏忽了,
哦,对还有就是我把脏矩形也给关闭了,真糟糕..
(我还是重新打包上传吧)

新的链接:
http://www.newmuhon.com/files/gdi_dx9.rar

0

主题

37

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2012-9-7 14:33:00 | 显示全部楼层

Re: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案

微无渊: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案



在main.cpp那个MainLoop()函数里面,把"if (0)" 这条去掉就可以了,我打包代码的时候给疏忽了...

跑了,9k,吓到了
i3 配了个集成显卡…… win7 x64

0

主题

37

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2012-9-7 14:36:00 | 显示全部楼层

Re: Re: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案

numpfish: Re: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案


跑了,9k,吓到了
i3 配了个集成显卡…… win7 x64

错了,9k的是debug版……, release跑出了22k

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-9-7 15:14:00 | 显示全部楼层

Re: Re: Re: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个

numpfish: Re: Re: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案


错了,9k的是debug版……, release跑出了22k


这就对了,我用的都是低端机器(IBM T60)

0

主题

37

帖子

82

积分

注册会员

Rank: 2

积分
82
发表于 2012-9-7 16:41:00 | 显示全部楼层

Re: Re: Re: Re: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的

微无渊: Re: Re: Re: Re: Re:[探讨]对应用层完全隐藏脏矩形实现的一个方案



这就对了,我用的都是低端机器(IBM T60)

可以扔给前台用了

0

主题

8

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2012-9-17 21:58:00 | 显示全部楼层

Re: [探讨]对应用层完全隐藏脏矩形实现的一个方案

有句话, 叫做物尽其能, 人尽其才
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-27 16:15

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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