gpt4 book ai didi

android - Android 上 Irrlicht 的低帧率

转载 作者:搜寻专家 更新时间:2023-11-01 07:38:30 25 4
gpt4 key购买 nike

我已经从 http://gitorious.org/irrlichtandroid/ 编译了 Irrlicht 的 Android 端口并制作了一个应用程序来加载一个 lo res SkyBox。但是,我得到了不可预测的帧速率。在模拟器上,fps 永远不会超过 5。在我的带有 eclair 的 DELL XCD35 上,它通常不会超过 10 fps,但是,在 10 次启动中大约有 1 次,应用程序以 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

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 */

请帮忙!!

最佳答案

终于搞定了!!

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

this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE );

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

关于android - Android 上 Irrlicht 的低帧率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7262789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com