ورود

View Full Version : سوال: افت فریم ناشی از چه چیز هایی میتونه باشه ؟



mohammadali1375
دوشنبه 18 دی 1391, 18:08 عصر
سلام.
بعد از اون سوتی گنده ( تایپک چند وقت پیش :افسرده: ) هنوز یه مشکلی برام حل نشده. ایندفه دیگه fps رو درست تست میکنم. خوب پروژه ( یه انجین دو بعدی ساده :لبخندساده: ) الان سنگین تر شده ولی نه به اون هد که با چند تا گیم آبجکت توی صحنه دچار افت فریم بشه.
من هرجا رو هم چک میکنم دلیلی برای افت فریم نمیبینم. مثلا با ده 15 تا گیم آبجکت فریم میاد رو 52 و هرچی زیاد تر میشه پایین تر میاد.
ولی اصلا با عقل جور در نمیاد . من رو همین سیستم ریمن بازی میکنم بدون اینکه افت فریمی داشته باشه یا ...
الان مثلا با 31 گیم آبجکت کل بازی 9,320 k از رم گرفته فریم میاد رو 47. بعضی وقتا ( بعضی وقتا ) یکم که صبر میکنم اول فریم هی بین 52 و 49 جابجا میشه بعد میار رو 58. ولی همیشه اینطوری نیست. اصلا قاطی کردم. :افسرده:
راستی برای این که از سوتی جلو گیری شه بهتره بگم چجوری فریم رو محاسبه میکنم :بامزه: :

اول حلقه اصلی :
preTim=SDL_GetTicks();
آخری حلقه اصلی :

char buffer[5]={0};
sprintf(buffer,"%d",1000/(SDL_GetTicks()-preTim));
SDL_WM_SetCaption(buffer,"");

amin.v
دوشنبه 18 دی 1391, 18:50 عصر
سلام

من با SDL کار نکردم ولی یه احتمالی ! این vsync رو فعال نکردید یا اینکه SDL تو حالت پیش فرض فریم ریت رو محدود نمیکنه ؟!
تو حالت Release Mode هم تست کردید ؟

mohammadali1375
دوشنبه 18 دی 1391, 19:15 عصر
vsync رو فعال کردم همون اول. بدوم وقفه فریم ریت فکر نکنم محدود باشه. برا من رو 90 میره. تو ریلیز هم الان تست میکنم ولی قاعدتا نباید تا این حد تاثیر داشته باشه :متفکر:

mohammadali1375
دوشنبه 18 دی 1391, 19:21 عصر
الان ریلیز نمیشه. تالا ریلیز ندادم همیشه رو دیباگ بوده . فکر نکنم ربط زیادی به اون داشته باشه :متفکر:

amin.v
دوشنبه 18 دی 1391, 19:26 عصر
منظورم این بود vsync رو غیر فعال کنید ، وقتی فعال هست یعنی با سرعت refresh rate مانیتور یکی میشه ...

mohammadali1375
دوشنبه 18 دی 1391, 20:38 عصر
منم منظورم همون بود :بامزه:
اینجوری دیگه :

inline void _xSetVSync(bool sync)
{
typedef bool (APIENTRY *PFNWGLSWAPINTERVALFARPROC)(int);

PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0;

wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress("wglSwapIntervalEXT");

if( wglSwapIntervalEXT )
wglSwapIntervalEXT(sync);
}

-------

_xSetVSync(false);

--------------

این باید باشه ؟ من اصلا این تابع رو نمیفهمم چی کار میکنه. خودم از یکی گرفتم
------------

راستی اینجا بین "wglS wapIntervalEXT" هم فاصله افتاده. ولی تو برنامه به هم چسبیده

amin.v
دوشنبه 18 دی 1391, 21:52 عصر
تا اونجایی که من میدونم SDL برا ترسیم ات دو بعدی یه کتابخونه داره که از OpenGL استفاده نیمکنه ( یعنی ترسیم ات رو هم CPU انجام میده ) البته امکان استفاده از OpenGL + SDL هم هست ولی به شرط اینکه SDL رو فقط به عنوان یه Windowing Framework استفاده کنید و از دستورات OpenGL برا Render ...

در مورد کدی که نوشتید اگر context رو خودتون بخواید بسازید درسته باید از wgl تو ویندوز استفاده کنید اما معمولا توی اینجور کتابخونه ها ( sdl , sfml , glut ) معمولا این دستورات تو API خودشون هست و برای همه پلتفرم ها هم کار میکنه مثلا برا همین vsync تو sfml اینطوری میتونید غیر فعال کنیدش :



sf::RenderWindow App(sf::VideoMode(800, 600), "SFML window");
App.UseVerticalSync(false);

ولی در مجموع فکر میکنم از sfml استفاده کنی بهتره ، یا حداقل یه امتحانی بکنش :چشمک:

mohammadali1375
دوشنبه 18 دی 1391, 21:57 عصر
:متفکر: نه خوب SDL هم کم چیزی نیست. خودش هم میتونه ترسیم کنه ولی من ازش استفاده کردم تا از اپن جی ال استفاده کنم. یعنی همون کاری که glut و ... انجام میده. فقط یه رابطه. ترسیمات و ..... هم با اپن جی ال انجام میدم. از SDL برای لود تصویر و گرفتن پیکسل ها + اینپوتش استفاده میکنم، باهاش چیزی ترسیم نمیکنم.
درمورد vsync هم باید ببینم خودش داره یا نه. ممنون از راهنمایی :قلب:

mohammadali1375
دوشنبه 18 دی 1391, 22:09 عصر
حالا کلا کس دیگه ای نظری نداره ؟ :لبخند:

mohammadali1375
دوشنبه 18 دی 1391, 22:25 عصر
اقا من یه فکری کردم :لبخند:

http://www.mediafire.com/download.php?aiecno00ujabtrb

شما تست کنید ببینید fps چنده :بامزه:

-----

راستی یادم رفت. رو صفحه کلیک کنید آبجکت بسازه :لبخندساده:

amin.v
سه شنبه 19 دی 1391, 01:08 صبح
من تست کردم ...
همون اول که یه اسپرایت هست فریم رو 60 هست و وقتی 2000 تا و حتی بیشتر هم اضافه میکنم باز همون 60 ه :لبخند:

mohammadali1375
سه شنبه 19 دی 1391, 10:25 صبح
:متعجب: :گیج: :خجالت: :بامزه: :کف:

aaa عجب چیزی شده پس :لبخند: . فقط یادم باشه امشب سیتممو با بقیه آشغالا بزارم دم در :بامزه:
ولی جدا برا خودم عجیبه. رو همین سیستم بازی خفن هم میکنم ولی سرعتش اونقدرا پایین نمیاد. :متفکر:
ولی آقا دمت گرم. خیالم راحت شد :قلب:

H_G_G_I
جمعه 22 دی 1391, 17:54 عصر
اون سری مارو الاف کردی نگو با fraps می دیدی :قهقهه: :عصبانی:
الانم فکرکنم اف پی اس رو فضایی حساب می کنی !:متفکر:
این رو ببین ::

uint $fpsCounter = 0;
uint $t1 = 0, $t2 = 0, $elapsed = 0;

for(;;)
{
$t1 = SDL_GetTicks();

$fpsCounter++;

//!!!update scene here !!!

$elapsed += SDL_GetTicks() - $t1;
if($elapsed >= 1000)
{
char $buff[256];
sprintf(l_buff, "FPS:%d", $fpsCounter);
SDL_WM_SetCaption(l_buff, NULL);
$elapsed -= 1000;
$fpsCounter = 0;
}
}

vsyncرو قطع نکنی خود اس دی ال کنترل می کنه و بیشتر از 60 فرم نمی زنه !
باید قطعش کنی !

mohammadali1375
جمعه 22 دی 1391, 23:10 عصر
نه مشکل از سیستمه. همین که دادی هم همون فریم ریت رو نشون میده. خودم هم همینکارو کرده بودم تقریبا :خجالت: