在Android上使用Irrlicht的低帧速率

时间:2011-08-31 20:08:50

标签: android game-engine android-ndk irrlicht

我从http://gitorious.org/irrlichtandroid/编译了一个来自Irrlicht的Android端口,并创建了一个只加载一个lo res SkyBox的应用程序。但是,我得到了不可预测的帧速率。在模拟器上,fps永远不会超过5.在带有eclair的DELL XCD35上,它通常不会超过10 fps,但是,在大约10次启动中,应用程序以60 fps运行良好。 活动配置为全屏横向模式。

以下是代码,我省略了类头文件以保持帖子简短。

BlueStoneActivity.java

public class BlueStoneActivity extends Activity {
    static {
        System.loadLibrary("irrlicht");
        System.loadLibrary("bluestone");
    }

    GLSurfaceView glView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.requestWindowFeature(Window.FEATURE_NO_TITLE);
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
        glView=new GLSurfaceView(this);
        glView.setRenderer(new IrrlichtRenderer(this));
        setContentView(glView);
        Debug.startMethodTracing("bstone");
        nativeOnCreate();
    }

    @Override
    protected void onDestroy() {
        nativeOnDestroy();
        super.onDestroy();
        Debug.stopMethodTracing();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    public native void nativeOnCreate();
    public native void nativeOnDestroy();
    public native void nativeOnPause();
    public native void nativeOnResume();
    public native void nativeOnResize(int w, int h);
    public native void nativeDrawIteration();
}

IrrlichtRender.java

 public class IrrlichtRenderer implements Renderer {
        BlueStoneActivity activity;

        IrrlichtRenderer(BlueStoneActivity activity){
            this.activity=activity;
        }

        @Override
        public void onDrawFrame(GL10 arg0) {
            activity.nativeDrawIteration();
        }

        @Override
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            activity.nativeOnResize(width, height);
        }

        @Override
        public void onSurfaceCreated(GL10 arg0, EGLConfig arg1) {
        }
    }

JNI包装

    #include <jni.h>
#include <android/log.h>
#include "EngineManager.h"
#include "InputManager.h"

game::EngineManager *engine;

int importGLInit();
void importGLDeinit();

#ifndef _Included_com_devin_BlueStoneActivity
#define _Included_com_devin_BlueStoneActivity
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT void JNICALL Java_com_devin_BlueStoneActivity_nativeOnCreate
  (JNIEnv *, jobject){
    engine=new game::EngineManager();
}


JNIEXPORT void JNICALL Java_com_devin_BlueStoneActivity_nativeOnDestroy
  (JNIEnv *, jobject){
    engine->device->drop();
    importGLDeinit();
}

JNIEXPORT void JNICALL Java_com_devin_BlueStoneActivity_nativeOnResize
  (JNIEnv *env, jobject thiz, jint width, jint height){
    __android_log_print(ANDROID_LOG_INFO, "NDK", "ONRESIZE - [%d %d]", width, height);
    engine->mWidth=width;
    engine->mHeight=height;
    importGLInit();
    engine->glInit();
}


JNIEXPORT void JNICALL Java_com_devin_BlueStoneActivity_nativeDrawIteration
  (JNIEnv *, jobject){
    engine->drawIteration();
}


JNIEXPORT void JNICALL Java_com_devin_BlueStoneActivity_nativeOnPause
  (JNIEnv *, jobject){
}


JNIEXPORT void JNICALL Java_com_devin_BlueStoneActivity_nativeOnResume
  (JNIEnv *, jobject){

}


#ifdef __cplusplus
}
#endif
#endif

EngineManager.cpp

#include <irrlicht.h>
#include "EngineManager.h"

namespace game {

EngineManager::EngineManager() {
    input=new game::InputManager();
    app=new game::ApplicationManager(input);
}

EngineManager::~EngineManager() {
}

void EngineManager::glInit(){
    device=createDevice( video::EDT_OGLES1, core::dimension2d<u32>(mWidth, mHeight), 16, false, false, false, 0);
    driver=device->getVideoDriver();
    scenegraph=device->getSceneManager();
    guienv=device->getGUIEnvironment();

    app->initApp(device);
}

void EngineManager::drawIteration(){
    device->run();
    driver->beginScene(true, true, app->clearColor);

    app->drawIteration();

    scenegraph->drawAll();
    guienv->drawAll();
    driver->endScene();
}

} /* namespace game */

ApplicationManager.cpp

#include "ApplicationManager.h"
#include "InputManager.h"

namespace game {

ApplicationManager::ApplicationManager(InputManager *in) {
    this->input=in;
}

ApplicationManager::~ApplicationManager() {
}

void ApplicationManager::initApp(IrrlichtDevice *device){
    this->device=device;
    this->driver=device->getVideoDriver();
    this->scenegraph=device->getSceneManager();
    this->guienv=device->getGUIEnvironment();

    // Camera setup
    camera=scenegraph->addCameraSceneNode();
    camera->setPosition(core::vector3df(20.0f, 15.0f, 15.0f));
    camera->setTarget(core::vector3df(0.0f, 0.0f, 0.0f));

    // Sample objects
    bool sceneLoaded=scenegraph->loadScene("/sdcard/BlueStone/redsky.irr");
    if(sceneLoaded)
        __android_log_print(ANDROID_LOG_INFO, "NDK", "SceneLoaded");
    else
        __android_log_print(ANDROID_LOG_INFO, "NDK", "SceneLoaded false");

    clearColor=video::SColor(255, 20, 40, 40);
    statsText=L"START";
    text=guienv->addStaticText(statsText.c_str(), core::recti(50,50,50+100,50+60), true, true, 0, 18, false);
    text->setOverrideColor(video::SColor(255, 64, 20, 20));
}

void ApplicationManager::drawIteration(){
    statsText=L"FPS: ";
    statsText+=driver->getFPS();
    text->setText(statsText.c_str());
}

} /* namespace game */

请帮助!!

1 个答案:

答案 0 :(得分:5)

终于搞定了!!

似乎Android SDK有一个bug。当您尝试使用'android:screenOrientation =“landscape”'从AndroidManifest.xml将屏幕方向设置为横向时,您在GLSurfaceView上获得的帧速率较低。 使用

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE );

在代码中解决了所有问题。我的代码现在以60fps的速度运行。