游戏开发论坛

 找回密码
 立即注册
搜索
查看: 8851|回复: 11

Direct3D制作二维界面总结(原创)

[复制链接]

22

主题

69

帖子

69

积分

注册会员

Rank: 2

积分
69
发表于 2006-9-28 22:33:00 | 显示全部楼层 |阅读模式
Direct3D制作二维界面总结(原创)

因为工作关系,最近用Direct3D中的二维部分制作了一个软件的界面部分,在这里将其中的感受写下来,与大家分享,也欢迎大家讨论!

GDI与Direct3D简单对比
GDI:        CPU占用少,但易产生画面闪烁现象,在现成的函数中,可达到画面效果比起Direct3D少的多。可以用现成的控件,处理消息方便,但受一定的系统限制!对硬件要求低。
Direct3D:由于程序结构的关系,CPU占用高,须采用脏矩形技术(但增加程序复杂性),才可有效降低CPU占用率,不会产生画面闪烁,可较之容易地渲染出华丽的画面!界面与用户的交互,完全靠自己来渲染不同的画面,控制比GDI 复杂,但可以精确地进行处理,达到自己想要的任何效果!对硬件有一定的要求,还需要装相应的运行时库,虽然使用脏矩形,可有效提高响应速度,但不同配置的机器,还是有明显的差别!还需考虑设备丢失问题。

    Direct3D制作的界面,实际为二维图形交互程序。我在刚开始写时,没有经验,便想到一点点来,但现在回想起来,程序结构是非常重要的,因为它不像GDI,有确定的处理方式,它没有现成的框架可用,我们的界面是什么样子的,完全由自己来控制。因此设计部分时一定要考虑周全,我觉得最基本的要求就是:程序易于理解、扩展并且效率高!对某个事件,一定要理解清楚,如鼠标点击某个图形,你可以在鼠标按下时进行处理相应的事件,也可以在鼠标按下再弹起时再处理,这就要分清其区别,这也是看出,比起GDI可进行更好的控制。
    在我的程序中,二维渲染,用的最多的是ID3DXSprite接口IDirect3DDevice9::UpdateSurface()方法(将后备缓冲作为参数) ,到后面基本上都用前一种了。为测试其性能,我仿照ID3DXSprite做过一个自己的精灵类,即创建顶点缓冲进行纹理渲染,在每次调用时,将顶点位置拷入,再进行渲染,发现两者差不多,只是在渲染比较小的纹理且每一帧渲染很多张纹理时,自己做的精灵类要快一些,所以就没有改它。不知大家是否认同?它可容易地渲染出透明的图形,再配合好美工,做出漂亮的界面是不难的!
    最终我的程序,使用脏矩形,大大降低了CPU占用率,提高了响应速度。程序很小,不到500K,但装入全部资源后,达到了近20M。

今天就想到这么多了,欢迎讨论,更希望抛砖引玉!
来Gameres.com这么久了,这是第一次发这样的贴子,希望和大家共同进步!

18

主题

631

帖子

660

积分

高级会员

Rank: 4

积分
660
发表于 2006-9-29 09:02:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

支持。。。。

我觉得HGE就做的不错啊。

30

主题

357

帖子

388

积分

中级会员

Rank: 3Rank: 3

积分
388
QQ
发表于 2006-10-1 10:52:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

脏矩形?能否解释一下这个名词?

187

主题

6490

帖子

6491

积分

论坛元老

团长

Rank: 8Rank: 8

积分
6491
发表于 2006-10-1 12:31:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

什么是脏矩形?简单的说,就是游戏每次画面的刷新只更新需要更新的那一块区域。

17

主题

85

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2006-10-1 18:10:00 | 显示全部楼层

Re: Direct3D制作二维界面总结(原创)

二维界面主要解决一个在2D屏幕上进行贴图的问题
自己以前写一个D3D程序的时候,感觉主要有三种方法
1)使用ID3DXSprite,很方便
2)设置FVF顶点属性xyzw,也就是顶点坐标为变换后的坐标,这时候顶点
的坐标和窗口坐标是一致的
3)设置FVF顶点属性xyz,虽然是3D顶点坐标,利用平行投影,同时将Y轴
正负方向翻转(翻转的原因是世界坐标系Y轴正方向向上,窗口坐标系中Y轴正方向方向向下,利用矩阵变换的Scaling就可以翻转),然后指定的坐标和屏幕上的坐标也能对应上了
不过自己没有比较过这几种方法那种效率更高,我想ID3DXSprite更好吧

16

主题

83

帖子

103

积分

注册会员

Rank: 2

积分
103
QQ
发表于 2006-10-9 13:51:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

界面要是半透明,就没法用这个技术了吧。

0

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2006-10-9 20:46:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

有兴趣的去电子工程师专栏里看看MPEG4新技术标准 里面提到种基于内容的压缩机制  
我当初就想是不是在动画里头把变化的那部分单独抽出来 一般最少动画都采取30帧  按理论来说 帧数越多细节越多  所以压缩的效果越明显  电影里最经常用的  就是用绿色屏幕放在演员后面然后拍摄各种动作 最后和拍的场景进行各成  绿色是和人皮肤差别最大的颜色  经过处理后 演员里的图象就不显示绿色  如果身上有绿色的也变成透明色的  视频压缩技术   很多就是和游戏紧密相关的

18

主题

92

帖子

92

积分

注册会员

Rank: 2

积分
92
发表于 2006-10-9 22:20:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

MPEG4,厉害!

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-10-9 22:21:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

俺也刚刚完成一个,用的是上面的第二种方法,是公司的东西,所以不能共享了,用了一个月完成了界面和游戏逻辑,公司的领导不懂技术,逼我我一个月完成,真是剥削啊!写完之后我大脑到现在还蒙蒙的.

2

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2008-3-22 15:36:00 | 显示全部楼层

Re:Direct3D制作二维界面总结(原创)

能不能说得清楚一点呢?最近也要用DX做界面。如果要做Framework里边的控件,应该怎么做呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 07:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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