为了账号安全,请及时绑定邮箱和手机立即绑定

请帮忙指出问题所在,并在不对框架做过分改变的前提下修改代码解决:

请帮忙指出问题所在,并在不对框架做过分改变的前提下修改代码解决:

波斯汪 2023-01-07 21:13:03

是我自己编写的一个Ogre基本框架,编译运行是一个黑色窗口,但是关闭黑色窗口后任务管理器中仍然有这个程序的进程在,只能强行结束,我试过很多方法,运用windows循环、rengderOneFrame什么的,研究了一天一夜也没能解决,无论如何窗口关闭后进程就是死赖在内存了释放不了,

#include <Ogre.h>
#include <windows.h>

//使用Ogre的命名空间以识别Ogre提供的类
using namespace Ogre;

//根据帧监听父类派生出自己的帧监听子类并自定义帧监听中所要达到的功能
class MyFrameListener : public FrameListener{
public:
bool frameStarted (const FrameEvent &evt);
bool frameEnded (const FrameEvent &evt );
};

bool MyFrameListener::frameStarted (const FrameEvent &evt){
//在每一帧画面渲染前,调用这里你写好的代码

return true;
}

bool MyFrameListener::frameEnded (const FrameEvent &evt ){
//在每一帧画面渲染后,调用这里你写好的代码

return true;
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow )
{

//创建root类得对象,参数为默认参数
Root* root = new Root("plugins_d.cfg", "ogre.cfg", "Ogre.log");
if(!root -> restoreConfig())
root -> showConfigDialog();

//初始化渲染窗口
root -> initialise(true, "乱雨红尘渡");
RenderWindow* window = root -> getAutoCreatedWindow();

SceneManager* sceneMgr = root -> createSceneManager(ST_GENERIC, "MySceneManager");
Camera* camera = sceneMgr -> createCamera("MainCamera");
camera -> setNearClipDistance(5);
camera -> setFarClipDistance(1000);
camera -> setAspectRatio(Real(1.333333)); //设置屏幕纵横比为4:3

//创建视口
Viewport* vp = window -> addViewport(camera);
vp -> setBackgroundColour(ColourValue(0, 0, 0));

//设置渲染循环(Render Loop)
MyFrameListener* myListener = new MyFrameListener();

//在这里你需要在调用startRendering()方法前,注册你的帧监听对象!!!
root -> addFrameListener(myListener);
//root -> startRendering();
//用更灵活的Root::renderOneFrame()方法使Ogre渲染循环与windows消息循环融合,控制循环始终

bool keepRendering = true;

//在这里填入所有这个章节之前提到的设置过程:
//载入插件,创建渲染窗口和场景管理器以及摄像机和视口,
//然后再场景中填入你希望的内容。

while(keepRendering)
{
//在这里处理引擎使用的网络消息。

//在这里处理引擎使用的输入消息。

//根据消息更新场景管理状态。

//根据新的场景管理状态,渲染下一帧。
root->renderOneFrame();

//检查是否需要退出渲染循环

if ()
{
keepRendering = false;
}
}

//在这里进行你需要的清理工作
//然后,关闭Ogre

delete root;

}

查看完整描述

2 回答

?
互换的青春

TA贡献1547条经验 获得超6个赞

同感!浪费了不少时间


bool frameStarted(const Ogre::FrameEvent& evt)      {            if (Ogre::Root::getSingletonPtr()->getAutoCreatedWindow()->isClosed()) return false// 若渲染窗口已关闭则退出渲染循环            return true;      }

可以解决这个问题。

网上几乎全部的教程都没有提到这个重要的问题,说什么点击关闭就会退出,是不对的


查看完整回答
反对 回复 2023-01-10
?
30秒到达战场

TA贡献1549条经验 获得超6个赞

winMain函数没返回值

class MyFrameListener: public FrameListener, public WindowEventListener 或者MyFrameListener直接公有继承ExampleFrameListener

查看完整回答
反对 回复 2023-01-10

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信