NiApplication是一个为Gamebryo引擎示例应用程序的独立设计的一个框架。它使应用程序
可以写一个平台上运行的Gamebryo引擎支持其他平台。 NiApplication处理如窗口创建,渲染,
输入系统等功能,我们可以通过它提供的接口分析它所提供的功能,下面是一些相关的接口,以
虚函数的方式提供。
部分虚函数:
virtual void Terminate();
virtual void UpdateInput();
virtual void OnIdle(void);
virtual void BeginFrame();
virtual void BeginUpdate();
virtual void UpdateFrame();
virtual void EndUpdate();
virtual void BeginCull();
virtual void CullFrame();
virtual void EndCull();
virtual void BeginRender();
virtual void RenderFrame();
virtual void EndRender();
virtual void RenderScreenItems();
virtual void RenderVisualTrackers();
virtual void EndFrame();
virtual void OnDisplayFrame();
virtual void DisplayFrame();
virtual void UpdateVisualTrackers();
virtual void UpdateMetrics();
virtual bool CreateScene();
virtual bool CreateCamera();
virtual bool CreateFrame();
virtual bool CreateRenderer();
virtual bool CreateInputSystem();
virtual bool CreateVisualTrackers();
virtual void ConfigureInputDevices();
virtual bool MeasureTime();
在下面贴出一些代码希望看的清楚一些
virtual bool Initialize();
//在程序初始化的时候调用,对渲染设备,输入设备,照相机,输入设备,游戏场景等进行初始
化,
bool NiApplication::Initialize()
{
if (m_bUseFrameSystem)
{
NiShadowManager::Initialize();
}
值得注意的是上面这三行代码,当我们不用FrameRendereringSystem时,阴影的初始化是要放
在渲染设备能之前初始化的,如果放在后面就会出现错误,在渲染阴影时提示你Nimaterial在绑
定RenderObject时失败,也就是创建阴影渲染材质失败,下面的几个函数就没什么说的了,肯定
会在派生类中重载这些东西的
if (!CreateRenderer())
return false;
if (!CreateCamera())
return false;
if (!CreateInputSystem())
return false;
if (!CreateScene())
{
return false;
}
if (m_spScene)
{
m_spScene->Update(0.0f);
m_spScene->UpdateProperties();
m_spScene->UpdateEffects();
}
if (m_spCamera)
{
m_spCamera->Update(0.0f);
}
if (m_spRenderer != NULL)
{
if (!CreateVisualTrackers())
return false;
}
return true;
}
//主循环
void NiApplication::MainLoop()
{
for( ; ; )
{
if (!Process())
break;
}
}
bool NiApplication::Process()
{
MSG kMsg;
if (PeekMessage(&kMsg, NULL, 0, 0, PM_REMOVE))
{
if (kMsg.message == WM_QUIT)
return false;
if (!TranslateAccelerator(NiApplication::ms_pkApplication->
GetAppWindow()->GetWindowReference(),
NiApplication::ms_pkApplication->GetAcceleratorReference(),
&kMsg))
{
TranslateMessage(&kMsg);
DispatchMessage(&kMsg);
}
}
else
{
NiApplication::ms_pkApplication->OnIdle();
}
return true;
}
virtual void OnIdle(void);
函数实现如下:
void NiApplication::OnIdle(void)
{
if (!MeasureTime())
return;
ResetFrameTimings();
BeginUpdate();
UpdateFrame();
EndUpdate();
if (m_bUseFrameSystem || m_spRenderer != NULL)
{
BeginFrame();
RenderFrame();
EndFrame();
DisplayFrame();
UpdateVisualTrackers();
}
UpdateMetrics();
m_iClicks++;
if ((m_fAccumTime >= m_fAppEndTime) && (m_fAppEndTime != NI_INFINITY))
{
QuitApplication();
}
}
下面是渲染函数
//---------------------------------------------------------------------------
void NiApplication::RenderFrame()
{
if (m_bUseFrameSystem) //在此添加了一个选择支,也就是2.2之后版本添加的帧渲染系统,
一直到目前的2.6这两个渲染模式一直并
{ //存,但他的扩展是基于FrameSystem上,以至于文档上说他们
的阴影系统是基于
//FrameRenderSystem的,说是这么说在非帧渲染中还上可以实
现阴影系统的
if (m_spAccumulatorProcessor)
{
m_spAccumulatorProcessor->SetAccumulator(
m_spRenderer->GetSorter());
}
if (m_spCamera)
{
if (NiShadowManager::GetShadowManager())
{
NiShadowManager::SetSceneCamera(m_spCamera);
}
if (m_spMainRenderView)
{
m_spMainRenderView->SetCamera(m_spCamera);
}
}
m_spFrame->Draw();
m_spFrame->GatherStatistics(m_uiNumObjectsDrawn, m_fCullTime,
m_fRenderTime);
}
else
{
m_spRenderer->BeginUsingDefaultRenderTargetGroup(
NiRenderer::CLEAR_ALL);
CullFrame();
BeginRender();
NiDrawVisibleArray(m_spCamera, m_kVisible);
RenderScreenItems(); //通过函数名字很容易猜出他的功能,但在我们做游戏的
时候,在渲染UI之前
EndRender(); //要加上一个函数SetScreenSpaceCameraData();这一
步很关键
RenderVisualTrackers();
m_spRenderer->EndUsingRenderTargetGroup();
}
}
virtual void Terminate();//这个函数是在程序退出循环时做一些收尾工作,释放一下资源,内存
之类的工作