Modified the running loop to avoid consumming 100% CPU in pause on Android.

This commit is contained in:
Xawotihs
2011-09-06 14:03:27 +00:00
parent 95d6fa297a
commit 98709e661e
+132 -140
View File
@@ -86,193 +86,185 @@ extern "C" void Java_org_libsdl_app_SDLActivity_nativeResume(
class SdlApp class SdlApp
{ {
public: /* For easy interfacing with JGE static functions */ public: /* For easy interfacing with JGE static functions */
bool Running; bool Running;
SDL_Window* window; SDL_Window* window;
SDL_Surface* Surf_Display; SDL_Surface* Surf_Display;
SDL_Rect viewPort; SDL_Rect viewPort;
Uint32 lastMouseUpTime; Uint32 lastMouseUpTime;
Uint32 lastFingerDownTime; Uint32 lastFingerDownTime;
int windowed_w; int windowed_w;
int windowed_h; int windowed_h;
int windowed_pos_x; int windowed_pos_x;
int windowed_pos_y; int windowed_pos_y;
int mMouseDownX; int mMouseDownX;
int mMouseDownY; int mMouseDownY;
public: public:
SdlApp() : Surf_Display(NULL), window(NULL), lastMouseUpTime(0), lastFingerDownTime(0), Running(true), mMouseDownX(0), mMouseDownY(0) SdlApp() : Surf_Display(NULL), window(NULL), lastMouseUpTime(0), lastFingerDownTime(0), Running(true), mMouseDownX(0), mMouseDownY(0)
{ {
} }
int OnExecute() int OnExecute()
{ {
if (OnInit() == false) if (OnInit() == false)
{ {
return -1; return -1;
} }
SDL_Event Event; SDL_Event Event;
while(Running) while(Running)
{ {
if (g_engine && !g_engine->IsPaused()) if (g_engine)
{ {
while(SDL_WaitEventTimeout(&Event, 0)) while(SDL_WaitEventTimeout(&Event, 10))
{ {
OnEvent(&Event); if(!g_engine->IsPaused())
} OnEvent(&Event);
OnUpdate(); }
} if(!g_engine->IsPaused())
} OnUpdate();
}
}
OnCleanup(); OnCleanup();
return 0; return 0;
}; };
public: public:
bool OnInit(); bool OnInit();
void OnResize(int width, int height) void OnResize(int width, int height)
{ {
DebugTrace("OnResize Width " << width << " height " << height); DebugTrace("OnResize Width " << width << " height " << height);
if ((GLfloat)width / (GLfloat)height <= ACTUAL_RATIO) if ((GLfloat)width / (GLfloat)height <= ACTUAL_RATIO)
{ {
viewPort.x = 0; viewPort.x = 0;
viewPort.y = -(static_cast<int>(width / ACTUAL_RATIO) - height) / 2; viewPort.y = -(static_cast<int>(width / ACTUAL_RATIO) - height) / 2;
viewPort.w = width; viewPort.w = width;
viewPort.h = static_cast<int>(width / ACTUAL_RATIO); viewPort.h = static_cast<int>(width / ACTUAL_RATIO);
} }
else else
{ {
viewPort.x = -(static_cast<int>(height * ACTUAL_RATIO) - width) / 2; viewPort.x = -(static_cast<int>(height * ACTUAL_RATIO) - width) / 2;
viewPort.y = 0; viewPort.y = 0;
viewPort.w = static_cast<int>(height * ACTUAL_RATIO); viewPort.w = static_cast<int>(height * ACTUAL_RATIO);
viewPort.h = height; viewPort.h = height;
} }
glViewport(viewPort.x, viewPort.y, viewPort.w, viewPort.h); glViewport(viewPort.x, viewPort.y, viewPort.w, viewPort.h);
JRenderer::GetInstance()->SetActualWidth(static_cast<float>(viewPort.w)); JRenderer::GetInstance()->SetActualWidth(static_cast<float>(viewPort.w));
JRenderer::GetInstance()->SetActualHeight(static_cast<float>(viewPort.h)); JRenderer::GetInstance()->SetActualHeight(static_cast<float>(viewPort.h));
glScissor(0, 0, width, height); glScissor(0, 0, width, height);
#if (!defined GL_ES_VERSION_2_0) && (!defined GL_VERSION_2_0) #if (!defined GL_ES_VERSION_2_0) && (!defined GL_VERSION_2_0)
glMatrixMode (GL_PROJECTION); // Select The Projection Matrix glMatrixMode (GL_PROJECTION); // Select The Projection Matrix
glLoadIdentity (); // Reset The Projection Matrix glLoadIdentity (); // Reset The Projection Matrix
#if (defined GL_VERSION_ES_CM_1_1) #if (defined GL_VERSION_ES_CM_1_1)
glOrthof(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f, -1.0f, 1.0f); glOrthof(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f, -1.0f, 1.0f);
#else #else
gluOrtho2D(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f); gluOrtho2D(0.0f, (float) (viewPort.w)-1.0f, 0.0f, (float) (viewPort.h)-1.0f);
#endif #endif
glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix
glLoadIdentity (); // Reset The Modelview Matrix glLoadIdentity (); // Reset The Modelview Matrix
glDisable (GL_DEPTH_TEST);
glDisable (GL_DEPTH_TEST);
#endif #endif
} }
void OnKeyPressed(const SDL_KeyboardEvent& event); void OnKeyPressed(const SDL_KeyboardEvent& event);
void OnMouseDoubleClicked(const SDL_MouseButtonEvent& event); void OnMouseDoubleClicked(const SDL_MouseButtonEvent& event);
void OnMouseClicked(const SDL_MouseButtonEvent& event); void OnMouseClicked(const SDL_MouseButtonEvent& event);
void OnMouseMoved(const SDL_MouseMotionEvent& event); void OnMouseMoved(const SDL_MouseMotionEvent& event);
void OnMouseWheel(int x, int y); void OnMouseWheel(int x, int y);
void OnTouchEvent(const SDL_TouchFingerEvent& event); void OnTouchEvent(const SDL_TouchFingerEvent& event);
void OnEvent(SDL_Event* Event) void OnEvent(SDL_Event* Event)
{ {
/* if(Event->type < SDL_USEREVENT) /* if(Event->type < SDL_USEREVENT)
DebugTrace("Event received" << Event->type);*/ DebugTrace("Event received" << Event->type);*/
switch(Event->type) switch(Event->type)
{ {
case SDL_QUIT: case SDL_QUIT:
Running = false; Running = false;
break; break;
/* On Android, this is triggered when the device orientation changed */ /* On Android, this is triggered when the device orientation changed */
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
window = SDL_GetWindowFromID(Event->window.windowID); window = SDL_GetWindowFromID(Event->window.windowID);
int h,w; int h,w;
SDL_GetWindowSize(window, &w, &h); SDL_GetWindowSize(window, &w, &h);
OnResize(w, h); OnResize(w, h);
break; break;
case SDL_KEYDOWN: case SDL_KEYDOWN:
case SDL_KEYUP: case SDL_KEYUP:
OnKeyPressed(Event->key); OnKeyPressed(Event->key);
break; break;
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
OnMouseMoved(Event->motion); OnMouseMoved(Event->motion);
break; break;
case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONDOWN:
OnMouseClicked(Event->button); OnMouseClicked(Event->button);
break; break;
case SDL_MOUSEBUTTONUP: case SDL_MOUSEBUTTONUP:
{ {
Uint32 eventTime = SDL_GetTicks(); Uint32 eventTime = SDL_GetTicks();
if (eventTime - lastMouseUpTime <= 500) if (eventTime - lastMouseUpTime <= 500)
{ {
OnMouseDoubleClicked(Event->button); OnMouseDoubleClicked(Event->button);
} }
else else
{ {
OnMouseClicked(Event->button); OnMouseClicked(Event->button);
} }
lastMouseUpTime = eventTime; lastMouseUpTime = eventTime;
} }
break;
break; case SDL_MOUSEWHEEL:
OnMouseWheel(Event->wheel.x, Event->wheel.y);
break;
case SDL_MOUSEWHEEL: case SDL_FINGERMOTION:
OnMouseWheel(Event->wheel.x, Event->wheel.y);
break;
case SDL_FINGERMOTION:
case SDL_FINGERDOWN: case SDL_FINGERDOWN:
case SDL_FINGERUP: case SDL_FINGERUP:
//DebugTrace("Touch Event triggered"); OnTouchEvent(Event->tfinger);
//DebugTrace("touchId " << Event->tfinger.touchId); break;
//DebugTrace("fingerId " << Event->tfinger.fingerId);
//DebugTrace("state " << Event->tfinger.state);
//DebugTrace("x " << Event->tfinger.x << ", y " << Event->tfinger.y);
//DebugTrace("dx " << Event->tfinger.dx << ", dy " << Event->tfinger.dy);
//DebugTrace("pressure " << Event->tfinger.pressure);
OnTouchEvent(Event->tfinger); case SDL_MULTIGESTURE:
break; DebugTrace("Multigesture : touchId " << Event->mgesture.touchId
<< ", x " << Event->mgesture.x
case SDL_MULTIGESTURE: << ", y " << Event->mgesture.y
DebugTrace("Multigesture : touchId " << Event->mgesture.touchId << ", dTheta " << Event->mgesture.dTheta
<< ", x " << Event->mgesture.x << ", dDist " << Event->mgesture.dDist
<< ", y " << Event->mgesture.y << ", numFingers " << Event->mgesture.numFingers);
<< ", dTheta " << Event->mgesture.dTheta break;
<< ", dDist " << Event->mgesture.dDist
<< ", numFingers " << Event->mgesture.numFingers);
break;
case SDL_JOYBALLMOTION: case SDL_JOYBALLMOTION:
DebugTrace("Flick gesture detected, x: " << Event->jball.xrel << ", y: " << Event->jball.yrel); DebugTrace("Flick gesture detected, x: " << Event->jball.xrel << ", y: " << Event->jball.yrel);
g_engine->Scroll(Event->jball.xrel, Event->jball.yrel); g_engine->Scroll(Event->jball.xrel, Event->jball.yrel);
break; break;
} }
} }
void OnUpdate(); void OnUpdate();
void OnCleanup() void OnCleanup()
{ {
SDL_FreeSurface(Surf_Display); SDL_FreeSurface(Surf_Display);
SDL_Quit(); SDL_Quit();
} }
}; };
static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] = static const struct { LocalKeySym keysym; JButton keycode; } gDefaultBindings[] =