while(...)
{
int firstTime = TimeGetTime();
.
.
int lastTime += TimeGetTime() - firstTime;
if(lastTime > 100 ) // كل 100 جزء من الثانية .. أريد التحديث
updatePosition
DrawSomethingHere();
}
ERR AppInstance::Run(void)
{
// Enter typical application loop
ERR eRetval = ERR::OK;
bool bKeepIdling = true;
while (eRetval.Succeeded())
{
// Pump views messages
eRetval = ProcessViewsMessages(!bKeepIdling);
DSK_RETURNONFAIL;
if (eRetval == AppInstance::ERR_RS_BREAKEXECUTION)
break;
// Idle, call application
eRetval = OnIdle();
DSK_RETURNONFAIL;
bKeepIdling = (eRetval == AppInstance::ERR_RS_KEEPIDLING);
if (eRetval == AppInstance::ERR_RS_BREAKEXECUTION)
break;
} // While the app is running
return eRetval;
}
ERR AppState::OnIdle(void)
{
if (!m_timerGameTick.IsFired())
{
// Sleeping frees the CPU for other threads and processes in the system
// For King's Valley, the game utlizes so little CPU power, but if we don't
// sleep, then we will have a high frequency amount of calls to our OnIdle()
// function because DSK|RenderSmith will just check window messages and come
// back to us... Sleep(0) is not very helpful because it just gives a peak
// to other threads and gets back to us. Any number greater than 0 will do.
Sleep(1);
return (DWORD)AppInstance::ERR_RS_KEEPIDLING;
}
// Setup wait for next tick...
float fWaitTime = 1000.0f/(float)m_iFPS - m_timerGameTick.GetElapsed();
if (fWaitTime <= 0.0f)
fWaitTime = 1000.0f/(float)m_iFPS;
m_timerGameTick.WaitFor(fWaitTime);
m_pApp->OnIdle();
RenderMan& renderMan = CurrentRenderMan();
if (renderMan.ProbeValidity().Failed())
return (DWORD)AppInstance::ERR_RS_KEEPIDLING;
DSKRS::ViewNavigation *pView = (DSKRS::ViewNavigation*)m_aViews[0];
renderMan.RenderBegin();
renderMan.RenderTargetClear();
m_pApp->OnDraw();
renderMan.RenderEnd();
ERR eRetval = pView->GetRenderChain()->Present();
if (eRetval.Failed())
return (DWORD)AppInstance::ERR_RS_BREAKEXECUTION;
return (DWORD)AppInstance::ERR_RS_KEEPIDLING;
}
وفي 29 مايو 2008 11:48 ص، أعرب وسام البهنسي عن رأيه بالموقف كالآتي:
أحد الألعاب التي عملت عليها كانت على جهاز الـ Wii، وقد كانت تستخدم مبدءاً مماثلاً، حيث أن الحسابات الداخلية تتم بنبض ثابت 60 لقطة في الثانية، والرسم له نبض مطابق أيضاً، إلا في الحالات التي يستغرق فيها الرسم زمناً طويلاً فإنه يسمح له بالنزول فوراً إلى 30 لقطة في الثانية فقط إلى أن يتم تدارك الموقف والخروج من المشهد المعقد.في 29 مايو 2008 11:48 ص، قال SandHawk بهدوء وتؤدة:
اما المشكلة الثانية فتمثل تحدياً اكبر, ماذا لو لم يكن الكومبيوتر قادرفي 23 يونيو 2008 02:45 ص، قال الشمري بهدوء وتؤدة:
السؤال المطروح .. هو ما طرحه الاخ SandHawk في الفريق العربي ..في 23 يونيو 2008 02:45 ص، عقد الشمري حاجبيه بتفكير وقال:
لو رجعنا عشرين سنة الى الوراء ,وطلب منك عمل هذه اللعبة على الاتاري ..وفي 23 يونيو 2008 12:13 م، قال سلوان الهلالي متحمساً:
هنالك أيضاً نقطة مهمة اود ان اشير إليها بخصوص العاب تلك الحقبة, هي إنها لا تقوم بعملية رسم الشاشة بأكملها كل إطار, فقط الأجزاء التي تتغير يعاد رسمها بالمزامنة مع الـ vsync