View Full Version : سوالاتی در مورد fps
1485159
سه شنبه 18 خرداد 1389, 09:59 صبح
سلام
چطوری باید چیزی شبیه به تایمر درست کنم؟
ممنون.
1485159
سه شنبه 18 خرداد 1389, 22:24 عصر
سلام
با تشکر از نظرات دوستان
من برای تنظیم fps میام و فاصله نمایش فریم قبلی رو با زمان حال مقایسه میکنم و اگر فاصله ی این دوتا مثلا 10 میلی ثانیه بود اونوقت بازم رندر میکنم و نشون میدم. آیا این روش خوبه؟ در اینصورت fps میشه 100؟؟
در ضمن ابتدا رندر کنم و در زمان مناسب نشون بدم یا در زمان مناسب رندر کرده و شنون بدم؟
ممنون.:لبخندساده:
1485159
چهارشنبه 19 خرداد 1389, 14:29 عصر
کسی نیست راهنمایی کنه؟:گریه:
Armin060
چهارشنبه 19 خرداد 1389, 16:29 عصر
چطوری باید چیزی شبیه به تایمر درست کنم؟
اونی که تو پست دوم گفتی شد تایمر دیگه :لبخند: البته بهینه بودن الگوریتمت خیلی به این بستگی داره که چطوری اون زمانی که باید صبر بشه رو بگذرونی.
من برای تنظیم fps میام و فاصله نمایش فریم قبلی رو با زمان حال مقایسه میکنم و اگر فاصله ی این دوتا مثلا 10 میلی ثانیه بود اونوقت بازم رندر میکنم و نشون میدم. آیا این روش خوبه؟ در اینصورت fps میشه 100؟؟
در ضمن ابتدا رندر کنم و در زمان مناسب نشون بدم یا در زمان مناسب رندر کرده و شنون بدم؟
راستش یه جورایی این روشت ....... نمی دونم.......
اینکه fps میشه چند بستگی به کامپیوتر اجرا کننده داره. چون فقط زمانی که تو بین فریم ها میزاری ملاک نیست، چرا؟ خوب معلومه دیگه زمانی که رندر طول می کشه که 0 ثانیه نیست. اون هم بلاخره تاثیر داره و تاثیرش هم خیلی واضح هست.
اگه داری بازی میسازی، روشی که من بهت پیشنهاد میدم اینه که اصلا فاصله بین فریم ها نزاری.
1485159
چهارشنبه 19 خرداد 1389, 16:37 عصر
راستش یه جورایی این روشت ....... نمی دونم.......
میشه نقطه ضعفش رو بگی؟
اینکه fps میشه چند بستگی به کامپیوتر اجرا کننده داره. چون فقط زمانی که تو بین فریم ها میزاری ملاک نیست، چرا؟ خوب معلومه دیگه زمانی که رندر طول می کشه که 0 ثانیه نیست. اون هم بلاخره تاثیر داره و تاثیرش هم خیلی واضح هست.
به همین دلیله که گفتم:
در ضمن ابتدا رندر کنم و در زمان مناسب نشون بدم یا در زمان مناسب رندر کرده و شنون بدم؟
----------------
اگه داری بازی میسازی، روشی که من بهت پیشنهاد میدم اینه که اصلا فاصله بین فریم ها نزاری.
اینکه اصلا نمیشه! اگه فرم رو کوچیک کنم سرعت رندر بشدت میره بالا و اگه بزرگش کنم میره پایین.
Armin060
چهارشنبه 19 خرداد 1389, 17:17 عصر
میشه نقطه ضعفش رو بگی؟
مگه چشه؟ یکی از روش ها همینه دیگه. البته اون زمان رو چطوری چک میکنی؟ یعنی زمان چی رو چک می کنی؟
----------------
اگه می خوای بین فریم ها فاصله بزاری خب تو اون زمانی که CPU بی کار هستش رندر کن بعد وقتی زمانش رسید نشون بده.
اینکه اصلا نمیشه! اگه فرم رو کوچیک کنم سرعت رندر بشدت میره بالا و اگه بزرگش کنم میره پایین.
چرا نمیشه؟ خوب هرچی fps زیادتر باشه که بهتره. تو داری اون حالتی که از fps بهتری برخوردار هستیم رو از بین می بری. البته ترجیحا رو 60 نگرش دار. ولی اگه داری بازی میسازی بستگی به بازیت با افت سرعت مواجه میشی.
هنوز هم روش پیشنهادی من اینه که بین فریم ها فاصله نزاری.
1485159
چهارشنبه 19 خرداد 1389, 17:25 عصر
یعنی زمان چی رو چک می کنی؟
زمان نمایش فریم قبلی.
اگه می خوای بین فریم ها فاصله بزاری خب تو اون مقداری که CPU بی کار هستش رندر کن بعد وقتی زمانش رسید نشون بده.
این هم مشکلاتی داره واسه خودش. مثلا ممکنه بعد از اینکه ما رندر کردیم قبل از نمایش کاربر مثلا یه دکمه رو بزنه! چی میشه؟
چرا نمیشه؟ خوب هرچی fps زیادتر باشه که بهتره. تو داری اون حالتی که از fps بهتری برخوردار هستیم رو از بین می بری. البته ترجیحا رو 60 نگرش دار. ولی اگه داری بازی میسازی بستگی به بازیت با افت سرعت مواجه میشی.
یعنی باید متناسب با بازی fps رو تنظیم کنم؟
هنوز هم روش پیشنهادی من اینه که بین فریم ها فاصله نزاری.
پس اون موقع چرا مفهومی به عنوان fps وجود داره؟ منظورم اینه که چرا فاصله نزارم؟
Armin060
چهارشنبه 19 خرداد 1389, 17:50 عصر
زمان نمایش فریم قبلی.
اون رو که قبلا هم گفتی. منظورم اینه که اون زمان رو از کجا میاری؟ چه نوع زمانی هست، بر حسب چی هست؟
این هم مشکلاتی داره واسه خودش. مثلا ممکنه بعد از اینکه ما رندر کردیم قبل از نمایش کاربر مثلا یه دکمه رو بزنه! چی میشه؟
یکی از راه ها اینه که تو زمان اشیایی که نسبت به واکنش کاربر کنش نشون میدن رو رندر نکنید و در زمان نمایش رندر کنید.
البته 10 میلی ثانیه زمانی نیست که کاربر فرصت دکمه زدن پیدا کنه :لبخند:
یعنی باید متناسب با بازی fps رو تنظیم کنم؟
منظورم اینه که تو بازی معمولا با افت سرعت مواجه میشی.
ولی تناسب خب تناسب هست دیگه. به هر حال باید باشه. واسه بعضی از بازی ها 20 هم زیاد هست ولی واسه بعضی دیگه زیر 60 ممکنه مشکل ایجاد کنه.
پس اون موقع چرا مفهومی به عنوان fps وجود داره؟
مگه fps واسه ایجاد محدودیت به وجود اومده؟
منظورم اینه که چرا فاصله نزارم؟
اگه به افت سرعت بر نخوردی خب بزار. ولی فقط کامپیوتر خودت رو هم در نظر نگیر.
1485159
چهارشنبه 19 خرداد 1389, 18:18 عصر
اون رو که قبلا هم گفتی. منظورم اینه که اون زمان رو از کجا میاری؟ چه نوع زمانی هست، بر حسب چی هست؟
یه متغیری دارم که هر میلی ثانیه یک واحد بهش اضافه میشه.(مدت زمانی که کامپیوتر شروع به کار کرده)
یکی از راه ها اینه که تو زمان اشیایی که نسبت به واکنش کاربر کنش نشون میدن رو رندر نکنید و در زمان نمایش رندر کنید.
مثلا بکگراند و پنل ها؟ و..؟
منظورم اینه که تو بازی معمولا با افت سرعت مواجه میشی.
ولی تناسب خب تناسب هست دیگه. به هر حال باید باشه. واسه بعضی از بازی ها 20 هم زیاد هست ولی واسه بعضی دیگه زیر 60 ممکنه مشکل ایجاد کنه.
انجینی که مینویسم خیلی سادس و 2 بعدی! شما فرض کن قراره که باهاش بازی تتریس ساخته بشه، fps چن باشه خوبه؟
مگه fps واسه ایجاد محدودیت به وجود اومده؟
خیر، برای مدریت!
----
مثلا fps gat2 یا 1 چنده؟
Armin060
چهارشنبه 19 خرداد 1389, 19:51 عصر
یه متغیری دارم که هر میلی ثانیه یک واحد بهش اضافه میشه.(مدت زمانی که کامپیوتر شروع به کار کرده)
اون متغییر چیه؟ خودت تعریف کردی، اگه اره که خوب نیست.
مثلا بکگراند و پنل ها؟ و..؟
به بازیت بستگی داره، بگو می خوای چی بسازی خب، من بهتر بتونم راهنماییت کنم.
انجینی که مینویسم خیلی سادس و 2 بعدی! شما فرض کن قراره که باهاش بازی تتریس ساخته بشه، fps چن باشه خوبه؟
انجین داری می نویسی!!!!!!!!! :o
مثلا fps gat2 یا 1 چنده؟
fps چیزه ثابتی نیست که من بهت بگم چنده. شما داری سعی می کنی ثابتش کنی.
1485159
چهارشنبه 19 خرداد 1389, 20:10 عصر
اون متغییر چیه؟ خودت تعریف کردی، اگه اره که خوب نیست.
تابع GetTickCount
به بازیت بستگی داره، بگو می خوای چی بسازی خب، من بهتر بتونم راهنماییت کنم.
انجینی برای بازی های ساده مثل تتریس و دوز و اینجور چیز ها.
انجین داری می نویسی!!!!!!!!! :o
:لبخند: منظورت رو نفهمیدم:متفکر:
fps چیزه ثابتی نیست که من بهت بگم چنده. شما داری سعی می کنی ثابتش کنی.
یعنی چی ثابت نیست؟ مثلا ممکنه تو کامپیوتر من 10 باشه رو کامپیوتر یکی دیگه 20؟ چطوری اینو تنظیم میکنن؟
Armin060
چهارشنبه 19 خرداد 1389, 20:26 عصر
تابع GetTickCount
خوبه، گفتم یه وقت نکنه خودت تعریف کرده باشی :لبخند:
انجینی برای بازی های ساده مثل تتریس و دوز و اینجور چیز ها.
دمت گرم بابا. با چی داری می نویسی؟
منظورت رو نفهمیدم:متفکر:
منظورم این بود : انجین داری می نویسی؟؟؟؟؟؟؟؟
یعنی چی ثابت نیست؟ مثلا ممکنه تو کامپیوتر من 10 باشه رو کامپیوتر یکی دیگه 20؟ چطوری اینو تنظیم میکنن؟
کلا چیز ثابتی نیست. تو همون کامپیوتر شما هم متغییر هست. مثلا الان 100 هست بعد یک ثانیه بعد میشه 110 بعد یک ثانیه بعد میشه 80 یک ثانیه بعد 96 و مدام متغییر هست. تغریبا شبیه سرعت اینترنت می مونه، موقع دانلود که دیدی چطوری هست، یه همچون چیزی.
تنظیمش هم نمیشه کرد.
1485159
چهارشنبه 19 خرداد 1389, 20:36 عصر
خوبه، گفتم یه وقت نکنه خودت تعریف کرده باشی :لبخند:
البته تو فکرش هستم که یکی خودم طراحی کنم.:لبخند:
دمت گرم بابا. با چی داری می نویسی؟
دلفی + Opengl
منظورم این بود : انجین داری می نویسی؟؟؟؟؟؟؟؟
بله:لبخند:
کلا چیز ثابتی نیست. تو همون کامپیوتر شما هم متغییر هست. مثلا الان 100 هست بعد یک ثانیه بعد میشه 110 بعد یک ثانیه بعد میشه 80 یک ثانیه بعد 96 و مدام متغییر هست. تغریبا شبیه سرعت اینترنت می مونه، موقع دانلود که دیدی چطوری هست، یه همچون چیزی.
پس fps فقط مشخص میکنه چه چنتا فریم توی یک ثانیه نشون داده شده! نه اینکه تعیین کنه چنتا فریم باید نشون داده بشه! نه؟
------------------------
این که یکم نگران کننده شد! فرض کن من یه دایره دارم که هر فریم یک واحد به جلو حرکت میکنه، ممکنه توی یه کامپیوتری با سرعت زیاد حرکت کنه و توی یه کامپیوتر دیگه با سرعت کم؟ و هیچکدوم هم مد نظر من نباشه! این چی میشه؟
Armin060
چهارشنبه 19 خرداد 1389, 20:44 عصر
البته تو فکرش هستم که یکی خودم طراحی کنم.:لبخند:
زیاد بهش فکر نکن :لبخند:
دلفی + Opengl
دقیقا تضاد چیزی که انتظار داشتم.
پس fps فقط مشخص میکنه چه چنتا فریم توی یک ثانیه نشون داده شده! نه اینکه تعیین کنه چنتا فریم باید نشون داده بشه! نه؟
تا اون جا که من فهمیدم، اره میگه چند تا فریم تو یک ثانیه نمایش داده میشه. تنظیم کردنش هم یه چیزی مثل تنظیم قدرت کامپیوترت میمونه.
این که یکم نگران کننده شد! فرض کن من یه دایره دارم که هر فریم یک واحد به جلو حرکت میکنه، ممکنه توی یه کامپیوتری با سرعت زیاد حرکت کنه و توی یه کامپیوتر دیگه با سرعت کم؟ و هیچکدوم هم مد نظر من نباشه! این چی میشه؟
حدس زدم که مشکلت این باشه.
خب امممم.......
شما fps رو به دست بیار بعد مقداری که دایره باید حرکت کنه رو متناسب با fps تنظیم کن. البته این کار باید در هر فریم جدا انجام بشه، می دونی که، fps ثابت نیست.
1485159
چهارشنبه 19 خرداد 1389, 21:07 عصر
دقیقا تضاد چیزی که انتظار داشتم.
حتما سی ++ و دایرکت رو انتظار داشتی بشنوی. نه؟:لبخند:
شما fps رو به دست بیار بعد مقداری که دایره باید حرکت کنه رو متناسب با fps تنظیم کن. البته این کار باید در هر فریم جدا انجام بشه، می دونی که، fps ثابت نیست.
میگم چطوره که همون fps رو محدود کنم.:متفکر: به دلایل زیر:
1- اگه بخوایم با 60 فریم بر ثانیه نمایش بدیم باید هر 16 میلی ثانیه یکبار آپدیت کنیم.
2- بیشتر از 60 فریم بر ثانیه هیچ ارزشی نداره.
3- پس 2-3 میلی ثانیه قبل از نمایش رندر میکنیم!(البته این زمان رو باید متناسب با سخت افزار تعیین کنیم. مثلا تخمین زمان رندر یا طول کشیدن رندر قبلی.)
Armin060
چهارشنبه 19 خرداد 1389, 21:20 عصر
حتما سی ++ و دایرکت رو انتظار داشتی بشنوی. نه؟:لبخند:
نه. vb.net و xna
اگه بخوایم با 60 فریم بر ثانیه نمایش بدیم باید هر 16 میلی ثانیه یکبار آپدیت کنیم.
اون 60 فریم در صورتی بود که داری بازی می نویسی. ولی انجین مسئله فرق می کنه و نباید محدودیت در مورد fps توش باشه!
بیشتر از 60 فریم بر ثانیه هیچ ارزشی نداره.
هیچ که نه ولی انسان متوجه نمیشه. البته 60 درست و حسابی. چون من تو یه بازی 60 تا fps داشتم بعد انگار 20 تا بود. نمی دونم چرا، شاید 40+ می کرد بعد نمایش می داد. :لبخند:
پس 2-3 میلی ثانیه قبل از نمایش رندر میکنیم!(البته این زمان رو باید متناسب با سخت افزار تعیین کنیم. مثلا تخمین زمان رندر یا طول کشیدن رندر قبلی.)
نه، نه... اصلا این کار رو نکن. همون بدون محدودیت بزار باشه.
1485159
چهارشنبه 19 خرداد 1389, 21:26 عصر
نه. vb.net و xna
چرا؟ حتما به قیافم میخوره؟:لبخند:
اون 60 فریم در صورتی بود که داری بازی می نویسی. ولی انجین مسئله فرق می کنه و نباید محدودیت در مورد fps توش باشه!
بالاخره با انجین هم قراره که بازی بسازیم دیگه؟:متفکر:
نه، نه... اصلا این کار رو نکن. همون بدون محدودیت بزار باشه.
آخه بازم همون مشکلی که گفتم هست!
-----------------------------
در ضمن من اگه بخوام fps رو به دست بیارم باید تعداد رندر ها رو در یک ثانیه بشمرم؟
Armin060
چهارشنبه 19 خرداد 1389, 21:49 عصر
چرا؟ حتما به قیافم میخوره؟:لبخند:
من که ندیدمت. همینطوری تصور الکی.
بالاخره با انجین هم قراره که بازی بسازیم دیگه؟:متفکر:
شما که داری توش محدودیت ایجاد میکنی شاید با بازی ای که کاربر داره میسازه هم خونی نداشته باشه. بعد شما اگر با اون روشی که قبلا تو پست اول ذکر کردید محدودیت ایجاد کنید اون محدودیت فقط مواقعی کاربردی هست که در حالت عادی fps بالای 100 باشه ( تقریبا )، و وقتی اومد زیر 60 اون وقت مثلا در حالت عادی اگر fps برابر 50 بود اون وقت با محدودیت شما افت fps خیلی خیلی زیاد میشه.
منظورم از حالت عادی بدون محدودیت در fps بود.
آخه بازم همون مشکلی که گفتم هست!
نه عزیز نیست. انگار دارم الکی میگم خب من خودم این کار رو کردم دیگه.
در ضمن من اگه بخوام fps رو به دست بیارم باید تعداد رندر ها رو در یک ثانیه بشمرم؟
مگه بیکاری. نمیشه که. fps در واقع در ثانیه متغییر نیست. در هر لحظه از کلاک cpu ممکنه تغییر کنه و این زمان خیلی کم تر از 1 ثانیه هست و در هر کامپیوتر cpu clock فرق داره.
1485159
چهارشنبه 19 خرداد 1389, 21:55 عصر
نه عزیز نیست. انگار دارم الکی میگم خب من خودم این کار رو کردم دیگه.
چی کار کردین؟ بدون محدودیت دایره توی همه pc ها یک نواخت حرکت کرده؟:متفکر: یا منظورتون همون روشیه که گفتین؟
مگه بیکاری. نمیشه که. fps در واقع در ثانیه متغییر نیست. در هر لحظه از کلاک cpu ممکنه تغییر کنه و این زمان خیلی کم تر از 1 ثانیه هست و در هر کامپیوتر cpu clock فرق داره.
پس چطوری حسابش کنم؟
Armin060
چهارشنبه 19 خرداد 1389, 23:00 عصر
چی کار کردین؟ بدون محدودیت دایره توی همه pc ها یک نواخت حرکت کرده؟:متفکر: یا منظورتون همون روشیه که گفتین؟
تناسب میزان حرکت با fps
حالا دایره نبوده، ولی اون حرکت هایی که باید انجام می شد همه جا یکی بوده. مگه مثلا COD بازی نکردی؟ کامپیوتر من و شما نداره که، یکی هست دیگه.
کدوم روش؟ تناسب رو میگی؟
پس چطوری حسابش کنم؟
فعلا fps رو ولش.
و اما روش پیشنهادی من: شما اختلاف زمان بین هر فریم رو بر حسب ثانیه به دست بیار، البته اعشار فراموش نشه. بعد مثلا واسه دایره یه متغیر ثابت تعریف کن و سرعت حرکت دایره در ثانیه رو بهش بده، مثلا 100. بعد موقع حرکت این عدد رو در اختلاف زمان به دست اومده ضرب کن و به اندازه عدد حاصل، دایره رو حرکت بده.
1485159
چهارشنبه 19 خرداد 1389, 23:10 عصر
شما اختلاف زمان بین هر فریم رو بر حسب ثانیه به دست بیار، البته اعشار فراموش نشه.
اعشارش رو چطوری به دست بیارم؟
Armin060
چهارشنبه 19 خرداد 1389, 23:25 عصر
اعشارش رو چطوری به دست بیارم؟
سوال هایی می پرسیا. خب وقتی اختلاف فریم بر حسب میلی ثانیه رو به دست بیاری و تقسیم بر 1000 کنی بر حسب ثانیه به دست میاد دیگه. از اعشار هم منظورم اینه که نری بریزیش تو یه متغییری که اعشار پذیر نباشه، قسمت اعشار حذف بشه، اعشار اینجا خیلی مهمه.
1485159
چهارشنبه 19 خرداد 1389, 23:28 عصر
سوال هایی می پرسیا. خب وقتی اختلاف فریم بر حسب میلی ثانیه رو به دست بیاری و تقسیم بر 1000 کنی بر حسب ثانیه به دست میاد دیگه.
آهان.. فکر کردم منظورت اینه که اختلاف زمان رو اعشارش رو هم حساب کنم.
Armin060
پنج شنبه 20 خرداد 1389, 15:41 عصر
الان یه چیز هایی متوجه شدم، مثل اینکه fps اگر از فرکانس مونیتور بالاتر باشه مشکل ایجاد می کنه. یه جوری رو 60 نگرش دار. اینطوری هم دیگه اون مشکل ها رو نداریم ( مثل اینکه تصویر تیکه تیکه میشه ) و هم کار بیخودی انجام ندادیم. ولی درست و حسابی ها. نه با اون الگوریتمی که اول تاپیک گفتی. سعی کن که fps رو بین 50 تا 60 نگر داری.
1485159
پنج شنبه 20 خرداد 1389, 15:45 عصر
ولی درست و حسابی ها. نه با اون الگوریتمی که اول تاپیک گفتی. سعی کن که fps رو بین 50 تا 60 نگر داری.
خوب اون چش بود؟ میگم 3-4 میلی ثانیه قبل رندر کنم خوبه؟
1485159
پنج شنبه 20 خرداد 1389, 19:41 عصر
دوستان من واقعا گیجتر شدم!! حالا بین فریم ها فاصله بزارم یا نه؟ چطوری؟
REZAsys
پنج شنبه 20 خرداد 1389, 21:07 عصر
سلام
عزیز کارها میکنی.....ها:گیج:
بیا یکی از انجین ها رو کار کن ، اینطوری بهتره ها.............:متفکر:
1485159
پنج شنبه 20 خرداد 1389, 21:13 عصر
سلام
عزیز کارها میکنی.....ها:گیج:
بیا یکی از انجین ها رو کار کن ، اینطوری بهتره ها.............:متفکر:
نه عزیزم... من با همینا راحتم:لبخند:
Armin060
پنج شنبه 20 خرداد 1389, 22:58 عصر
سلام
عزیز کارها میکنی.....ها:گیج:
بیا یکی از انجین ها رو کار کن ، اینطوری بهتره ها............
تو چرا پس سعی داری همه رو بکشونی طرف خودت؟ اگه کسایی مثل نبودن که از این کارا بکنند، الان موتور بی موتور بود.
دوستان من واقعا گیجتر شدم!! حالا بین فریم ها فاصله بزارم یا نه؟ چطوری؟
fps رو چک کن اگر بیشتر از 60 بود یه فاصله ای بزار که کمتر از 50 نشه، بعد اون فاصله رو هم دائم نزار، هر چند وقت یک بار چک کن ببین چقدر باید فاصله بزاری بعد تنظیمش کن.
1485159
پنج شنبه 20 خرداد 1389, 23:26 عصر
fps رو چک کن اگر بیشتر از 60 بود یه فاصله ای بزار که کمتر از 50 نشه، بعد اون فاصله رو هم دائم نزار، هر چند وقت یک بار چک کن ببین چقدر باید فاصله بزاری بعد تنظیمش کن.
اگه بخوام fps 60 باشه باید هر 16 میلی ثانیه آپدیت کنم! آخه خیلی افت میکنه!
Armin060
جمعه 21 خرداد 1389, 00:06 صبح
شما باید تو هر 16.6 میلی ثانیه هم رندر کنید و هم نشون بدید و هم کار های دیگه رو انجام بدید تا از fps خوبی برخوردار باشد، نه اینکه 16 میلی ثانیه صبر کنید بعد تازه شروع به رندر و کار های دیگه کنید.
تقریبا 16 میلی ثانیه فرصت داری که همه ی کار ها رو انجام بده، و بعد از اتمام کار ها نمایش بدی.
البته چک که اگر کار ها زودتر از 16میلی ثانیه تموم شد، بازی صبر کنه تا به 16 میلی ثانیه برسیم، بعد نمایش بده، تا fps اضافی نداشته باشیم.
جدیدا یکسری روش ها ابدا شده ( جدیدا که، تقریبا 3 4 سال، شاید هم بیشتر ) واسه در رفتن از افت fps، که البته یه مقدار مشکلات تو تصویر به وجود میاره، مثلا تصویر یهو تیکه میشه، ولی دیگه fps افت نمیکنه، یا اگر هم می کنه، خیلی کم میکنه، که با تحقیق احتمالا بتونی پیداش کنی. تو GameDev.Net باید به نتیجه برسی، ولی به نظر فعلا زوده واست.
1485159
جمعه 21 خرداد 1389, 00:12 صبح
شما باید تو هر 16.6 میلی ثانیه هم رندر کنید و هم نشون بدید و هم کار های دیگه رو انجام بدید تا از fps خوبی برخوردار باشد، نه اینکه 16 میلی ثانیه صبر کنید بعد تازه شروع به رندر و کار های دیگه کنید.
تقریبا 16 میلی ثانیه فرصت داری که همه ی کار ها رو انجام بده، و بعد از اتمام کار ها نمایش بدی.
البته چک که اگر کار ها زودتر از 16میلی ثانیه تموم شد، بازی صبر کنه تا به 16 میلی ثانیه برسیم، بعد نمایش بده، تا fps اضافی نداشته باشیم.
ممکنه رندر کردن بیشتر از 16 میلی ثانیه بکشه؟ درضمن چطوری 16.6 میلی ثانیه رو بدست بیارم؟ منظورم قسمت اعشاریشه؟
Armin060
جمعه 21 خرداد 1389, 00:32 صبح
16.6 میلی ثانیه که دیگه به دست آوردن نداره. داریش دیگه، 16.6 میلی ثانیه.
شما همه ی کار ها به جز نمایش رو انجام بده. وقتی به نمایش رسیدی، یه شرط بزار که اگر کمتر از 16.6 میلی ثانیه از آخرین نمایش گذشته بود، صبر کنه تا بشه 16.6 میلی ثانیه و بعد نمایش بده، در غیر این صورت نمایش بده.
1485159
جمعه 21 خرداد 1389, 00:36 صبح
16.6 میلی ثانیه که دیگه به دست آوردن نداره. داریش دیگه، 16.6 میلی ثانیه.
منظورم این بود که فهمیدن فهمیدن اینکه 16 میلی ثانیه گذشته مشکلی نیست! ولی 0.6 ش مشکله! آخه من فقط میتونم میلی ثانیه ها رو به دست بیارم از اون کوچکتر نمیشه!
شما همه ی کار ها به جز نمایش رو انجام بده. وقتی به نمایش رسیدی، یه شرط بزار که اگر کمتر از 16.6 میلی ثانیه از آخرین نمایش گذشته بود، صبر کنه تا بشه 16.6 میلی ثانیه و بعد نمایش بده، در غیر این صورت نمایش بده.
گفتم که! اگه کاربر توی این 16 میلی ثنیه مثلا یه دکمه رو فشار بده چی؟ میگم مثلا 5 میلی ثانیه قبل رندر کنم؟
----
ممکنه رندر کردن بیشتر از 16 میلی ثانیه بکشه؟
Armin060
جمعه 21 خرداد 1389, 00:50 صبح
منظورم این بود که فهمیدن فهمیدن اینکه 16 میلی ثانیه گذشته مشکلی نیست! ولی 0.6 ش مشکله! آخه من فقط میتونم میلی ثانیه ها رو به دست بیارم از اون کوچکتر نمیشه!
اشکال نداره. شما 16 میلی ثانیه بزار. 0.6 میلی ثانیه هم زمان واسه نمایش :لبخند:
گفتم که! اگه کاربر توی این 16 میلی ثنیه مثلا یه دکمه رو فشار بده چی؟ میگم مثلا 5 میلی ثانیه قبل رندر کنم؟
نگرون نباش، 16 میلی ثانیه خیلی کمتر از اون حرف هاست که بشه دکمه زد. من الان خودم امتحان کردم، مشکلی پیش نمیاد، در هر حال اگر به مشکلی هم بر خوردی یه فکری بکن دیگه.
ممکنه رندر کردن بیشتر از 16 میلی ثانیه بکشه؟
خب بکشه. fps کمتر میشه. ولی سعی کن که fps زیر 50 نیاد. منظورم اینه که کار های اضافی از cpu و gpu نکش، یا حافظه الکی مصرف نکن. خلاصه این جور چیزا دیگه. مثلا اگر dt اختلاف زمان بین فریم ها بر حسب میلی ثانیه باشه :
Render and do evrything other
If dt < 16 then Sleep 16 - dt
Now show device
البته حواست باشه ها، اینی که من الان دارم میگم، ممکنه خیلی مشکلات داشته باشه که باید حلشون کنی ولی فعلا باید کارت رو راه بندازه.
1485159
جمعه 21 خرداد 1389, 10:14 صبح
شما باید تابع Update رو طوری بنویسید تا بتون نسبت به زمان عقب افتاده مقادیرهارو Update کنه تا نتیجه ی نهایی به صورت Real-Time بشه.
یعنی اگر قرار باشه که یک ثانیه بعد توپ به انتهای صفحه برسه، ولی به دلیل پایین بودن fps نرسیده باشه باید توپ رو انتهای صفحه ببریم؟
1485159
جمعه 21 خرداد 1389, 13:34 عصر
واقعا ممنونم.
حالا چطوری fps رو حساب کنم؟
1485159
دوشنبه 24 خرداد 1389, 16:26 عصر
سلام
ببینید اینی که من نوشتم مشکلی نداره؟
t := GetTickCount;
Draw();
while (GetTickCount - t) < 16 do
begin
end;
SwapBuffers(h_Dc);
به زبان دلفیه ولی قابل فهمه!!
ممنون.
Armin060
دوشنبه 24 خرداد 1389, 18:37 عصر
ببینم، اینجا تابع Update نمی بینم؟
اون while که بیکار هست، اصلا واسه چی حلقه ایجاد کردی؟
1485159
دوشنبه 24 خرداد 1389, 18:42 عصر
ببینم، اینجا تابع Update نمی بینم؟فعلا آپدیت رو هنگام رسم میکنم!
ببینم، اینجا تابع Update نمی بینم؟منظورت اینه که در مدت 16 میلی ثانیه پیام ها رو پردازش کنم؟
Armin060
دوشنبه 24 خرداد 1389, 18:56 عصر
نه، میگم این تیکه از کد رو واسه چی نوشتی؟
while (GetTickCount - t) < 16 do
begin
end;
1485159
دوشنبه 24 خرداد 1389, 19:01 عصر
برای اینکه 16 میلی ثانیه سپری بشه!
Armin060
دوشنبه 24 خرداد 1389, 19:15 عصر
اوه :اشتباه:
الگوریتم جالبی استفاده کردی. ولی اینطوری از CPU استفاده میشه، از تابع sleep استفاده کن ( نمی دونم معادلش تو دلفی چی هست ) که از CPU استفاده نشه و CPU واسه انجام کار های دیگه آزاد بمونه.
1485159
دوشنبه 24 خرداد 1389, 19:30 عصر
الگوریتم جالبی استفاده کردی.
واقعا میگی؟ یا مسخره میکنی؟:لبخند:
ولی اینطوری از CPU استفاده میشه،
میگم چطوری اصلا توی این مدت پیام ها رو پردازش کنم؟
از تابع sleep استفاده کن ( نمی دونم معادلش تو دلفی چی هست ) که از CPU استفاده نشه و CPU واسه انجام کار های دیگه آزاد بمونه.
همون sleep هست.
1485159
دوشنبه 24 خرداد 1389, 20:10 عصر
کدوم مدت؟ کدوم پیغام ها؟
پیام هایی که به برنامه ارسال میشه.
Armin060
دوشنبه 24 خرداد 1389, 20:47 عصر
پیام هایی که به برنامه ارسال میشه.
دقیقا منظورت چه پیغوم هایی هست و بگو تو کدوم مدت؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.