游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5381|回复: 8

脏矩形最头疼的问题:如何确定一个图块是否脏了??

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2012-2-27 23:08:00 | 显示全部楼层 |阅读模式
假如渲染某个精灵,这个精灵的位置,尺寸都没有变化,唯独像素内容变化了,那其所在的图块如何得知该区域是否脏了??
难道要逐个比较当前帧的像素内容和上一帧的像素内容是否有变化?

还有,渲染一个文本,是不是也要和上一次比较,看他的文本是否有变化?

这些问题都不知道怎么解决..
我从风魂++里看到部分代码,似乎是否"脏了"是由渲染者提供的,这样设计就太差劲了,即把复杂度推给了应用层..
因为我不想让渲染者去关心脏矩形问题,我觉得图形模块应该完全隐藏这一实现。。

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20547
发表于 2012-2-27 23:51:00 | 显示全部楼层

Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

一般来说,不用考虑脏矩形的处理,还是用传统的刷新来得方便。

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-2-28 09:19:00 | 显示全部楼层

Re: Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

sea_bug: Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

一般来说,不用考虑脏矩形的处理,还是用传统的刷新来得方便。



然而我在不渲染任何东西的情况下(除了FPS),极限速度只有100帧,这时间都耗在了将后台表面blt到前台表面的步骤上。
而相同代码下,GDI和D3D都能轻松达到600多帧,这我实在没什么办法了目前。

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-2-28 09:25:00 | 显示全部楼层

Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

在翻了下云风的“我的编程感悟”后,知道了真相:
“每个对象被画到canvas上后,会由对象自己决定弄脏哪些格子……如果让canvas自身保存上一帧所有对象的状态并且和当前帧比较,则计算负担很大,所以应该由每个对象自身记录自己的变化状态,并在绘制的时候通知canvas”

1万

主题

1万

帖子

2万

积分

管理员

中级会员

Rank: 9Rank: 9Rank: 9

积分
20547
发表于 2012-2-28 13:18:00 | 显示全部楼层

Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

可是。。。600多???00帧,有区别吗!?

在实际运行中,帧数的下降不是一个线性过程,在加入所有逻辑后,游戏能稳定的60+就足够了。

脏矩形是个很不错的技术,我很多年以前写的hoho引擎也是有支持,但后来发现+10分的技术不等于+10分的效果。

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-2-28 13:34:00 | 显示全部楼层

Re: Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

sea_bug: Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

可是。。。600多???00帧,有区别吗!?

在实际运行中,帧数的下降不是一个线性过程,在加入所有逻辑后...



我是想知道为何ddraw帧数只有这么一点?整个程序仅仅是FillRect了一下后台缓冲,然后绘制了一个FPS文本,然后就blt到前台了而已.
而且,我在加入了一个图片渲染步骤后,帧数就降到了80多,如果是类似垂直同步的东西在影响,那么他应该维持在100fps才对.

关于脏矩形技术,我有点不想用,因为他将大大增加应用层,即图形模块使用者的负担,为了渲染一个图像,还要去关心什么时候要弄脏它,什么时候不弄脏,这我有些接受不了,我会认为他是一种失败的设计.

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-2-28 13:59:00 | 显示全部楼层

Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

我又像这样测了一下(其他代码不变):
RECT srcRect = { 0, 0, 80, 30 };
RECT dstRect = { posBase.x, posBase.y, posBase.x+80, posBase.y+30 };
m_pDDPrimarySurface->Blt(&dstRect, g_DDrawInfo.m_pDDBackSurface, &srcRect, DDBLTFAST_NOCOLORKEY|DDBLT_WAIT, NULL);

结果,FPS也仅200多,才blt80×30的尺寸,就这么点FPS,我先前再另一台机器上也测试过,也是一样的FPS

77

主题

485

帖子

486

积分

中级会员

Rank: 3Rank: 3

积分
486
发表于 2012-3-1 12:37:00 | 显示全部楼层

Re: Re: Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??

微无渊: Re: Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??




我是想知道为何ddraw帧数只有这么一点?整个程序仅仅是FillRect了一下后台缓冲,然后绘制了一个FPS文本...



文字是很降FPS的,DrawText很慢.把字符文字用图片代替,速度就提高了.

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2012-3-2 09:24:00 | 显示全部楼层

Re: Re: Re: Re:脏矩形最头疼的问题:如何确定一个图块是否

happyking: Re: Re: Re:脏矩形最头疼的问题:如何确定一个图块是否脏了??




文字是很降FPS的,DrawText很慢.把字符文字用图片代替,速度就提高了.


no
经验证,用surface绘制FPS和用文本绘制的FPS一样。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-1 01:09

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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