Modified the running loop to avoid consumming 100% CPU in pause on Android.
This commit is contained in:
+132
-140
@@ -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[] =
|
||||||
|
|||||||
Reference in New Issue
Block a user