grabon Temat założony przez niniejszego użytkownika |
Irrlicht+Irrklang gra wyłącza się » 2008-10-01 23:39:55 Tak jak w temacie, po kilkunastu sekundach wyłącza mi się gra. Nie bardzo wiem gdzie popełniłem błąd może znajdzie się ktoś mądrzejszy i mi pomoże. Dodam jeszcze że wszystko gra tak jak chciałem, tyle że, po jakimś czasie sama się wyłącza :-/ Oto kod: #include <irrKlang.h> #include <irrlicht.h> #include <iostream> using namespace irrklang; using namespace irr; using namespace core; using namespace scene; using namespace video; using namespace io; using namespace gui; #ifdef _MSC_VER #pragma comment(lib, "Irrlicht.lib") #endif class MyEventReceiver : public IEventReceiver { public: virtual bool OnEvent( const SEvent & event ) { if( event.EventType == irr::EET_KEY_INPUT_EVENT ) KeyIsDown[ event.KeyInput.Key ] = event.KeyInput.PressedDown; return false; } virtual bool IsKeyDown( EKEY_CODE keyCode ) const { return KeyIsDown[ keyCode ]; } MyEventReceiver() { for( u32 i = 0; i < KEY_KEY_CODES_COUNT; ++i ) KeyIsDown[ i ] = false; } private: bool KeyIsDown[ KEY_KEY_CODES_COUNT ]; };
int main() { video::E_DRIVER_TYPE driverType; MyEventReceiver receiver; IrrlichtDevice * device = createDevice( EDT_OPENGL, core::dimension2d < s32 >( 800, 600 ), 32, false, false, false, & receiver ); if( device == 0 ) return 1; device->setWindowCaption( L"cube_mahjong" ); video::IVideoDriver * driver = device->getVideoDriver(); scene::ISceneManager * smgr = device->getSceneManager(); gui::IGUIEnvironment * env = device->getGUIEnvironment(); driver->setTextureCreationFlag( video::ETCF_ALWAYS_32_BIT, true ); env->addImage( driver->getTexture( "media/img/logoMAH.png" ), core::position2d < s32 >( 10, 10 ) ); scene::ICameraSceneNode * cam = smgr->addCameraSceneNodeFPS( 0, 100.0f, 60.0f ); device->getCursorControl()->setVisible( true ); cam->setPosition( core::vector3df( 0, 0, - 40 ) ); smgr->loadScene( "media/muz.irr" ); scene::IAnimatedMeshSceneNode * pok = smgr->addAnimatedMeshSceneNode( smgr->getMesh( "media/mesh/komnata0.x" ) ); pok->setPosition( core::vector3df( 30, 0, 0 ) ); int lastFPS = - 1; while( device->run() ) { { ISoundEngine * engine = createIrrKlangDevice(); if( receiver.IsKeyDown( irr::KEY_KEY_P ) ) { engine->play2D( "media/sounds/bell.wav", false ); } } pok->setRotation( core::vector3df( 0, 0, 10 ) ); if( receiver.IsKeyDown( irr::KEY_KEY_W ) ) { core::vector3df v = cam->getPosition(); v.Z += 0.02f; cam->setPosition( v ); } else if( receiver.IsKeyDown( irr::KEY_KEY_S ) ) { core::vector3df v = cam->getPosition(); v.Z -= 0.02f; cam->setPosition( v ); } if( receiver.IsKeyDown( irr::KEY_ESCAPE ) ) { return 0; } driver->beginScene( true, true, video::SColor( 255, 113, 113, 133 ) ); smgr->drawAll(); device->getGUIEnvironment()->drawAll(); driver->endScene(); int fps = driver->getFPS(); if( lastFPS != fps ) { core::stringw tmp( L"Cube Mahjong" ); tmp += driver->getName(); tmp += L" fps: "; tmp += fps; device->setWindowCaption( tmp.c_str() ); lastFPS = fps; } } device->drop(); return 0; }
|
|
DejaVu |
» 2008-10-01 23:50:24 Hm... proponuję w takim wypadku uruchomić aplikację, wcisnąć ALT+CTRL+DEL i zobaczyć ile pamięci wciąga Ci twoja aplikacja (zarówno wirtualnej jak i fizycznej). Prawdopodobnie kończy Ci się RAM i aplikacja jest ubijana (ale to tylko postawiona hipoteza, którą powinieneś potwierdzić lub obalić).
Aby zobaczyć ile pamięci wirtualnej wciąga Ci aplikacja musisz dodać sobie taką pozycję na liście procesów. Aby to zrobić musisz w Menedżerze zadań Windows wejść w menu Widok, a następnie kliknąć Wybierz kolumny.... Jeśli ilość zarezerwowanej pamięci się nie zwiększa, to trzeba będzie szukać innej przyczyny zamykania się aplikacji. |
|
grabon Temat założony przez niniejszego użytkownika |
» 2008-10-02 00:05:18 No właśnie użycie pamięci 138 440 ale nie wiem dlaczego ? Zaczyna się od zera i cały czas rośnie CPU = 48 Oczywiście te dane są kiedy gra wyłącza się. w konsoli gry cały czas wczytuje się Using DirectSound8 driver i IrrKlang 3D sound Engine 1.1.0 Tak jakby doczytywało cały czas IrrKlang Dodam że, przed użyciem IrrKlang'u nie było żadnych problemów. |
|
DejaVu |
» 2008-10-02 00:12:51 Przypuszczam, że odpowiedź jest w tej linijce: ISoundEngine * engine = createIrrKlangDevice(); Nie wiem jak ona działa, ale przypuszczam, że tworzy ona obiekt, który później powinno sie usunąć. Ty wewnątrz pętli while() nieustannie tworzysz nowy silnik do obsługi dźwieku i nie usuwasz przy tym starego, co w konsekwencji powoduje wycieki pamięci i program się zamyka gdy pamięć się skończy. |
|
grabon Temat założony przez niniejszego użytkownika |
» 2008-10-02 00:26:31 Też tak myślę, zamknięcie to: engine->drop(); i nie wiem gdzie dodać tą komendę by naprawić błąd. Ja też nie znam się na IrrKlang, dzisiaj zacząłem, próbowałem użyć sdl_mixer ale jakoś nie mogłem tego ogarnąć z irrlichtem EDIT: Chyba rozwiązałem problem ;-) int main() { ISoundEngine * engine = createIrrKlangDevice(); video::E_DRIVER_TYPE driverType; MyEventReceiver receiver;
Dałeś mi do myślenia że, dałem w pętli while() Teraz mam FPS ponad 2800 a, tak miałem około 60 ;-) Przez cały czas wymuszałem doczytywanie DirectSound i IrrKlang. |
|
« 1 » |