الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

طريقة كسولة في برمجة متغيرات لعبة

مغلق
بدأه عربي عربي في 28 يونيو 2007 · 7 رد · 1,078 مشاهدة · في قسم برمجة الألعاب و الرسوميات العام
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

الكسل نعمة..

نعم، إنه نعمة، ولهذا سنستفيد منه في البرمجة، وسنسمي هذه الطريقة بـ "تقنية الكسل".

تخيل أنك تصمم لعبة تشبه نوعا ما لعبة Sims ولديك في هذه العبة أكثر من عشرين شخصية متواجدة في نفس المكان، ولهذه الشخصيات نفس قدرات شخصيات Sims إن لم يكن أكثر..

بالطبع ستقوم بتحديث كل متغيرات اللعبة ضمن دورتها الأساسية Main Loop وستجد نفسك تحدث الخصائص الفيزيائية للأشخاص (ناهيك عن الأغراض الموجودة في المكان) وتفاعلات عقل كل شخصية والتحقق من شروط وأحداث اللعبة وتحديث مواقع الأشخاص وحالتهم البيولوجية والنفسية (الجوع، العطش، الملل، التقدم في السن...) والرسوميات والصوت وغيره متمنيا بعد كل ذلك أن يكون أداء اللعبة سريعا..

ولكن جزء من سرعة الأداء لا يقع على مواصفات الجهاز، بل عليك أنت كمبرمج، أنت تقوم بالكثير من الجهد فقط من أجل التأكد من سرعة أداء اللعبة.

سأناقش هتا إحدى هذه التقنيات وهي غاية في البساطةـ وهي كما سميناها "تقنية الكسل".

أولا، علينا تحديد بعض العلميات التي لن يلاحظ اللاعب فيها أي بطئ في تنفيذها، وذلك لأنها هي أساسا بطيئة أو لأن أثرها غير مباشر، لنأخذ على سبيل المثال، جوع أحد الشخصيات في اللعبة، من المنطقي في هذه الألعاب أن الشخصية لن تجوع فجأة، ولن تموت فجأة إذا جاعت، بل تحدث هذه الأمور بشكل متدرج وغير مرئي، لذا فلا مشكلة إذا أهملنا تحديث الجوع مقابل توفير المعالج للقيام بالحسابات الفيزيائية والتي غالبا لا يتم التساهل بها.

كيف نقوم بهذا؟

أظن أن عنوان الموضوع نفسه قد أوحى لنا بطريقة التنفيذ، على أي حال، لنرى كيف تنفذ..

كما قلنا، نحدد كل المتغيرات الكسولة، وفي مثالنا هذا أجد أن متغيرات الحالة البيولوجية (جوع، عطش، تقدم في السن، نعاس..إلخ) ومتغيرات الحالة النفسية(ملل، رغبة بالحوار، رغبة باللعب..إلخ) هي أنسب ما يكون للمتغيرات الكسولة.

نقوم سلفا بتخزين الشخصيات ضمن سلسلة نسميها مثلا CharacterLazy وعند الدخول كل مرة في دورة اللعبة، نأخذ فقط شخصية واحدة CurrentCharacter من السلسلة ونقوم بتحديث متغيراتها الكسولة.

الكود التالي مجرد توضيح للفكرة لا أكثر

MainLoop(true)
{

	//Do update lazy variables
	If(CurrentCharacter == CharacterLazy.length)
	   {
		CurrentCharacter = 0;	 //Start again from first character
	}
	processLazyVariables(CharacterLazy[CurrentCharacter]); //process the lazy

	CurrentCharacter++;	//Get the next character
	//End of updating lazy variables

		.
		.
		.
		.
		The rest of the code
}

لك أن تلاحظ حجم التوفير في المعالجة، شخصية واحدة كل دورة بدلا من عشرين!! واللاعب نفسه لن يلاحظ شيئا عدا تحسنا في الأداء.

هناك طريقة أخرى لتطبيق كسلنا هذا في البرمجة، وكمثال واضح جدا، في لعبة GTA لاحظ أن أضواء سيارتك المنعكسة على الطريق (بقع الضوء) يتم تحديثها بشكل أسرع من أضواء سيارة أخرى، تقريبا تحتاج السيارات الأخرى إلى ثلاث دورات ليتم تحريك الضوء من مكانه!!

هذه الطريقة تنشئ مؤقت (لا تخافوا هو عداد أكثر من مؤقت) عند وصوله إلى قيمة ما، يقوم بتحديث المتغير، الكود التالي ليوضح الفكرة:

constant NowDoLazyThings = 5;
MainLoop(true)
{
	LazyCounter++; 	 //Always runs from 1 to 5
	If(LazyCounter == NowDoLazyThings)
	{
		LazyCounter = 0;
		processLazyVector(CharacterLazy[]);
	}

		.
		.
		.
		.
		The rest of the code

}

نلاحظ أن هذه الطريقة تنتظر اللحظة المناسبة! لتقوم بتحديث كل المتغيرات الكسولة، وهذا قد يحدث اختناقات دورية(إذا كانت المتغيرات الكسولة كبيرة) تشبه الاختناقات المرورية أول يوم دوام من كل أسبوع، ولكن هذه الطريقة تستخدم في حالات يجب فيها معالجة كل المتغيرات الكسولة دفعة واحدة، مثال ذلك الرسوميات، فلا يعقل رسم عنصر وإهمال آخر.

بالدمج بين هذه الطرق يمكن أن نصل إلى نتائج جيدة، طبعا ليس كل تحسن الأداء هو بواسطة هذه الطرق، فبعض اللعب لا يمكن لها استيعاب هذه الطرق.. ولكن هي إحدى الوسائل.

أرجو أن لا أكون قد أصبتكم بالكسل، وبانتظار أفكاركم وإضافاتكم.

#2

السلام عليكم

شرح رائع أخي

ولكن طرق التسريع كثيرة

وأشهرها أنك تعمل شيء ليغنيك عن شيء آخر

مثلا :في كشف التصادم لشخصية ما لا تبحث تصادمها مع شخصية في آخر اللعبة

أي تعين مسافة منها تبدئ عمليات الكشف عن التصادم

#3

كلامك صحيح، ولكن هنا أحببت الإشارة إلى أحد هذه الأنواع وهو إخراج بعض العمليات من الدوران الدائم في اللوب وتأخيرها.

بالطبع عندما تأتي مرحلة الـ Optimize سيكون من المفيد استخدام كل الطرق المتاحة، وشيء جيد أن نجمع كل ما يخطر في بالنا من أساليب ال optimize ضمن موضوع واحد ليعود إليه المرء ويتذكر ما يمكن فعله من تكتيكات..

ولهذا أدعوك (والجميع) أن تتكلم بشرح وافي للقضية التي ذكرتها أنت، وعلى هذه الصفحة علها تصبح دليلا نافعا.

#4

السلام عليكم

موضوع جميل و افكار اجمل اخوي عربي عربي

كنت قد طبقت فكرة بسيطة وهي تقسيم مساحه اللعبة لمربعات

اولا يوجد في كل تركيب للشخصية متغير رقم المربع

ثم نقوم بالبحث عن الشخصيات الموجودة في المربع الذي توجد به الشخصية ثم ندخل في لوب اكتشاف التصادم

و بذلك اتجنب المرور على كافه الشخصيات الموجودة في المرحله

تحياتي

#5

إلى الكون..

فكرتك جميلة، ولكن حبذا لو أضفت بعض الشرح لتصل الفكرة إلى أكبر عدد ممكن من القراء..

أيضا يمكنك شرح بعض الحالات الهامة لطريقتك، مثلا عندما تكون الشخصية بالقرب من حواف مربع وفي هذه الحالة سيكون محيط الشخصية أو ما يسمى (Bounding Box) يقع ضمن مربعين أو أكثر، كيف تتعامل مع هذه الحالة.، وهل هناك عملبات فرز ديناميكية.

وشكرا.

#6

السلام عليكم

الفكرة تعتمد على عدم اختبار التصادم مع شخصيات بعيدة عن الشخصية الرئيسية

بالنسبة لاشكالية ان تكون احدى الشخصيات في منطقة تتوسط مربعين لم تكن موجودة لان الشخصيات تتحرك داخل المربع فقط بمعنى

ان العملية محسوبة بحيث لا تخرج الشخصية من المربع

كماهو واضح في الصورة

اتمنى نكمل النقاش فهو ممتع بصراحة :)

تحياتي

post-86304-1184259858_thumb.gif

#7

أريد أن أجري استطلاع يتعلق بهذا القسم، وهو مؤلف من سؤالين حاليا، وأتمنى مشاركتكم جميعا:

الاستطلاع:

طبعا أنت مهتم ببرمجة الألعاب والغرافيكس (وإذا كان الجواب لا، فهذا الاستطلاع لا يعني شيئا لك)

1- هل لديك خبرة ببرامج الرسوم ثلالثية الأبعاد؟ (نعم / لا)

2- إذا أجبت بنعم، هل تشعر بأنك تستطيع توصيف المجسمات بصيغة برمجية؟ (نعم / لا)

إذا أجبت بلا، هل تشعر بأنه عليك (بالإضافة للبرمجة) أن تتعلم أحد هذه البرامج؟ (نعم / لا)

#8

حسنا، نقلت الاستطلاع إلى موضوع مستقل.

الرابط:

/index.php?showtopic=133142

الأخ الكون..

بإجابتك أن الشخصيات لا تخرج من المربع (أظن أنها تقفز قفزا من مربع لآخر) قد قطعت علي الطريق لسؤال قديم جديد..

طبعا تستخدم هذه الطريقة حتى بالنسبة للشخصيات التي يمكن لها أن تتقاطع مع أكثر من مربع (أو مكعب في الحالة الفراغية) أيضا يوجد هناك العديد من تقنيات التصفية من أجل تجنب الحسابات غير اللازمة، مثل ال Bsp وال Octa trees وغيرها، وتتفوق كل طريقة بإحدى النواحي، ولكن كنت أود منك أن تتوسع في طريقتك باتجاه الشخصيات المتحركة، حتى لو كان جوابك هو استخدام طريقة أخرى.

هذا الموضوع مغلق.

مواضيع مشابهة