Fix VSYNC
This commit is contained in:
@@ -274,10 +274,6 @@ class BuiltinFunction
|
|||||||
}
|
}
|
||||||
static void VSYNC(PetitComputer p, int time)
|
static void VSYNC(PetitComputer p, int time)
|
||||||
{
|
{
|
||||||
if (time == 0)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
p.vsync(time);
|
p.vsync(time);
|
||||||
}
|
}
|
||||||
static void WAIT(PetitComputer p, DefaultValue!int time)
|
static void WAIT(PetitComputer p, DefaultValue!int time)
|
||||||
|
|||||||
@@ -321,13 +321,13 @@ class PetitComputer
|
|||||||
SDL_Renderer* renderer;
|
SDL_Renderer* renderer;
|
||||||
int vsyncFrame;
|
int vsyncFrame;
|
||||||
int vsyncCount;
|
int vsyncCount;
|
||||||
|
int prevVSyncCount;
|
||||||
bool isVSync;
|
bool isVSync;
|
||||||
bool waitFlag;
|
bool waitFlag;
|
||||||
void vsync(int f)
|
void vsync(int f)
|
||||||
{
|
{
|
||||||
waitFlag = true;
|
waitFlag = true;
|
||||||
isVSync = true;
|
isVSync = true;
|
||||||
vsyncCount = 0;
|
|
||||||
vsyncFrame = f;
|
vsyncFrame = f;
|
||||||
}
|
}
|
||||||
void wait(int f)
|
void wait(int f)
|
||||||
@@ -1151,6 +1151,7 @@ class PetitComputer
|
|||||||
if (maincntRender != oldmaincnt)
|
if (maincntRender != oldmaincnt)
|
||||||
{
|
{
|
||||||
maincnt++;
|
maincnt++;
|
||||||
|
vsyncCount++;
|
||||||
}
|
}
|
||||||
if(waitFlag)
|
if(waitFlag)
|
||||||
{
|
{
|
||||||
@@ -1158,6 +1159,10 @@ class PetitComputer
|
|||||||
//A=MAINCNT:WAIT 50:A=MAINCNT-A->A=50
|
//A=MAINCNT:WAIT 50:A=MAINCNT-A->A=50
|
||||||
//A=MAINCNT:VSYNC 50:A=MAINCNT-A->A=0~50
|
//A=MAINCNT:VSYNC 50:A=MAINCNT-A->A=0~50
|
||||||
graphic.updateVM();
|
graphic.updateVM();
|
||||||
|
if (isVSync && prevVSyncCount)
|
||||||
|
{
|
||||||
|
vsyncFrame -= vsyncCount - prevVSyncCount;
|
||||||
|
}
|
||||||
auto endmaincnt = maincnt + vsyncFrame;
|
auto endmaincnt = maincnt + vsyncFrame;
|
||||||
oldmaincnt = maincntRender;
|
oldmaincnt = maincntRender;
|
||||||
while (maincnt < endmaincnt && !quit)
|
while (maincnt < endmaincnt && !quit)
|
||||||
@@ -1172,6 +1177,7 @@ class PetitComputer
|
|||||||
vsyncFrame = 0;
|
vsyncFrame = 0;
|
||||||
waitFlag = false;
|
waitFlag = false;
|
||||||
isVSync = false;
|
isVSync = false;
|
||||||
|
prevVSyncCount = vsyncCount;
|
||||||
}
|
}
|
||||||
//maincnt = cast(int)((SDL_GetTicks() - startcnt) / frame);
|
//maincnt = cast(int)((SDL_GetTicks() - startcnt) / frame);
|
||||||
graphic.updateVM();
|
graphic.updateVM();
|
||||||
@@ -1211,6 +1217,7 @@ class PetitComputer
|
|||||||
scope (exit)
|
scope (exit)
|
||||||
{
|
{
|
||||||
maincnt += maincntRender - oldmaincnt;
|
maincnt += maincntRender - oldmaincnt;
|
||||||
|
vsyncCount += maincntRender - oldmaincnt;
|
||||||
}
|
}
|
||||||
void setText(wstring text)
|
void setText(wstring text)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user