المنهجية
كيف نبني كل إحصائية تراها
يجمع BrawlVision بين واجهة Supercell الرسمية وطبقة أخذ عينات لاعبين PRO خاصة بنا وعدة خطوات تنعيم إحصائية لتقديم أرقام مستقرة وقابلة للمقارنة وصادقة بشأن عدم اليقين الخاص بها. توثق هذه الصفحة كل خطوة بالصيغ الدقيقة وتواترات التحديث.
آخر تحديث: 2026-04-30
مصادر البيانات
كل ما نعرضه يأتي من ثلاثة مصادر نحافظ عليها قابلة للتدقيق: واجهة Supercell العامة (developer.brawlstars.com)، شبكة Brawlify CDN (cdn.brawlify.com)، وقاعدة بياناتنا الخاصة في Supabase التي تحفظ المعارك والمجاميع التي لا تكشفها الواجهة الرسمية بعد آخر 25 مباراة لكل لاعب.
واجهة Supercell هي المصدر الأساسي للبيانات البنيوية — الأبطال، الجادجت، الستار باور، الهايبرتشارج، الجير ودوران الأحداث — لكنها تترك حقولاً حرجة مثل صور الأبطال والندرة والوصف الطويل. نقاطع هذه الحقول مع Brawlify CDN الذي يعمل مستقلاً ويتأخر أحياناً يوماً إلى ثلاثة عن Supercell. عند اكتشاف بطل جديد في الواجهة الرسمية لا يوجد بعد في Brawlify، نحتفظ بخريطة ندرة محلية (BRAWLER_RARITY_MAP) لتعرض صفحة البطل بشكل صحيح يوم الإطلاق.
تخزن قاعدتنا فئتين من الصفوف في meta_stats: source=user (معارك حقيقية لمستخدمي Premium الذين فعّلوا المزامنة) و source=global (أخذ عينات تلقائي من أفضل تصنيفات PRO). كل إحصائية عامة في الموقع محسوبة بفلتر source=global حتى لا تتسرب بيانات شخصية لأي مستخدم إلى الصفحات العامة.
كيف نبني بيانات PRO
طبقة "PRO" في BrawlVision هي مجاميع محسوبة على معارك حديثة لأفضل لاعبي العالم. كل ست ساعات تستعلم مهمة cron (meta-poll) عن تصنيفات Supercell الرسمية لإحدى عشرة دولة — التي تتركز فيها النشاط التنافسي — وتبني تجمعاً غير مكرر يضم نحو 2,100 لاعب فريد من أعلى 200 لكل دولة.
فوق هذا التجمع نطبق مأخوذ عينات احتمالي لمنع تركيبات (الخريطة، الوضع) الشائعة من الهيمنة على البيانات وإخفاء النادرة. احتمال قبول معركة فردية هو p = min(1, (minLive + 1) / (current + 1))، حيث minLive هو عدد التركيبة الأقل تمثيلاً و current عدد تركيبة المعركة المرشحة. التركيبات قليلة العينات تأخذ وزناً أكبر، والمشبعة تتوقف عن النمو.
يتكرر cron حتى META_POLL_MAX_DEPTH = 1,000 لاعب لكل تشغيل بميزانية مرنة 270 ثانية ليبقى ضمن maxDuration 300 ثانية لوظيفة serverless. تتضمن كل استجابة كتلة تشخيص "adaptive" مع عدد التكرارات واللاعبين المستعلَمين والعدّ لكل وضع، ليبقى أي سلوك غير طبيعي للسامبلر قابلاً للملاحظة في الإنتاج.
نسبة الفوز البايزية
نسبة الفوز الساذجة (الانتصارات / المباريات) مضللة في العينات الصغيرة: بطل 3-0 في خريطة جديدة يعرض "100% WR" دون أن يعني ذلك شيئاً. يستخدم BrawlVision التنعيم البايزي للتصحيح وإرجاع رقم قابل للمقارنة بين أبطال بأحجام عينات مختلفة جداً.
الصيغة هي WR_bayesian = (wins + α) / (battles + α + β)، حيث α و β معاملان فائقان يشفران اعتقاداً سابقاً متمركزاً عند 50% WR. عملياً α = β = 25، أي "افترض 50 معركة سابقة 50/50 قبل رؤية البيانات الفعلية". بطل ب3 انتصارات و0 خسائر ينتقل من 100% ساذج إلى (3 + 25) / (3 + 50) = 52.8%، أكثر تمثيلاً للحالة الفعلية لأخذ العينات.
مع نمو العينة يهبط وزن السابق: عند 1,000 معركة و530 انتصار يصبح WR البايزي (530 + 25) / (1,000 + 50) = 52.9%، يكاد يطابق الساذج 53.0%. التنعيم "يؤلم" فقط عندما تكون العينة صغيرة فعلاً. هذه هي الخاصية المرغوبة بالضبط: عاقب الضوضاء، لا الإشارة.
Comfort Score
Comfort Score هو مقياس BrawlVision الداخلي للإجابة على سؤال "مع أي بطل تلعب فعلاً أفضل من المتوسط؟". ليس نسبة فوز خام: يجمع ثلاثة مكونات بأوزان 60/30/10 لتغطية أبعاد مختلفة من الأداء الشخصي.
المكون الرئيسي (60%) هو WR اللاعب مع ذلك البطل، منعّماً بايزياً مثل الميتا العالمية، لئلا يهيمن بطل قليل اللعب على التصنيف. المكون الأوسط (30%) هو الفرق بين هذا WR الشخصي و WR ميتا البطل عموماً: لاعب بنسبة 55% على SHELLY بينما الميتا العالمية 48% يحصل على comfort أكبر من لاعب بنسبة 55% على بطل ميتاه 53% لأن الارتفاع النسبي أكبر.
المكون الأخير (10%) هو تردد الاستخدام المعياري: مع تساوي الباقي، لعب بطل 100 مرة يحسب أكثر من 10 لأن الاتساق يكافأ. الصيغ الدقيقة والأوزان تعيش في src/lib/analytics/compute.ts وتُطبق بشكل متطابق عند كل استدعاء للنقطة الطرفية لتكون النتيجة قابلة للتكرار.
الاتجاهات لـ7 أيام
لكل بطل عام مؤشر اتجاه "+X.Y%" أو "−X.Y%" يقيس تغيّر WR ميتاه في آخر 7 أيام مقارنة ب7 السابقة (نافذة كلية 14 يوماً). الحساب يجري على source=global بحد أدنى MIN_BATTLES_PER_TREND_WINDOW = 3 معارك في كل نصف من النافذة — إذا لم يبلغ أحد النصفين الحد، نُعيد null وتخفي الواجهة السهم بدلاً من اختلاق رقم بإشارة ضعيفة.
يُحسب الاتجاه مسبقاً كل ست ساعات في جدول صغير (public.brawler_trends، صف لكل بطل) عبر مهمة pg_cron. القيام بذلك في قاعدة البيانات بدلاً من استجابة النقطة الطرفية يتجنب مسح عشرات الآلاف من صفوف شريحة 14 يوماً مع كل تحديث ISR. إذا كان الجدول المسبق التحضير أقدم من 12 ساعة أو فارغاً، تسقط النقطة الطرفية إلى مسار inline مرقّم على meta_stats يعيد نفس الاستجابة بكلفة أعلى. الترقيم ضروري لأن PostgREST يقطع بصمت الاستعلامات غير المرقّمة عند 1,000 صف، ما جعل غالبية الأبطال يُعيدون null لخطأ في تقدير العينة.
المنطق مكرر بقصد: نسخة TypeScript في src/lib/brawler-detail/trend.ts (مسار التفصيل) ونسخة SQL في supabase/migrations/022_*.sql (مسار الكميّ). تستخدم كلتاهما نفس العتبة ونفس النافذة ونفس فلتر source=global. إن تباعدتا، ستعرض صفحة البطل الفردية وصفحة المجمّع أرقاماً مختلفة لنفس البطل، لذلك يُطبق أي تغيير في كليهما.
تواتر التحديث
وتيرة تحديث البيانات تؤثر في كيفية تفسيرها، لذا نوثقها بشكل صريح. الصفحات الثابتة (بما فيها هذه) تستخدم ISR (التجديد التدريجي الثابت) بإعادة تحقق كل 24 ساعة. الصفحات ذات البيانات الديناميكية تخزن استجابة الواجهة حتى تبطلها المهمة المعنية.
الأبطال والجادجت والستار باور تتزامن من واجهة Supercell بمخبأ خادم 24 ساعة. يعمل meta-poll (بيانات PRO) كل 6 ساعات وينتج صفوف meta_stats جديدة. الحساب المسبق لاتجاهات 7 أيام يعمل في pg_cron على "17 */6 * * *" (الدقيقة 17 من كل ست ساعات) لتفادي الاصطدام مع meta-poll. دوران أحداث اللعبة يتجدد كل 30 دقيقة.
تنزل المعارك الفردية لمستخدمي Premium الذين فعّلوا المزامنة فور كل مباراة في نافذة متحركة عبر cron المزامنة. بمجرد دخولها قاعدتنا، تغذي meta_stats بـ source=user وتشكل أساس التحليلات الخاصة في قسم الملف الشخصي؛ لا تظهر أبداً في المجاميع العامة ولا تختلط أبداً مع source=global.
الأسئلة الشائعة
لماذا نسبة فوز بطل بعينة صغيرة ليست 0% أو 100%؟+
لأننا نطبق التنعيم البايزي بسابق متمركز عند 50%. مع قليل من المباريات يظل الرقم المعروض قرب 50%؛ مع نمو العينة يقترب من نسبة الفوز الفعلية. هذا متعمد: 100% على 3 مباريات ليست معلومة، بل ضوضاء.
هل تستخدم الصفحات العامة بيانات مستخدمين حقيقيين؟+
لا. كل مجمع عام يفلتر بـ source=global الذي لا يضم سوى معارك من أخذ عينات تلقائي لتصنيفات PRO. المعارك الخاصة لمستخدمي Premium تُحفظ بـ source=user ولا تنتقل أبداً إلى الصفحات العامة.
ماذا يحدث عند إصدار Supercell بطلاً جديداً؟+
قائمة الأبطال تأتي من الواجهة الرسمية، لذا يظهر الروستر الكامل في الموقع نفس يوم الإطلاق. الندرة والصور تأتي من Brawlify الذي قد يتأخر يوماً إلى ثلاثة؛ نحتفظ بخريطة ندرة محلية (BRAWLER_RARITY_MAP) كـ fallback لتلك الأيام الأولى.
لماذا تُظهر بعض الاتجاهات شرطة بدلاً من نسبة مئوية؟+
نعرض الاتجاه فقط إذا كان كل نصف من نافذة 14 يوماً يحتوي على 3 معارك على الأقل في source=global. عندما يكون البطل قليل الظهور، نفضّل عدم إظهار شيء بدلاً من رقم بإشارة ضعيفة.
هل يستخدم الموقع الذكاء الاصطناعي لتوليد الأوصاف؟+
تُولّد الأوصاف ديناميكياً من بياناتنا (أفضل خريطة، أفضل وضع، WR بايزي لكل بطل). لا ننسخ نصوصاً من Brawlify أو الويكي، ولا نستخدم نماذج لغوية لتضخيم المحتوى.
أسئلة أو تصحيحات؟
إن لاحظت خطأ منهجياً أو تريد اقتراح تحسين، تواصل معنا. نُحدّث هذه الصفحة مع كل تغيير ذي صلة في طريقة احتساب البيانات.
