游戏开发论坛

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

Ogre引擎的几大失误

[复制链接]

4

主题

15

帖子

26

积分

注册会员

Rank: 2

积分
26
QQ
发表于 2008-8-1 17:48:00 | 显示全部楼层 |阅读模式
本文是读后感性质的文章,仅仅代表个人观点。
读了些OGRE引擎的代码,觉得里面有些不足,希望高手指点,写的不好,千万不要骂我啊!

1.设计方面
Ogre在设计方面采用插件机制(这一点我很欣赏),但是用的不彻底,导致其上层模块过于庞大。读者可以看到Ogre.dll库几乎囊括了渲染系统,读写系统,控制系统等等,如果能把这些东西从中分解开来,以插件的形式实现之,而上层的类统统以虚接口的形式给出,这样就更加完美。笔者曾经做过从3DMax中导出ogre支持的mesh模型的插件。虽然ogre也提供了这种插件,但是必须要将模型转为XML文件,再转为Mesh文件,如果模型比较简单,这样做没有问题,但如果模型超过了某个数量级的话,导出过程将变的十分缓慢,而且有时会出现死机现象。为什么ogre不提供直接导出Mesh的插件哪?原因在于Ogre并没有把导出Mesh的类独立出来,读者可以看MeshSerialize这个类里有直接导出Mesh的接口,却无法3DMax插件里使用,原因是因为该类与引擎关联了起来,因此要使用该接口你必须要做初始话引擎的一系列操作(包括加载资源,确定底层是用OpenGL还是Direct3D等),但是从逻辑上讲MeshSerialize应该是和上述操作无关的,他应该只关心Mesh文件的结构,而不应该关联引擎的东西。如果把它分离出来,不仅减轻了Ogre的压力,而且对与我们这些开发者来说,很容易开发基于任何平台的导出插件。

2.无法干预的渲染流程
Ogre把其渲染流程封装到了底层,对于老老实实用Ogre开发的人员提供了便利,它们不需要写大量的OpenGL或者Direct3D的代码就可以实现很绚丽的效果,比如天空包围盒,只需写一行代码就可以完成。但是对与我这种不安分的程序员来说的话,这种优点反而成了我的拌脚石,比如我向加入模板检测来实现一些特殊的效果,除了用Shader来实现好像就没有别的办法了(1.06之前的版本是这样,因为很久没关注过Ogre,不知道现在的版本是否支持)。

3.有些逻辑经不起推敲
如果你在Root里加入一个FrameListener的话,然后在未出函数体之前将其Remove掉,将会导致死机,原因是FrameListener是异步加入,也就是说FrameListener必须在渲染一桢后才被加入到引擎中。但是从语言的角度说的话,将一个对象加入到另一个对象然后删除应该是正确的。起码不应该死机。如果找从SceneManager中取一个不存在的Entity,Billboard等会抛出异常,但是引擎中并未提供该对象判断是否存在的方法。

4.一些Bug
为材质同时添加自动沿X,Y方向移动的效果时,出现内存泄露,如果只沿X或Y方向不会有内存泄露,原因是它只删除一个Control

4

主题

44

帖子

44

积分

注册会员

Rank: 2

积分
44
发表于 2008-8-1 18:46:00 | 显示全部楼层

Re:Ogre引擎的几大失误

后两点不是什么大失误,都是可以修正而且不难修正的Bug而已。
前两天我比较赞同,Ogre虽然提供的空间已经很大了,但这个空间仍然有可能会有满足不了需求的时候。

18

主题

211

帖子

419

积分

中级会员

Rank: 3Rank: 3

积分
419
发表于 2008-8-1 22:32:00 | 显示全部楼层

Re:Ogre引擎的几大失误

呵呵,,还有个问题:当OGRE里面导了好多的物体,,速度好慢!!!对场景的管理不怎么样!!!

1

主题

10

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2008-8-4 09:38:00 | 显示全部楼层

Re:Ogre引擎的几大失误

我的感觉是Ogre的开发人员没有严谨的工程习惯,Ogre中大量夹杂了TAB和空格。关于代码中TAB还是空格的使用,我考察了老牌的开源项目ACE,发现ACE全部使用空格。开源的Nebula引擎全部使用空格。从这一点上,ACE和Nebula显然要严谨一些。当然,这只是非常小的瑕疵,并不能掩盖Ogre的光芒。

36

主题

197

帖子

197

积分

注册会员

Rank: 2

积分
197
发表于 2008-8-4 14:51:00 | 显示全部楼层

Re:Ogre引擎的几大失误

我感觉没那么严重吧

1)
为什么要先xml?ofusion就不是这么做的,至少1w面的物体导出速度很快

mesh是3d绘图的基本要素,要是和dx,opl的插件dll放在一起,我倒是觉得有点问题

另外,虽然我没有试验过,不过看 MeshSerialize的代码,我认为它是一个可以单独初始化的class

2)
用shader难道不好么,不过封装的东西自然不够灵活

3)
SceneManager没有判断资源是否存在的函数,不过ResourceManager::resourceExists可以判断

ps:用tab怎么了?是为了兼容不同的编译器么?不太明白

0

主题

48

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2008-8-4 15:41:00 | 显示全部楼层

Re:Ogre引擎的几大失误

我实在没想通楼主到底在说什么时候的Ogre,至少"Ogre.dll库几乎囊括了渲染系统,读写系统,控制系统等等"相当火星
看plugins.cfg
# Defines plugins to load

# Define plugin folder
PluginFolder=.

# Define plugins
Plugin=RenderSystem_Direct3D9
Plugin=RenderSystem_GL
Plugin=Plugin_ParticleFX
Plugin=Plugin_CgProgramManager
Plugin=Plugin_PCZSceneManager
Plugin=Plugin_OctreeZone
除此以外,还用到了OIS,CEGUI等

我对楼主所读的Ogre感到疑惑...
引擎sln也是一个OgreMain加一系列plugin工程的集合

后面几点我也就不看了

1

主题

10

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2008-8-6 13:00:00 | 显示全部楼层

Re:Ogre引擎的几大失误

TAB和空格的使用主要是在不同的IDE环境下保持代码的整洁。比如VI,Editplus,UltraEdit,vs2005,可能这些文本编辑器中TAB的设置是不一样的。项目中成员有使用各种文本编辑器的爱好,所以这时,使用空格来代替TAB就有意义了。

4

主题

15

帖子

26

积分

注册会员

Rank: 2

积分
26
QQ
 楼主| 发表于 2008-8-7 11:56:00 | 显示全部楼层

Re:Ogre引擎的几大失误

回WJBeckie:
我不知道你为什么说这句话有问题,因为我并没有说完全如此。
至少Ogre的读去脚本的代码全在OgreMain.dll库里。
只是希望能将它们分离出来,并没有批评引擎的意思

4

主题

15

帖子

26

积分

注册会员

Rank: 2

积分
26
QQ
 楼主| 发表于 2008-8-7 12:02:00 | 显示全部楼层

Re:Ogre引擎的几大失误

回 查无此人:
虽然MeshSerialize可以单独初始化的class,但是假如你想做一个3DMax之类的插件
试问!
你需要初始化Ogre的SceneManager吗?
你需要初始化Ogre的相机吗?
你需要加载Ogre的资源吗?
显然不需要。
但是如果你不初始化这些
你能用MeshSerialize吗?
不能!

0

主题

48

帖子

58

积分

注册会员

Rank: 2

积分
58
发表于 2008-8-8 17:39:00 | 显示全部楼层

Re:Ogre引擎的几大失误

MeshSerialize明显是一个单独的模块,跟Ogre::SceneManager, Ogre::Camera完全无耦合,应该是可以单独用的...我想以设计著称的Ogre不会犯如此愚蠢的错误

至于脚本解释器未从OgreMain里面剥离,这个没问题,我想如果定义自己的脚本解释器,可以通过派生基类写插件的方式来实现(这里只是猜想,这部分代码没看过),类似的自定义资源包格式及加密等应用,都是采用这种方式实现.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-21 17:52

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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