mirror of https://github.com/axmolengine/axmol.git
Try fix fps
This commit is contained in:
parent
1d74df858b
commit
5f02d2a656
|
@ -27,6 +27,7 @@ THE SOFTWARE.
|
|||
#include <unistd.h>
|
||||
#include <sys/time.h>
|
||||
#include <string>
|
||||
#include <thread>
|
||||
#include "base/CCDirector.h"
|
||||
#include "base/ccUtils.h"
|
||||
#include "platform/CCFileUtils.h"
|
||||
|
@ -36,17 +37,7 @@ NS_CC_BEGIN
|
|||
// sharedApplication pointer
|
||||
Application* Application::sm_pSharedApplication = nullptr;
|
||||
|
||||
static int32_t getCurrentMillSecond()
|
||||
{
|
||||
int32_t lLastTime;
|
||||
struct timeval stCurrentTime;
|
||||
|
||||
gettimeofday(&stCurrentTime, NULL);
|
||||
lLastTime = stCurrentTime.tv_sec * 1000 + stCurrentTime.tv_usec * 0.001; // milliseconds
|
||||
return lLastTime;
|
||||
}
|
||||
|
||||
Application::Application() : _animationInterval(1.0f / 60.0f * 1000.0f)
|
||||
Application::Application() : _animationInterval(16666667)
|
||||
{
|
||||
CC_ASSERT(!sm_pSharedApplication);
|
||||
sm_pSharedApplication = this;
|
||||
|
@ -67,8 +58,7 @@ int Application::run()
|
|||
return 0;
|
||||
}
|
||||
|
||||
int32_t lastTime = 0L;
|
||||
int32_t curTime = 0L;
|
||||
std::chrono::steady_clock::time_point lastTime{};
|
||||
|
||||
auto director = Director::getInstance();
|
||||
auto glview = director->getOpenGLView();
|
||||
|
@ -78,15 +68,20 @@ int Application::run()
|
|||
|
||||
while (!glview->windowShouldClose())
|
||||
{
|
||||
lastTime = getCurrentMillSecond();
|
||||
lastTime = std::chrono::steady_clock::now();
|
||||
|
||||
director->mainLoop();
|
||||
glview->pollEvents();
|
||||
|
||||
curTime = getCurrentMillSecond();
|
||||
if (curTime - lastTime < _animationInterval)
|
||||
auto interval = std::chrono::steady_clock::now() - lastTime;
|
||||
if (interval < _animationInterval)
|
||||
{
|
||||
usleep((_animationInterval - curTime + lastTime) * 1000);
|
||||
auto waitDuration = _animationInterval - interval;
|
||||
std::this_thread::sleep_for(waitDuration);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::this_thread::yield();
|
||||
}
|
||||
}
|
||||
/* Only work on Desktop
|
||||
|
@ -107,7 +102,8 @@ int Application::run()
|
|||
void Application::setAnimationInterval(float interval)
|
||||
{
|
||||
// TODO do something else
|
||||
_animationInterval = interval * 1000.0f;
|
||||
_animationInterval =
|
||||
std::chrono::nanoseconds{static_cast<std::chrono::nanoseconds::rep>(std::nano::den * interval)};
|
||||
}
|
||||
|
||||
void Application::setResourceRootPath(std::string_view rootResDir)
|
||||
|
|
|
@ -28,6 +28,7 @@ THE SOFTWARE.
|
|||
#include "platform/CCCommon.h"
|
||||
#include "platform/CCApplicationProtocol.h"
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
|
||||
NS_CC_BEGIN
|
||||
class Rect;
|
||||
|
@ -104,7 +105,7 @@ public:
|
|||
virtual Platform getTargetPlatform() override;
|
||||
|
||||
protected:
|
||||
int32_t _animationInterval; // micro second
|
||||
std::chrono::nanoseconds _animationInterval; // nano seconds
|
||||
std::string _resourceRootPath;
|
||||
|
||||
static Application* sm_pSharedApplication;
|
||||
|
|
|
@ -28,6 +28,7 @@ THE SOFTWARE.
|
|||
#include "platform/CCCommon.h"
|
||||
#include "platform/CCApplicationProtocol.h"
|
||||
#include <string>
|
||||
#include <chrono>
|
||||
|
||||
NS_CC_BEGIN
|
||||
|
||||
|
@ -99,7 +100,7 @@ public:
|
|||
protected:
|
||||
static Application* sm_pSharedApplication;
|
||||
|
||||
int32_t _animationInterval; // micro second
|
||||
std::chrono::nanoseconds _animationInterval; // nano second
|
||||
std::string _resourceRootPath;
|
||||
std::string _startupScriptFilename;
|
||||
};
|
||||
|
|
|
@ -26,6 +26,7 @@ THE SOFTWARE.
|
|||
#import <Cocoa/Cocoa.h>
|
||||
#import <Metal/Metal.h>
|
||||
#include <algorithm>
|
||||
#include <thread>
|
||||
|
||||
#include "platform/CCApplication.h"
|
||||
#include "platform/CCFileUtils.h"
|
||||
|
@ -36,19 +37,9 @@ THE SOFTWARE.
|
|||
|
||||
NS_CC_BEGIN
|
||||
|
||||
static int32_t getCurrentMillSecond()
|
||||
{
|
||||
int32_t lLastTime = 0;
|
||||
struct timeval stCurrentTime;
|
||||
|
||||
gettimeofday(&stCurrentTime, NULL);
|
||||
lLastTime = stCurrentTime.tv_sec * 1000 + stCurrentTime.tv_usec * 0.001; // milliseconds
|
||||
return lLastTime;
|
||||
}
|
||||
|
||||
Application* Application::sm_pSharedApplication = nullptr;
|
||||
|
||||
Application::Application() : _animationInterval(1.0f / 60.0f * 1000.0f)
|
||||
Application::Application() : _animationInterval(16666667)
|
||||
{
|
||||
CCASSERT(!sm_pSharedApplication, "sm_pSharedApplication already exist");
|
||||
sm_pSharedApplication = this;
|
||||
|
@ -68,8 +59,7 @@ int Application::run()
|
|||
return 1;
|
||||
}
|
||||
|
||||
int32_t lastTime = 0L;
|
||||
int32_t curTime = 0L;
|
||||
std::chrono::steady_clock::time_point lastTime{};
|
||||
|
||||
auto director = Director::getInstance();
|
||||
auto glview = director->getOpenGLView();
|
||||
|
@ -79,15 +69,20 @@ int Application::run()
|
|||
|
||||
while (!glview->windowShouldClose())
|
||||
{
|
||||
lastTime = getCurrentMillSecond();
|
||||
lastTime = std::chrono::steady_clock::now();
|
||||
|
||||
director->mainLoop();
|
||||
glview->pollEvents();
|
||||
|
||||
curTime = getCurrentMillSecond();
|
||||
if (curTime - lastTime < _animationInterval)
|
||||
auto interval = std::chrono::steady_clock::now() - lastTime;
|
||||
if (interval < _animationInterval)
|
||||
{
|
||||
usleep(static_cast<useconds_t>((_animationInterval - curTime + lastTime) * 1000));
|
||||
auto waitDuration = _animationInterval - interval;
|
||||
std::this_thread::sleep_for(waitDuration);
|
||||
}
|
||||
else
|
||||
{
|
||||
std::this_thread::yield();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -109,7 +104,8 @@ int Application::run()
|
|||
|
||||
void Application::setAnimationInterval(float interval)
|
||||
{
|
||||
_animationInterval = interval * 1000.0f;
|
||||
_animationInterval =
|
||||
std::chrono::nanoseconds{static_cast<std::chrono::nanoseconds::rep>(std::nano::den * interval)};
|
||||
}
|
||||
|
||||
Application::Platform Application::getTargetPlatform()
|
||||
|
|
Loading…
Reference in New Issue