‘游戏引擎’ 分类的存档

[转自]http://www.cnitblog.com/linghuye/archive/2009/11/29/62870.html
要带着引擎系统的问题去阅读,不要被具体引擎的思路牵着走,要思考这个引擎如何实现或避开这些问题.
首先,最重要的必须,在Debug模式下调试起来一个主场景程序,然后沿着代码流走几遍,在代码里闲逛,生成第一印象,留意基础工具设施类(如字符串内存管理),大约3小时.
然后带着如下每一个问题(不分先后)去流程,走逻辑,弄清他的业务处理方法.
1.纹理资源是如何管理的?句柄,ID,指针? 模型顶点资源是如何管理的? 渲染实例数据如何管理? 纯3D资源如Shader是如何管理?
2.场景管理是怎样搭建的,如何区分实例节点数据和资源数据?镜头是如何被各模块访问的?剔除不可见物件的代码行在哪里?兼容各种算法吗,使用了具体的算法是什么?场景管理模块是否提供清晰的功能定义接口?
3.骨骼动画是在哪里计算的,具体到顶点乘以矩阵是在哪个cpp的哪个代码行里?Socket实现在哪里?如果有高级动画系统,骨架在哪里,有什么功能?动作融合的矩阵间过渡代码在哪一行?
4.异步数据加载是怎样做的,在哪个cpp里,由哪个模块管理?各个资源的加载读取cpp在哪里?
5.SetStreamSource,SetIndices,DrawIndexedPrimitive调用是在哪里,整个工程有几个DrawIndexedPrimitve,DrawPrimitveUp,DrawXXX.
6.渲染管线如何为ShadowMap提供深度图,如何为CubeMap,水面反射提供场景RenderTarget?如何管理固定流水线状态RasterState的?
7.材质管理系统是如何运作的,如何并入管线的,如何从理论上保证实现各式各样的效果的,如何兼容固定和可编程流水线的?管线里是否有后期效果,还是用材质表达出来?
8.特效如粒子系统到最后是使用哪个DrawXXX画出来的,粒子系统是动态公式计算还是帧动画?
9.界面2D Texture Draw是如何被支持的?文字渲染是如何被支持的,字体资源如何被管理?是否使用Freetype?

2009年12月1日19:50 | 没有评论

 
一、第三代“沙盒”(Sandbox)
2001年引入的这个“沙盒”是全球首款“所见即所玩”(WYSIWYP)游戏编辑器,现已发展到第三代,WYSIWYP功能将提升到一个全新层次,并扩展到了PS3和X360平台上,允许实时创作跨平台游戏,另外工具包内的创作工具和开发效率也都得到了全面增强。
最棒的是,开发人员不仅可以在PC上即时预览跨平台游戏,而且一旦在PC的沙盒上对原始艺术资源内容进行更改,CryENGINE 3就会立即自动对其进行转换、压缩和优化,并更新所有支持平台的输出结果,开发人员也能立刻看到光影、材料、模型的改变效果。

2009年10月27日15:56 | 没有评论
分类: 游戏引擎
标签:

OIS默认鼠标占用模式是鼠标独占使用,表现为鼠标指针无法移除当前窗口。那么如果想把鼠标指针移除窗体怎么解决呢?让OIS使用鼠标协作模式啊!代码如下:

//创建设备
OIS::ParamList pl;
size_t windowHnd = 0;
std::ostringstream windowHndStr;
m_Window->getCustomAttribute(Ogre::String("WINDOW"), &windowHnd);
windowHndStr << windowHnd;
pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND")));
pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));
m_InputManager = OIS::InputManager::createInputSystem( pl );

这下好了,鼠标可以移除当前窗体了,突然发现没对,怎么有两个鼠标指针?好嘛,我就在当前窗口隐藏掉系统的指针!代码如下:
ShowCursor(0); //隐藏系统鼠标指针
在mouse::MouseMoved 事件中把Moved(e.state.X.rel, e.state.Y.rel) 替换成Postion(e.state.X.abs, e.state.Y.abs)
下面if语句判断鼠标是否在视口内

if(arg.state.X.absgetViewport(0)->getActualLeft()+2
||(arg.state.Y.absgetViewport(0)->getActualTop()+0.5)
||(arg.state.X.abs>(mWindow->getViewport(0)->getActualLeft()+mWindow->getViewport(0)->getActualWidth()-2))
||(arg.state.Y.abs>(mWindow->getViewport(0)->getActualTop()+mWindow->getViewport(0)->getActualHeight()-2)))
{
 
CEGUI::MouseCursor::getSingleton().hide();
}
else
{
CEGUI::MouseCursor::getSingleton().show();
ShowCursor(0);
}
 
CEGUI::System::getSingleton().injectMousePosition(arg.state.X.abs, arg.state.Y.abs);
 
//……
}

2009年9月11日14:00 | 1 条评论

我们看ogre的例子或者自己写demo的时候总是弹出ogre的配置窗口:

如何去掉这个烦人的窗口呢?我们先来看代码:
在application.cpp中有这样一段代码

    if(mRoot->showConfigDialog())
 
    {
 
        mWindow = mRoot->initialise(true);
 
        return true;
 
    }
 
    else
 
    {
 
        return false;
 
    }

正是Showconfigdialog的原因,我们修改为restoreConfig,然后把ogre.cfg修改为
Render System=Direct3D9 Rendering Subsystem
[Direct3D9 Rendering Subsystem]
Allow NVPerfHUD=No
Anti aliasing=None
Floating-point mode=Fastest
Full Screen=No
VSync=No
Video Mode=800 x 600 @ 32-bit colour
sRGB Gamma Conversion=No
然后再运行时我们就发现那个烦人的配置窗口不见了.简单吧…

2009年8月9日18:16 | 没有评论