كان لدي "فكرة" لجعل الحد الأقصى لعدد تتريس تشغيل في وقت واحد لتظليل واحد (نسيج framebuffer واحد).
فيما يلي وصف موجز لكيفية عمل التعليمات البرمجية الناتجة.
ما هذا؟
تعمل كل لعبة تتريس بثلاث وحدات بكسل ، بدقة 1920x1080
يمكنك تشغيل 619200
نسخة في وقت واحد. قدم أيضا روبوت بسيط للعب التلقائي.
في نهاية رابط آخر لتشغيل والمصدر.
تحديث الفيديو ، ويبين عدد الحقول المتبقية ، وتصل إلى الصفر.
تخزين البيانات
جدول تتريس من الحجم [10, 22]
(10 عرض ، 22 ارتفاع).
يمكن أن تكون كل خلية فارغة أو غير فارغة.
ما مجموعه 22 * 10 = 220
بت مطلوب لتخزين الجدول بأكمله.
واحد "بكسل" هو أربعة تعويم 24 بت ، 96 بت لكل بكسل.
مرئيًا (قطعة من إطار تصحيح الأخطاء) ، يتم تمييز ثلاثة بكسلات باللون الأحمر ، هذا حقل محفوظ واحد:

2 * 96 + 24 + 4
بكسل اثنين ، تعويم واحد من بكسل الثالث ، 4 بتات من تعويم الثاني من بكسل الثالث
هناك نوعان من العوامات غير المستخدمة في البكسل الثالث pixel3.zw ، وهما يقومان بتخزين حالة المنطق بدقة أكبر
- ض يخزن ثلاثة أرقام ثمانية بت
[a,b,c]
- موضع الكتلة الحالية ، كمعرف الموضع في المصفوفة (صفيف بحجم 220 بت ، الحد الأقصى للموضع هو 220 وهو أقل من 0xff)
- ب الوقت حتى يسقط التلقائي (الموقت) كل إطار -1
لهذا الرقم ، لأنه أصبح 0 ثم يسقط على كتلة أسفل
- ج معرف كتلة الحالية - w أيضًا
[a,b,c]
، ولكن أيضًا علامة (إيجابية أو سلبية) للعوم بأكمله هي علامة نهاية اللعبة في الجدول الحالي (حتى لا تهدر الموارد إذا غلب الحقل)
- إجراء ، بلا إجراء (0) ، يسار (1) ، يمين (2) ، وهكذا ، الكود الكامل في عام ، الإجراءات لها حالتان ، تحقق من اليسار وتحقق مما إذا كان من الممكن التحرك إلى اليسار ، ثم يتم تعيين الإجراء إلى اليسار .
- [b,c]
0xffff (16 بت) نقاط من الجدول الحالي ، وعدد الأسطر التي تم حرقها
هناك 20
تركت غير مستخدمة في التعويم الثاني للبكسل الثالث.
إطار التصحيح الذي يوضح أن منطق الحفظ يعمل بشكل صحيح
يوجد على اليسار حقل أبيض بثلاثة بيكسلات ، تم تعيينه خصيصًا لإظهار أن الفجوات تتم معالجتها بشكل صحيح (إذا لم تكن الدقة متعددة من ثلاثة ، فسيذهب الشريط بزاوية)
شرط على الخط 75 العازلة أ

لماذا أحتاج إلى معرفات الإجراء:
- يتم تخزين البيانات بثلاثة بيكسلات ، ومن المستحيل التحقق من المنطق في وقت واحد وتغيير البيانات في إطار واحد (بدون تنفيذ كل المنطق وتحميل الخريطة بالكامل في كل بكسل ، سيزيد التحميل عشرات المرات).
- لذلك ، يعمل منطق تخزين البيانات في كل بكسل وينفذ الأوامر المستلمة إلى اليسار ، يتم تنفيذ أوامر التحقق left_ check فقط بوحدة بكسل واحدة (الثالثة).
مكان بطيء
- يقوم كل بكسل ثالث (بكسل منطقي) بإلغاء ضغط الخريطة بالكامل (قراءة جميع وحدات البكسل الثلاثة).
- يزيل الضغطان المتبقيان من وحدات البكسل فقط "أنفسهم" (بكسل واحد) لتنفيذ الإجراء المحفوظ.
- أثناء العمل ، يتم حرق الخط ، يتم تحميل بكسل آخر ، نظرًا لأن الجدول يسقط للأسفل ويجب أن تعرف الأجزاء السفلية من الجدول ما هو موجود في الأعلى.
خوارزمية التخزين الأداء
للاختبار ، اضبط #define debug على Common و AI 0 هناك أيضًا.
حصلت على هذه النتيجة - 10FPS عند تقديم ومعالجة جميع الحقول 619200 ،
على 120 ألف حقل (25 إطارًا في الثانية)

بوت بوت
المنطق سيء للغاية ، الروبوت يحترق في دقيقة واحدة ، ويحصل على 60 نقطة.
لم أتمكن من بدء منطق جيد مع العديد من الدورات التي تقوم بفحص الثقوب والحواف والحقول القابلة للاحتراق ، مع الأخذ في الاعتبار أن أفضل وضع قائم على جميع حالات السقوط الممكنة ...
عملت المنطق الجيد بالنسبة لي حتى 100 نسخة وأعطى تأخرًا قويًا عند تجاوز جميع الدورات.
منطق بوت يعمل مثل هذا
كل المنطق في الوظيفة AI_pos_gen في المخزن المؤقت A ، هناك عشرة سطور منه.
الكود الكاذب:
ارتفاع التحقق لتثبيت الكتلة يساوي الحد الأقصى للحقل في العمود الحالي (حدد سطر واحد للارتفاع)
(4 ){ ( (10)){ ( ){ ( , ) best ID() best POS } } } ( ) ( ) 0 1
اتضح ثلاث دورات شائعة - وضعوا الكتلة بحيث يكون الحد الأدنى هو الحد الأدنى.
يتم استدعاء وظيفة AI_pos_gen عند ظهور كتلة جديدة ، وإرجاع موضع السقوط من الأعلى ، مع أخذ معرّف الكتلة وجعلها تدور ، تعمل الوظيفة في البيكسل الثالث (المنطق) ، أي أنها تحتوي على خريطة محملة بالكامل (صفيف خريطة).
يمكنك بسهولة محاولة كتابة روبوتك إذا كنت ترغب في ذلك.
أبطأ مكان
إضافة حلقة واحدة فقط لاختبار الثقوب ، تعطل برنامج تشغيل بطاقة الفيديو الخاص بي عندما كان عدد الروبوتات أكثر من 10 آلاف ... الروبوت الذي كتبته هو الإصدار الأكثر "الحد الأدنى" للروبوت الذي يمكنني فعله ، وهو أمر سيء للغاية لسوء الحظ.
واجهة المستخدم / التقديم
جميع التقديم في صورة ، منطق واجهة المستخدم في المخزن المؤقت B.
التقديم:
تقسيم الشاشة إلى بلاط ورسم جدول في كل بلاطة ، والحد الأدنى للحمل.
منطق تحميل الخريطة - لم يتم تفريغ كل بكسل ، وتفريغ كل بكسل ، وفقط "البت المطلوب" (حرفيًا) ، رمز الوظيفة هو:
int maptmp(int id, int midg) { int nBits = 8; ivec4 pixeldata = loadat(id, midg); int itt = (id / 24) / 4; //data pixel id 0-2 int jtt = (id - itt * 24 * 4) / 24; //component in data pizel id 0-3 int ott = (id - itt * 24 * 4 - jtt * 24) / 8; //component in unpacked value 0-2 int ttt = (id - itt * 24 * 4 - jtt * 24 - ott * 8); //bit after int2bit 0-7 ivec3 val = decodeval16(pixeldata[jtt]); int n = val[ott]; for (int i = 0; i < nBits; ++i, n /= 2) { if (i == ttt) { if ((n % 2) == 0)return 0; else return 1; //switch + return does not work on windows(Angle) /*switch (n % 2) { case 0:return 0;break; case 1:return 1;break; }*/ } } return 0; }
لتجنب البيكسل عند التمرير ، بدءًا من 43000 ، يتم فقد الجزء الكسري من العائمة ، ولا يعمل لإضافة 619 ألفًا إلى الأشعة فوق البنفسجية للتمرير (سيكون هناك بكسل بدلاً من الجداول).
ينقسم كل التمرير إلى بلاطة واحدة كبيرة وتدور في دائرة تضيف ما يصل إلى 32 للأشعة فوق البنفسجية. (السطر 207 في الصورة ).
يتم نفس الشيء لتحديد معرف الحقل. (السطر 215 في الصورة )
واجهة المستخدم
الأرقام:
الأصفر هو عدد حقول تتريس.
اليسار كبير - رقم الحقل الحالي.
في أسفل اليمين - نقاط الحقل الحالي.
المصدر وإطلاق
Bufer منطق ، Bufer B هو تحكم UI ، مما يجعل الصورة
المصدر على https://www.shadertoy.com/view/3dlSzs (وقت التجميع خلال الزاوية 16 ثانية)
تم تعطيل الروبوت هناك (يمكنك تمكينه) ، وجميع الحقول قابلة للعب من لوحة المفاتيح.
السيطرة على اليسار / اليمين / أعلى / أسفل الأسهم.
إعادة تعيين المستطيل الأحمر لواجهة المستخدم ، حرك (اسحب الماوس بالنقر فوق LMB) وانقر فوق الحقول للتمرير أو تحديد الحقل المراد عرضه.
الانطلاق من متصفح الويب:
- قم بتشغيل chrome مع chrome.exe --use-angle = gl
- اتبع الرابط إلى shadertoy
- في المحرر على الموقع ، حدد عام وحذف # حدد no_AI
- (أيضًا في عام) حدد #define AI 199 إلى 0 ، بمعنى #define AI 0
- انقر فوق زر التحويل البرمجي (أسفل نافذة المحرر في التظليل) وانقر فوق ملء الشاشة
الخيار الثاني هو تشغيل التظليل في أي "قاذفة تظليل" ، هنا هو الرابط إلى الأرشيف ( تنزيل ) الذي به ملف * .exe مع هذا التظليل.
OpenGL وقت التجميع حوالي 10 ثانية.
تحديث : إضافة تظليل مع فحص حفرة https://www.shadertoy.com/view/wsXXzH
بدلا من الشرط للحصول على وضع أفضل في نفس الارتفاع. check_block_at_wh
وظيفة check_block_at_wh
(السطر 380 BufA) إلى الثقوب جنبًا إلى جنب مع التحقق من صلاحية الموضع ، ولم تتم إضافة دورات جديدة ، وسطر الحالة من 442 إلى 459 BufA.
كما أنها تحترق بسرعة في غضون 30 إلى 60 نقطة (من الواضح أنك تحتاج إلى التحقق من مساحة كبيرة للثقوب ، لكن هذا يعطي فرامل قوية)
وصورتان تشرحان العمل قليلاً:
اختيار الوظيفة https://i.imgur.com/e0uENgV.png
موضع الحظر للشرط هو https://i.imgur.com/ORECXUW.png