2

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

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

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

引擎管理器.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 */

应用程序管理器.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 */

请帮忙 !!

4

1 回答 1

5

终于明白了!!

看来Android SDK有一个错误。当您尝试使用 'android:screenOrientation="landscape"' 从 AndroidManifest.xml 将屏幕方向设置为横向时,您会在 GLSurfaceView 上获得低帧率。使用

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE );

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

于 2011-09-12T16:46:56.190 回答