【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2171|回复: 4

[求助]看了会儿 MS 的 DXUT,又涌现出满脑子疑问

[复制链接]
发表于 2009-1-12 17:18:40 | 显示全部楼层 |阅读模式

疑问很多,先说一个:

为什么在 MS 的代码中,使用函数的形参这么麻烦???

对于函数形参的使用,我一般是这样的:

 

int Draw(LPD3DDEVICE lpDevice)

{

    // 直接对形参使用;

    Sprite->Draw(lpDevice,&rect,.....)

}

 

在 MS 的代码中,对形参的使用,还要“拐个弯”

 

int Draw(LPD3DDEVICE lpDevice)

{

    LPD3DDEVICE Device;  //为什么不直接使用形参,而在函数内部定义一个局部变量,然后把形参赋值给他????

    Device=lpDevice;          //不浪费时间和资源???

    Sprite->Draw(Device,&rect,.....)

}

 

如果是为了安全性的考虑,直接把函数声明改成:  int Draw(Const LPD3DDEVICE lpDevice)  加上 Const 关键字也可以啊。。。。

不解。。。。

 

 

发表于 2009-1-13 09:15:43 | 显示全部楼层

第一个问题 大概出于某种习惯吧~~保护传进来的地址。我喜欢用你说的第二种 直接const。

对于你说的BeginScene()里的加入逻辑代码,一般不这么做,一般逻辑代码都放在BeginScene()外的;无论是从效率方面考虑还是从书写规范上,我觉得程序员一般都会写在外面。看微软代码很多都放在里面了,所以推测效率应该相差不大。

你要写多个BeginScene(),我觉得完全没有必要,反复切换渲染状态就已经很消耗系统资源了,你如果还在不断的开关渲染,不是更消耗么;第二种方式肯定行不通,绝对比把逻辑代码放在BeginScene()内部消耗大

 楼主| 发表于 2009-1-13 11:05:03 | 显示全部楼层

如果只使用一次 Device->BeginScene() 和 Device->EndScene() ,那么对于一个稍微复杂点的D3D程序来说,中间不含有逻辑代码几乎是不可能的。。。

 

我们俩做 RTT 的时候不就很明显吗??

 

void Render()

{

      Device->BeginScene();

 

      SetRTTMetrix();

      DrawRTT();

      SetPrimaryMetrix();

      DrawPrimary();

 

      Device->EndScene();

}

 

其中的 SetRTTMetrix() 和 SetPrimaryMetrix(),我认为就是逻辑部分咯。。。

 

不过总的来说还是解决了问题:

1.尽量把所有逻辑放在 Device->BeginScene() 和 Device->EndScene() 之外(尽一切可能。。。)

2.所有渲染,只使用唯一的一对 Device->BeginScene() 和 Device->EndScene()

3.用 Const 。。。。。

发表于 2009-1-13 15:46:50 | 显示全部楼层

那些,只能在Device->BeginScene() 和 Device->EndScene() 之间的逻辑就只好写在里面了,比如矩阵变换,渲染状态的设置。

能写在外面的 比如游戏逻辑,最好写在外面。

 楼主| 发表于 2009-1-12 17:30:09 | 显示全部楼层

第二个疑问:

Device->BeginScene()

????

Device->EndScene()。。。。

 

Device->BeginScene() 和 Device->EndScene() 之间,是不是只写“绘图函数”??如果在他们之间,放置一些“非绘图函数”,是否会影响程序性能??

 

在很多情况下,我们往往是这样做的:计算---绘一部分图形--计算---绘制另一部分图形,也就是说,我们的图形不是一次绘制完成的,在中途要经过计算,比如,设置各种 State ,重置 Metrix,重置 ViewPort。。。。。。这样的话,我们的每一个最终画面,都要经过很多次绘制。。。

 

那么,我们该如何组织代码才能把程序的性能提高呢???

我们的渲染部分代码应该这样吗???

 

Void Render()

{     

     CalcPart1()

     Device->BeginScene()

     DrawPart1()

     Device->EndScene()。。。。

 

     CalcPart2()

     Device->BeginScene()

     DrawPart2()

     Device->EndScene()。。。。

 

...................

    

     CalcPartN()

     Device->BeginScene()

     DrawPartN()

     Device->EndScene()。。。。

}

 

 

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 08:57

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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