PDA

View Full Version : سوال: مشکل با CPU Usage در ساخت بازی



hossein_ignore
دوشنبه 17 خرداد 1389, 22:15 عصر
سلام دوستای من.
من دارم یه بازی ساده می سازم. حالا وسط کار به یه مشکل بر خوردم! اینکه وقتی یکم بازی میکنی CPU Usage میره رو 100%! اگه میشه یه نگاهی به برنامم بندازین شاید تونستین کمکم کنین

sia_2007
دوشنبه 17 خرداد 1389, 23:05 عصر
دوست عزیز؛ من حوصله نکردم که کل کد رو بخونم؛ اما شما که حوصله داری سعی کن Game Programming رو اصولی یاد بگیری و با فریم ورکهای مناسب و ترجیحا مبتنی بر Net. مثل XNA کار کنی.
---
با این یه تیکش اصلا حال نکردم؛


foreach (IEnemy en in enemyList) // Check if an Enemy Passed the Finish Line
{
if (en.Object.Location.Y + en.Object.Height > gameField.Height - 100)
{
StopEnemies(sender, e);
EndGame(sender, e);
ClearEnemies(sender, e);
break;
}
}



شما میآین تو لیست کل Enemy هاتون Loop میزنید تا ببینید که کدوم یکی از خط رد شده ؟
جالب نیست.
ولی کلا بدک نبود :چشمک: :ناراحت: :افسرده:

hossein_ignore
سه شنبه 18 خرداد 1389, 05:11 صبح
مرسی sia_2007 از نظرت.
من دانشجوی ترم 2 نرم افزارم، اینم پروجه ی درس برنامه سازی پیشرفتمه! نمیتونم با XNA کار کنم.

حالا که با اون تیکش حال نکردی بی زحمت یه راه حل هم پیشنهاد کن! غیر از این کار، چیکار میتونم بکنم؟

hossein_ignore
چهارشنبه 19 خرداد 1389, 00:56 صبح
اون تیکه ای که باش حال نکردیو عوض کردم! حالا ببین حال میکنی؟ CPU Usage هم یکمی اوضاش بهتر شده، ولی بازم مشکل داره!

hossein_ignore
چهارشنبه 19 خرداد 1389, 21:16 عصر
حالا CPU رو بیخیال! واسه بازی چه پیشنهادی دارین؟

sia_2007
چهارشنبه 19 خرداد 1389, 21:21 عصر
:افسرده:
موقعی که سمت راست رو مثلا نگه میداریم؛ نرمال حرکت میکنه
اما اگه دکمه آتش رو بزنیم؛ کلید راست رو باید از نو فشار بدیم

hossein_ignore
چهارشنبه 19 خرداد 1389, 21:31 عصر
مرسی از انتقادت. پیشنهادی نداری واسه حل این مشکل؟

sia_2007
چهارشنبه 19 خرداد 1389, 22:10 عصر
نباد زیاد سخت باشه
شاید رویدادهات رو بد انتخاب کردی
در واقع مشکل نیست
یه اشتباه سادست.

hossein_ignore
پنج شنبه 20 خرداد 1389, 20:12 عصر
کسی نمیدونه مشکل از کجاس؟؟! :ناراحت:
اگه با BackgroundWorker قسمت Firing رو بنویسم مشکل حل نمیشه؟ اگه میشه یکی لطف کنه بگه چجوری میتونم از تایمر تو BackgroundWorker استفاده کنم؟

sia_2007
پنج شنبه 20 خرداد 1389, 21:31 عصر
:افسرده:
ببین میتونی یه متغییر Boolean بذاری
تو Down ؛ متغییر True میشه.
نو Up ؛ متغییر False میشه.
و تا زمانی که متغییر True است؛ حرکت در جهت آخرین دکمه ادامه میابد.
شاید Performance برنامت هم بیشتر بشه.

hossein_ignore
جمعه 21 خرداد 1389, 12:56 عصر
خب کجای برنامه بنویسم تا زمانی که متغییر True است؛ حرکت در جهت آخرین دکمه ادامه میابد؟ تایمر بذارم؟

navidkhalilian
شنبه 29 خرداد 1389, 00:56 صبح
سلام اصلاً خوب نیست.اینو نگفتم که فکر کنی پر مدعا هستم گفتم که تمرکزت را بیشتر کنی.حرکت هواپیما خیلی بده چون از thread ها استفاده نکردی.باید یک thread بسازی که اگر بهش مثلا ورودی right دادی به سمت راست هواپیما را هدایت کنه و اگر left دادی برعکس و thread را موقع شروع بازی start کنی.اینطوری دیگه هواپیما تکه تکه حرکت نمی کنه و cpu usage هم تقریبا 0 میشه. و مشکلی هم که دوست خوبمون گفتند در رابطه با اینکه وقطی شلیک می کنی دیگه هواپیما حرکت نمی کنه و باید دوباره کلید جهت را فشار بدی حل میشه.به طور کلی استفاده از timer یعنی از اول اشتباه کردن.امید وارم از این پست من دوستانه برداشت کرده باشید.


دوستان به خدا اینکه بی دلیل کسی رو تشویق کنیم باعث بیشرفتش نمیشه بیایید سعی کنیم به جای تشویق بی جا به دوستانمون کمک کنیم و مشکلات کد نویسی شون رو حل کنیم.ممنون



I feared failure until I realized that I only fail when I don't try.



از شكست مي ترسيدم اما سر انجام دريافتم تنها زماني شكستني هستم كه از تلاش دست بر مي دارم.

hossein_ignore
شنبه 29 خرداد 1389, 10:58 صبح
مرسی نوید جان از راهنماییت. منم میخاستم با Thread بنویسم ولی Thread نویسی بلد نیستم! میشه بگی چجوری باید بنویسم؟

L u k e
شنبه 29 خرداد 1389, 12:03 عصر
بازی تونو دانلود کردم روون نیست
خیلی کند حرکت می کنه
ولی ساختن همین هم با توابع .net هنره

hossein_ignore
دوشنبه 31 خرداد 1389, 17:22 عصر
L u K e جان مشکل اصلی من سر همین کندیش بود که خوشبختانه حل شد. وقتی بازی کامل شد میفرستم تا اون موقع نظرتونو بگین

navidkhalilian
دوشنبه 31 خرداد 1389, 22:46 عصر
سلام دوست من.ببین این می تونه در زمینه Thread کمکت کنه؟
http://www.barnamenevis.org/forum/showthread.php?p=975067
من خودم acrobat نداشتم که ببینمش

hossein_ignore
پنج شنبه 03 تیر 1389, 21:32 عصر
نوید جان من این PDF رو خوندم، خیلی مفید بود، مرسی. ولی نتونستم واسه بازیم Thread بنویسم!!

navidkhalilian
جمعه 04 تیر 1389, 17:31 عصر
خوب پس این مطلب رو ببین
برای کار با thread باید از کتابخانه زیر استفاده کنی.

using System.Threading;

حالا یک تابع می نویسی که داخل اون کد هایی را که مثلاً داخل تایمر نوشتی رو می نویسی.
البته باد کد ها را داخل یک حلقه while بزاری که مدام اجرا بشه حالا باید داخل حلقه while اولین خط برنامه این باشه thread.sleep(time) که این Time همون مقدار Interval تایمر هست.
و حالا به جای اینکه بگی timer1.enable=true; می نویسی
Thread MyThread = new Thread(new ThreadStart (MyCallbackFunction));

MyThread.Start();


MyCallbackFunction نام هون تابع هست.کد ها رو برات ضمیمه می کنم

hossein_ignore
جمعه 04 تیر 1389, 18:57 عصر
خب اینجا یه مشکلی هست! اینکه نمی شه از Control ای که تو Thread اصلی برنامه ساخته شده تو این Thread استفاده کنم! Error میده:

Cross-thread operation not valid: Control '' accessed from a thread other than the thread it was created on.

hossein_ignore
جمعه 04 تیر 1389, 19:18 عصر
خوشبختانه این مشکل هم حل شد! باید تو سازنده این کد رو بنویسیم :



Control.CheckForIllegalCrossThreadCalls = false;

navidkhalilian
جمعه 04 تیر 1389, 21:39 عصر
هر موقع از کنترل می داخل thread استفاده کنی باید از deligate ها استفاده کنی.خوب حالا بالاخره از thread ها استفاده کردی؟ یا اصلاً تونستی مفهوم thread را بفهمی؟

hossein_ignore
شنبه 05 تیر 1389, 12:29 عصر
مفهوم Thread رو میدونستم، نمیدونستم چجوری باید Thread نویسی کنم! الان چیزای ابتداییه Thread نویسیو با کمک شما یاد گرفتم! مرسی!

آره. حرکت Weapon رو با Thread نوشتم، Reload هم همینطور.

hossein_ignore
شنبه 05 تیر 1389, 12:29 عصر
راستی اینو یادم رفت بگم! Deligate چیه؟

navidkhalilian
یک شنبه 06 تیر 1389, 23:16 عصر
فلسفه وجودی Delegate
بطور معمول وقتی شما یک فرمول ریاضی دارید ، می توانید از راه های مختلف آن را حل کنید و یا اینکه با گذاشتن مقادیر مختلف در یک فرمول خاص همیشه به یک جواب برسید . در حالت اول وقتی برای یک فرمول راه حل های مختلفی وجود دارد و یا اینکه پاسخ یک فرمول فقط و تنها فقط در این حالت خاص از یک روش خاص محاسبه می شود نیاز است تا کاربر روش خاص را مشخص کند و پس از تعیین ورودی های فرمول اعداد را جایگزین کرده و فرمول را با مشخصات آن حل کند ، به زبان ساده تر می توان گفت وقتی که بخواهیم روش انجام یک فرآیند را که در یک چارچوب مشخص انجام می شود ، کاربر تعیین کند ، باید به فرآیند مان که یک روال مشخص دارد یک زیرروال اضافه کنیم که آن زیرروال را کاربر تعیین کرده ، تا نه فرآیند به مشکل بخورد و نه درخواست کاربر نادیده گرفته شود . برای حل این مشکل در دنیای برنامه نویسی Delegate ها بوجود آمدند . Delegate چیست ؟
ِDelegate درواقع یک متد است که مانند یک نوع داده ( مثل int ) برای ارسال به متدهای مختلف استفاده می شود .
دلیگیت ها از خودشان چیزی ندارند و هر جای پروژه که تعریف بشوند در تمامی پروژه قابل مشاهده هستند . هر کسی می تواند مقدار دلخواهش را برای دلیگیت بفرستد . ( به مطالب پایین دقت کنید )
چگونگی ایجاد یک Delegate
برای ایجاد یک Delegate ابتدا باید نام و مقدار باز گشتی Delegate را مشخص کنید . این کار باید در سطح کلاس انجام شود به این معنی که شما نمی توانید یک Delegate را در داخل یک کلاس تعریف کنید و باید آن را خارج از کلاس و در سطحی برابر با سطح کلاس اقدام به ایجاد آنها کنید . برای مثال :
پس از اینکه نام دلیگیت ، ورودی ها و خروجی آن را مشخص کردید باید دلیگیت را به عنوان ورودی به متد دلخواهتان بفرستید برای این کار باید مثل یک پارامتر ساده ، دلیگیت را صدا کنید ، مثلا اگر برای گرفتن یک پارامتر عددی می نویسید int i برای گرفتن دلیگیت باید نام دلیگیت و اسمی که می خواهید در متد از آن استفاده کنید را مشخص کنید برای مثال
namespace Calculator
{
delegate int operation(int a, int b);
class calc
{
int oper(int i , int j , operation o)
{
int z = 0;
return z = o(i, j);
}
}
}
در متد Oper بالا دو ورودی i و j و نیز یک دلیگیت از نوع Operation که بالاتر تعریف کردیم با نام O از ورودی دریافت شده است پس از ، در داخل متد Oper یک متغیر با نام Z تعریف کردیم و بعد از آن مقدار برگشتی تابع دلیگیت را که بالاتر از نوع int ( نوع برگشتی ) تعریف کردیم داخل Z ریختیم . و برای دو پارامتر ورودی که دلیگیت ما می گرفت ، دو متغیر i و j را که از ورودی گرفته بودیم به O فرستادیم . تا اینجا هیچ چیزی مشکل ندارد بجز اینکه وقتی به دستور O می رسیم چه اتفاقی خواهد افتاد ؟ بجای O چه چیزی اجرا خواهد شد ؟ برای پاسخ به این سوال کمی صبر کنید .
فرض کنید که در برنامه تان متدهای بسیار زیادی دارید که دو ورودی int از کاربر دریافت می کنند و یک خروجی int تولید می کنند مثلا متدهای زیر را در نظر بگیرید .
int doSum(int i, int j)
{
return i + j;
}
public int dosub(int i, int j)

{
return i – j;
}
public int doMul(int i, int j)

{
return i * j;

}
public int doDiv(int i, int j)

{
return i / j;
}
متدهای بالا می توانند در هر کلاسی باشند هم در کلاسی که متد Oper تعریف شده و هم در کلاسی که بعدا متد Oper را صدا می کنیم و یا در کلاس دیگری که در جایی که کلاس Oper ایجاد شده (new) آن کلاس هم new شده .
اما اتفاقی که هنگام رسیدن به دستور O خواهد افتاد . فرض کنید در کلاس x کلاس calc که متد Oper در آن قرار دارد new شده است . و می خواهیم در کلاس x از متد Oper استفاده کنیم . برای این کار باید به روش زیر عمل کنیم .
C = new calc ();
int a= 8,b=9;
C.oper(a, b, anotherClassInstanceContainSumMethod.doSum);
همانطور که ملاحظه می کنید دو متغیر a و b که بالاتر مقداردهی شده اند به متد Oper فرستاده شدند و برای اجرای دستور O که بالاتر سوال آن مطرح شد , در این حالت دستور doSum درنظر گرفته شد که در کلاس دیگری قرار دارد که متدهایی در آن وجود دارد . توجه کنید که همین مقادیر a و b برا اجرا به متد doSum که در کلاس Oper با نام O شناخته می شد ارسال خواهند شد . شما هنگام مقداردهی به متد می توانید از هر متد دیگری که delegate شما را ( از نوع ورودی و نوع خروجی ) پشتیبانی می کند ، استفاده کنید .
گرچه مثالی که زده شد مثال خیلی سطح پایینی است و اصولا از دلیگیت ها اصلا در این موارد استفاده نمی شود اما به شما کمک می کند که درک صحیحی از نحوه پیاده سازی Delegate ها پیدا کنید .



امید وارم که خوب متوجه بشی.

hossein_ignore
پنج شنبه 10 تیر 1389, 11:23 صبح
مرسی نوید جان! Example رو متوجه شدم ولی اینی که همینجا نوشتیو زیاد نفهمیدم! حالا واسه Control چجوری باید از Delegate استفاده کنم؟

exlord
پنج شنبه 10 تیر 1389, 18:24 عصر
اینو تا اینجاش داشته باش بقیشم میام برات ...

hossein_ignore
جمعه 11 تیر 1389, 22:16 عصر
دمت گرم exLord ولی مثل اینکه با 2010 نوشتی! من 2008 دارم

exlord
شنبه 12 تیر 1389, 08:58 صبح
دمت گرم exLord ولی مثل اینکه با 2010 نوشتی! من 2008 دارم
اره 2010 ... فایهاشو بردار به پروژه خودت اضافه کن .......

navidkhalilian
سه شنبه 15 تیر 1389, 16:54 عصر
من فکر کنم اگه به شما بگن یه بازی مثل GTA 6 بساز ،برای اجرای بازی به سرور ناسا نیاز داری.اینونگاه کن ببین CPU بالای 1% نمیره.و شماhossein_ignore (http://www.barnamenevis.org/forum/member.php?u=141874) سعی کن فرق بین این پروژه و پروژه exlord را متوجه بشی.