წესები მარტივი იყო. თითოეულ მომხმარებელს შეეძლო აირჩიოს 16 ფერიდან ერთი და დახატა ერთი პიქსელი ტილოზე ნებისმიერ ადგილას. თქვენ შეგეძლოთ იმდენი პიქსელის დახატვა, რამდენიც გინდოდათ და რა ფერებით გინდათ, მაგრამ შემდეგი პიქსელის ხელახლა შეღებვისთვის 5 წუთი უნდა დაელოდოთ.
მართალია, წესებში ნათქვამია: ”სხვებთან კოორდინირებით, თქვენ შეგიძლიათ შექმნათ ბევრად მეტი, ვიდრე მარტო მოქმედება.”
ის, რაც მოხდა მომდევნო 72 საათის განმავლობაში, ორგანიზატორებს შოკში ჩააგდო. ეს გამოჩნდა ცარიელ ტილოზე:
ტილოზე თითოეული პიქსელი ხელით იყო განთავსებული. ყოველი ხატი, ყოველი დროშა, ყოველი მემი მტკივნეულად იყო შექმნილი ასობით ათასი ადამიანის მიერ, რომელთაც არაფერი ჰქონდათ საერთო ერთმანეთთან, გარდა ინტერნეტ კავშირისა. ასე თუ ისე, რაც მოხდა Reddit-ზე, სამართლიანად შეიძლება ჩაითვალოს ხელოვნების დაბადებად.
როგორ მოხდა ეს ყველაფერი
ამის რამდენიმე სიტყვით აღწერა შეუძლებელია. ტილოზე უთვალავი დრამა ხდებოდა – ჩხუბები, ბრძოლები და ომები, ზოგჯერ გაურკვეველი მიზეზების გამო. ისინი ტარდებოდა პატარა ფორუმებზე, პირად ჩატებში, იმდენი იყო და ყველა ერთდროულად მოხდა, ამიტომ ყველაფრის თვალყურის დევნება შეუძლებელი იყო. ზოგადად, ტილო აჩვენა მარადიული ამბავისამი ძალის შესახებ, რომელიც აუცილებელია კაცობრიობის შესაქმნელად.
შემქმნელები
შემქმნელები პირველები მოვიდნენ. ისინი იყვნენ მხატვრები, რომლებისთვისაც ცარიელ ტილოს დაუძლეველი მიმზიდველობა აქვს.
შემქმნელებმა დაიწყეს პიქსელების შეღებვა შემთხვევით, მხოლოდ იმის დასანახად, თუ რისი გაკეთება შეეძლოთ. ამიტომ, პირველი ნახატები უფრო ჰგავდა როკ ხელოვნება- მხატვრები ახლახან იწყებდნენ ფრთების გაშლას.
საკმაოდ სწრაფად მიხვდნენ, რომ მარტო მუშაობით და ყოველ 5-10 წუთში მხოლოდ ერთი პიქსელის განთავსებით, რაიმე მნიშვნელოვანის შექმნა შეუძლებელი იყო. ვიღაც ვალდებულია გააფუჭოს მათი საქმე. რაღაც უფრო დიდის შესაქმნელად, მათ ერთად უნდა იმუშაონ.
შემდეგ კი ვიღაცამ შემოგვთავაზა ბადეზე დახატვა, რომელიც ნათლად აჩვენებდა, თუ სად არის საჭირო შემდეგი პიქსელის დახატვა თანმიმდევრული გამოსახულების შესაქმნელად. ასე გამოჩნდა დიკბატი ტილოს ქვედა მარცხენა ნაწილში - ცნობილი ინტერნეტ მემი, თინეიჯერული იუმორის გრძნობის ნაყოფი. ეს გახდა პირველი ერთობლივი ნამუშევარი.
მაგრამ შემქმნელები აქ არ გაჩერებულან. მათ დაიწყეს Dickbutt-ში სხვადასხვა ელემენტების დამატება, სხვადასხვა ფერებში შეღებვა და მისი გარდაქმნა Dickbutterfly-ადაც კი. ამ სულელური იდეის უკან იყო მინიშნება მოსალოდნელი შემოქმედებითი ცუნამის შესახებ.
თუმცა, ეს მაშინვე არ მომხდარა. შემქმნელები თავიანთი ძალით იყვნენ ნასვამები. Pokemon Charmander გამოჩნდა დიკბატის გვერდით და ფეხის ნაცვლად პენისმა დაიწყო ზრდა, შემდეგ კი კიდევ ორი.
ეს უკვე დიზაინი აღარ იყო. ზოგიერთი შემქმნელი სასოწარკვეთილად ცდილობდა პროვოკაციული დამატებების ამოღებას და მოუწოდებდა "სუფთა" ხელოვნებას, მაგრამ სხვებმა განაგრძეს საკუთარი. მაგრამ იქ არ იყო.
გაირკვა, რომ ზედმეტი თავისუფლება იწვევს ქაოსს. შემოქმედებას ისევე სჭირდება შეზღუდვები, როგორც თავისუფლებას. როდესაც ვინმეს შეუძლია ნებისმიერი პიქსელის დაყენება სადმე, როგორ არ შეიძლება ამან გამოიწვიოს არეულობა?
მცველები
ეს პრობლემა ძალიან სწრაფად გადაჭრა სხვა ტიპის მომხმარებელმა - მეურვეებმა. ისინი მოვიდნენ ერთი მიზნით - დაეპყროთ მთელი მსოფლიო.
შექმნეს ფრაქციები ფერის მიხედვით, მათ დაიწყეს სივრცის დაპყრობა, გარკვეული ფერით შეღებვა. ერთ-ერთი პირველი და უდიდესი ფრაქცია იყო ფრაქცია Blue Corner. ქვედა მარჯვენა კუთხეში გამოჩენის შემდეგ ჭირივით გავრცელდა. მისი მიმდევრები აცხადებდნენ, რომ ამ გზით მათ უნდა დაფარონ ტილოს მთელი სივრცე. პიქსელ-პიქსელზე, მათ დაიწყეს თავიანთი იდეის რეალობად თარგმნა, მალევე დაიპყრეს უზარმაზარი ტერიტორიები.
Blue Corner მარტო არ იყო თავის მისწრაფებებში. ტილოს მეორე მხარეს კიდევ ერთი ჯგუფი გამოჩნდა - წითელი კუთხე (წითელი კუთხე). მისმა მონაწილეებმა განაცხადეს, რომ ისინი მემარცხენეობის მომხრეები იყვნენ. პოლიტიკური შეხედულებები. სხვა ჯგუფმა - Green Lattice (მწვანე გისოსი) - დაიწყო ყველგან მწვანე და თეთრი პიქსელების გადაკვეთა. მან აჩვენა მაღალი ეფექტურობა, რადგან მას სჭირდებოდა ნახევარი პიქსელის დახატვა, ვიდრე სხვა ფრაქციები.
მეურვეებმა შემოქმედებზე ფრონტალური შეტევა დაიწყეს. ჩარმანდერი გახდა ბრძოლის პირველი ადგილი. როდესაც აღმოაჩინეს, რომ Blue Corner-მა დაიწყო პოკემონის ლურჯი პიქსელებით შევსება, შემქმნელებმა გააცნობიერეს საფრთხე და შეწყვიტეს შიდა ომები.
ისინი იბრძოდნენ, შეცვალეს თითოეული ლურჯი პიქსელი თავისით. მაგრამ ძალები არ იყო თანაბარი. თავისი გადაწყვეტილების წყალობით, Blue Corner-მა შეკრიბა გაცილებით დიდი ჯარი, ვიდრე მისი შემქმნელები. და ერთადერთი, რისი გაკეთებაც შეეძლოთ შემქმნელებს ასეთ სიტუაციაში, იყო სიცოცხლის მათხოვრობა.
და რატომღაც მან შეცვალა ტალღა. Blue Corner-მა დაიწყო დებატები მათ როლზე შემოქმედებითი პროცესი. ერთ-ერთმა მონაწილემ ჰკითხა: „რადგან ჩვენი ტალღა გარდაუვლად იპყრობს სამყაროს, უნდა გამოვხატოთ თუ არა წყალობა ხელოვნების სხვა ფორმების მიმართ, რომლებსაც ვხვდებით?
ეს იყო კითხვა, რომელიც ადრე თუ გვიან წამოიჭრა ყველა ფრაქციის წინაშე. მთელი მათი ექსპანსიონისტური გულმოდგინების მიუხედავად, რა უნდა გაეკეთებინათ ხელოვნებასთან, რომელიც მათ გზაზე დგებოდა?
გახდა გარდამტეხი წერტილი. უგუნური ფრაქციები მფარველებად იქცნენ.
მაგრამ ჯერ არ დასრულებულა
მტაცებელი ფერებით სავსე სამყაროში, შემქმნელებმა შეძლეს თავიანთ შემოქმედებაში დაბრუნება. ელემენტების ერთი მეორის მიყოლებით დამატებით მათ დაიწყეს მათი უფრო რთული. სამპიქსელიანი შრიფტების გამოყენებით დავიწყეთ ტექსტების წერა. ერთ-ერთი ყველაზე ცნობილი ქმნილება იყო ვარსკვლავური ომების პრიკველი.
შემქმნელები გაერთიანდნენ ჯგუფებად, რომლებიც მუშაობენ საერთო პროექტზე. მათ ერთმანეთს გაუზიარეს სტრატეგიები და ნიმუშები. ერთ-ერთი ყველაზე წარმატებული იყო ჯგუფი, რომელმაც შექმნა Windows 95 პანელი კუთხეში Start ღილაკით.
სხვებმა შექმნეს გულების ბლოკი, როგორც ძველ ვიდეო თამაშებში, როგორიცაა Zelda. მხოლოდ რამდენიმე ადამიანმა დაიწყო ეს პროექტი, მაგრამ სხვებიც სწრაფად შეუერთდნენ მათ და საბოლოოდ სხვადასხვა დროშის ფერებში შეღებილი გულები ტილოს ნახევარზე გადაჭიმულიყო.
მეორე ჯგუფმა ხელახლა შექმნა ვან გოგის ვარსკვლავური ღამე.
თუმცა, ყველაფერი შეუფერხებლად არ წარიმართა. ადვოკატები, რომლებიც ოდესღაც ზეიმობდნენ ხელოვნების ნიმუშების შექმნას, გახდნენ ტირანები, რომლებიც კარნახობდნენ მოდას. მათ დაიწყეს იმის მითითება, თუ რისი შექმნა შეიძლებოდა და რა არა. ეს დაიწყო ცოტა ხნით ადრე, სანამ შემქმნელები დაიწყებდნენ შექმნას საკუთარი წესებით.
ფრაქციებმა მზერა ერთმანეთზე გადაიტანეს და მოითხოვეს, რომ მათი მიმდევრები ეპიკურ ბრძოლებში მხარი დაეჭირათ. მათ არ ჰქონდათ დრო, რომ ყურადღება მიექციათ შემქმნელების სამარცხვინო ვედრებისთვის, რომლებსაც სურდათ ახალი ხელოვნების იდეების მოწონება.
დამცველებს შორის ჩხუბი სერიოზულად გაჩაღდა. Twitch-ის ლაივ სტრიმერებმა თავიანთ მიმდევრებს მოუწოდეს, თავს დაესხნენ Blue Corner-სა და Purple-ს. საბრძოლო გეგმები შედგა. მიმართა ემოციებს.
იყო ყალბი თავდასხმებიც კი, სადაც იმავე ფერის მიმდევრები მოწინააღმდეგის პიქსელებს ათავსებდნენ საკუთარ თავში, რათა მათ შეეძლოთ უჩივლონ დარღვევაზე და თავდასხმა.
თუმცა, ყველაზე დიდი პრობლემა მკაცრი წესი იყო - ტილოს გადიდება არ შეიძლება. მეომარმა ფრაქციებმაც და შემქმნელებმაც დაიწყეს იმის გაცნობიერება, რომ მათ უბრალოდ ადგილი არ ექნებოდათ ახალი ხელოვნებისთვის.
ტილოზე თავიდანვე დროშები გამოჩნდა სხვადასხვა ქვეყნებში. ისინი გაიზარდნენ და ერთმანეთს შეეჯახნენ. ნამდვილი ეპიკური ბრძოლა დაიწყო გერმანიისა და საფრანგეთის დროშებს შორის. ცხადი გახდა, რომ ახალი სივრცეების გასავითარებლად შუამავალი იყო საჭირო.
უეცრად მსოფლიო, თავიდან პრიმიტიული თავდასხმებისგან თავის დაღწევის შემდეგ, მზად იყო ყოვლისმომცველი ომისთვის. პრობლემის დიპლომატიური გადაწყვეტის სასოწარკვეთილმა მცდელობებმა არსად მიგვიყვანა. ჩეთებში შეხვედრისას შემქმნელთა და დამცველთა ლიდერები მხოლოდ ერთმანეთს ადანაშაულებდნენ.
საჭირო იყო ყეყეჩები, რომელთანაც ყველას შეეძლო შეთანხმება.
გამანადგურებლები
ინტერნეტ საიტმა 4chan-მა გაამახვილა ყურადღება იმაზე, რაც ხდებოდა Reddit-ზე. და მათ ვერ გაიარეს. მათმა მომხმარებლებმა ყველაზე მეტად გულთან ახლოს - შავი აირჩიეს. ისინი გახდნენ სიცარიელე.
როგორც კი ცრემლი ნელ-ნელა ვრცელდება ზედაპირზე, ტილოს ცენტრში შავმა პიქსელებმა დაიწყეს გამოჩენა, რომლებიც ანადგურებდნენ ყველაფერს მის გზაზე.
თავიდან სხვა ფრაქციები ცდილობდნენ მათთან ალიანსის დამყარებას, გულუბრყვილოდ თვლიდნენ, რომ დიპლომატია იმუშავებდა. მაგრამ მათ ვერ მოახერხეს, რადგან Void განსხვავებული იყო.
სიცარიელე არ იყო მფარველი. სხვა ფრაქციებისგან განსხვავებით, იგი არ ავლენდა ერთგულებას ხელოვნების მიმართ. Void-ის მიმდევრები აცხადებდნენ დესტრუქციულ ეგალიტარიზმს ლოზუნგით „სიცარიელე ყველაფერს შთანთქავს“. მათ არ ჰქონდათ კონტაქტი სხვებთან. მათ უბრალოდ სურდათ მთელი სამყარო შავად დაეხატათ.
და ეს იყო ზუსტად ის, რაც საჭირო იყო. გადაშენების პირას აღმოჩნდნენ, პროექტის ყველა მონაწილე გაერთიანდა სიცარიელესთან საბრძოლველად, რათა შეენარჩუნებინა თავისი ხელოვნება.
მაგრამ სიცარიელის დამარცხება არც ისე ადვილი იყო, რადგან ის საჭირო იყო. საჭირო იყო ყველაფრის განადგურება, რათა ფერფლიდან ხელახლა დაბადებულიყო ახალი ხელოვნება, საუკეთესო. და სიცარიელის გარეშე ეს შეუძლებელი იყო.
ასე რომ, სიცარიელე გახდა შექმნის კატალიზატორი ყველაზე დიდი ნამუშევარიხელოვნება.
ტილოს ცენტრალური ნაწილისთვის თავიდანვე ჯიუტი ბრძოლა მიმდინარეობდა. შემქმნელებმა ეს ტერიტორია თავიანთი ნამუშევრებისთვის მოითხოვეს. თავდაპირველად ისინი ცდილობდნენ ამის გაკეთებას ხატების გამოყენებით. შემდეგ კოორდინირებული მცდელობით შექმნათ ისეთი პრიზმა, როგორიც გარეკანზეა ალბომი ვარდისფერიფლოიდი უკანა მხარემთვარე."
მაგრამ სიცარიელემ ყველაფერი შეჭამა. ერთი ქმნილება მეორის მიყოლებით მხოლოდ აძლიერებდა მის ქაოსის მადას.
და მაინც, ეს იყო ზუსტად ის, რაც საჭირო იყო. ხელოვნების განადგურების შემდეგ, Void-მა აიძულა მომხმარებლები მოეფიქრებინათ რაიმე უკეთესი. მათ იცოდნენ, რომ შეძლებდნენ შავი მონსტრის დამარცხებას. მათ უბრალოდ სჭირდებათ კარგი პოტენციალის მქონე იდეა, რომელიც საკმარის მიმდევარს მოიზიდავს.
და ეს იდეა გახდა ამერიკის დროშა.
პროექტის ბოლო დღეს ყველა შეიკრიბა, რათა ერთხელ და სამუდამოდ განედევნა სიცარიელე. კოალიცია შეიქმნა იმ ადამიანებისგან, რომლებიც განსხვავებულ სიტუაციაში დაშორდებოდნენ ერთმანეთს - ტრამპის მხარდამჭერები და ოპონენტები, დემოკრატები და რესპუბლიკელები, ამერიკელები და ევროპელები.
ისინი შეიკრიბნენ, რათა შექმნან რაღაც ერთად, ინტერნეტის ამ პატარა კუთხეში, რაც დაამტკიცეს, რომ იმ ეპოქაში, სადაც ასეთი თანამშრომლობა შეუძლებელი ჩანს, მათ ეს მაინც შეუძლიათ.
ძველები მართლები იყვნენ
ცოტა ხნის შემდეგ Reddit-ის ექსპერიმენტი დასრულდა. დღეს მას ათობით ჩატში მოთხრობილი მრავალი ისტორია ახლავს. პროექტში შექმნილი თითოეული ხელოვნების ნიმუში ასობით ახლით იყო დაფარული, რომელთაგან მხოლოდ რამდენიმე დარჩა საბოლოო ტილოზე.
მაგრამ ყველაზე გასაკვირი, ალბათ, ის არის, რომ, მიუხედავად ანონიმურობისა და აკრძალვის არარსებობისა, საბოლოო ტილოზე არ იყო რასისტული ან მიზანთროპული სიმბოლოები. ეს იყო ხელოვნების, სიცოცხლისა და სიკვდილის მშვენიერი ციკლი. და ის არ იყო პირველი ჩვენს ისტორიაში.
მრავალი ათასწლეულის წინ, როდესაც კაცობრიობა (ნამდვილი და არა მხოლოდ Reddit-ზე) ჯერ კიდევ საწყის ეტაპზე იყო, ინდუისტმა ფილოსოფოსებმა დაადგინეს თეორია, რომ ცა შედგებოდა სამი კონკურენტი, მაგრამ აუცილებელი ღვთაებისგან: ბრაჰმა შემოქმედი, ვიშნუ მცველი და შივა, გამანადგურებელი.
ერთი მათგანის გარეშეც კი სამყარო ვერ იმუშავებს. სინათლე რომ იყოს, სიბნელე აუცილებელია. სიცოცხლის არსებობისთვის საჭიროა სიკვდილი. შემოქმედებისა და ხელოვნებისთვის უნდა იყოს განადგურება.
პროექტის რამდენიმე დღემ აჩვენა, რომ ეს მიდგომა წინასწარმეტყველური აღმოჩნდა. ყველაზე წარმოუდგენელი გზით, Reddit-მა დაამტკიცა, რომ შექმნა სამივე კომპონენტს მოითხოვს.
საბოლოო ფერწერა
ფეისბუქი
ჯიბე
ფბ მესენჯერი
არ შეიძლება ითქვას, რომ იუმორის დღეს კორპორატიული ხუმრობების 100% წარმატებული და მიმზიდველია. წელს Reddit-ის ადმინისტრაციამ გამოუშვა Place, ინტერაქტიული გრაფიკული ტილო, რომელიც ზომებს 1000 პიქსელზე 1000 პიქსელზე და მას ეძღვნება სექცია. ითვლებოდა, რომ საზოგადოების წევრები ერთობლივად დახატავდნენ ამ ტილოს, როგორც მოესურვებოდათ. მაგრამ შედეგად, ეს გადაიზარდა ადგილისთვის ბრძოლაში, ზოგჯერ ფილოსოფიურ დაპირისპირებაში. ჩვეულებრივი ხატვის სავარჯიშო ამაღელვებელ სოციალურ ექსპერიმენტად იქცა. ამბავი თავიდან ბოლომდე იყო დოკუმენტირებული Sudoscript ბლოგის მიერ.
ადგილის წესები მარტივი იყო. თითოეულ მონაწილეს შეეძლო აირჩიოს ერთი პიქსელი 16 ფერიდან და განათავსოს იგი ტილოზე სადმე. თქვენ შეგეძლოთ იმდენი პიქსელის განთავსება, რამდენიც გინდოდათ, მაგრამ თითოეულ განთავსებას შორის უნდა დაელოდოთ 5 წუთი. 72 საათის შემდეგ, ამ ძალიან მარტივმა წესებმა გამოიწვია საოცარი კოლექტიური ტილოს შექმნა:
ზემოთ ხილული თითოეული პიქსელი ხელით იყო განთავსებული. ყოველი ხატი, ყოველი დროშა, ყოველი მემი საგულდაგულოდ შეიქმნა ათასობით ადამიანის მიერ, რომელთაც არაფერი ჰქონდათ საერთო, გარდა ინტერნეტ კავშირისა.
მისი შექმნის დროს მოხდა უამრავი დრამა, იდეა, ჩხუბი, ომებიც კი. მაგრამ ზოგადად, ადგილის ისტორია არის მარადიული დრამა სამი ძალის შესახებ, რომელიც აუცილებელია კაცობრიობის შესაქმნელად, შექმნისა და ტექნოლოგიების განვითარებისთვის.
შემქმნელები
ჯერ შემქმნელები იყვნენ. ესენი იყვნენ მხატვრები, რომლებისთვისაც ცარიელი ტილო დაუძლეველ შესაძლებლობად ჩანდა. ადრეული შემსრულებლები პიქსელებს შემთხვევით ათავსებდნენ, რათა დაენახათ, რისი გაკეთება შეეძლოთ. პირველ წუთებში გამოჩნდა პირველი ესკიზები. უხეში და გაუაზრებელი, ისინი მღვიმეების გამოქვაბულის ნახატებს ჰგავდნენ.
შემქმნელებმა მაშინვე დაინახეს, თუ რა ძალასა და პოტენციალს მალავდნენ პიქსელები. მაგრამ მარტო მუშაობით, მათ შეეძლოთ თითო პიქსელის განთავსება ყოველ 5 ან 10 წუთში. აზრიანი ნახატის შექმნას სამუდამოდ დასჭირდება. რაღაცის დასახატად მათ ერთად მოუწიათ მუშაობა.
შემდეგ ვინმეს გაუჩნდა ბრწყინვალე იდეა, გამოეყენებინა ბადე ნახატზე, რომელიც გადაიფარებოდა ნახაზზე და აჩვენებდა სად უნდა განთავსდეს შემდეგი პიქსელები. პირველი, ვინც გაიარა ეს ექსპერიმენტი, იყო ინგლისურენოვანი ინტერნეტის ცნობილი მემი, დიკბატი. და ადგილის მაცხოვრებლებმა დაიწყეს მუშაობა: დიკბატი ფაქტიურად რამდენიმე წუთში მატერიალიზდა ტილოს ქვედა მარცხენა კუთხეში. კოლექტიური შემოქმედების პირველი ქმნილება გამოჩნდა საიტზე.
შემდეგ, როცა შემქმნელები ცოტათი დათვრნენ შესაძლებლობებით, გამოჩნდა პოკემონ შარმანდერი, რომელსაც ფეხის ნაცვლად მალე პენისი გაუჩნდა. და დაიწყო პირველი კონფლიქტი: ზოგიერთი შემქმნელი გულმოდგინედ ცდილობდა შეურაცხმყოფელი ნახატების გაწმენდას, მაგრამ სხვები დაჟინებით ამატებდნენ უხამსობას.
შემქმნელები ფუნდამენტის წინაშე დადგნენ ფილოსოფიური პრობლემა: ზედმეტი თავისუფლება იწვევს ქაოსს. კრეატიულობას ისევე სჭირდება შეზღუდვა, როგორც თავისუფლებას.
დამცველები
ადგილზე გამოჩნდა სხვა ტიპის მომხმარებელი, რომელსაც სწორედ ამ პრობლემასთან ჰქონდა გამკლავება. მაგრამ მათ დაიწყეს უფრო პრიმიტიული მიზნებით: მსოფლიოს დაპყრობა. ფერის მიხედვით ფრაქციებად დაყოფილნი ცდილობდნენ ადგილის დაკავებას. ერთ-ერთი პირველი იყო ლურჯი კუთხე. ქვედა მარჯვენა კუთხეში გაჩნდა და ჭირივით გავრცელდა.
მეორე ჯგუფმა დააარსა წითელი კუთხე ტილოს მოპირდაპირე მხარეს, ისინი პოლიტიკური მემარცხენეობისკენ დაიხარეს. სხვა ჯგუფმა სახელად მწვანე ბადე დახატა ტილო პიქსელებით - მწვანე უჯრედები, რომლებიც თეთრ უჯრედებს შორის იყო გადანაწილებული. იმის გამო, რომ მათ მხოლოდ ნახევარი პიქსელების დახატვა მოუწიათ, ისინი უფრო ეფექტური იყვნენ ვიდრე სხვა ფრაქციები.
დიდი დრო არ გასულა, სანამ ფრაქციები შემქმნელებს შეეჯახნენ. ჩარმანდერი ბრძოლის ერთ-ერთი პირველი სამიზნე გახდა. ცისფერმა კუთხემ დაიწყო პოკემონის დახატვა ლურჯი პიქსელებით და შემქმნელები გადავიდნენ "ფალიური ომებიდან" (ვისაც შეუძლია ყველაზე მეტი დიკის დახატვა) უფრო სერიოზულ საფრთხეზე. მათ ბრძოლა მიიღეს და ყველა ლურჯი პიქსელი თავისით დახატეს. მაგრამ რაოდენობრივი უპირატესობა არ იყო მათ სასარგებლოდ.
ასე რომ, შემქმნელები ჩაბარდნენ გამარჯვებულის წყალობას და ამან რატომღაც შელახა ბლუზის გრძნობები. მათ შორის გამოჩნდნენ ისინი, ვინც ეჭვი ეპარებოდა მათ როლში ადგილის სამყაროში. „ჩვენი ტალღა აუცილებლად დაფარავს მთელ სამყაროს, ბოლოდან ბოლომდე, თუ მოწყალება გამოვხატავთ სხვა ხელოვნებას, რომელსაც ვხვდებით“, - იკითხა ჯგუფის ერთ-ერთმა წევრმა.
თითოეულ ფრაქციას შეექმნა ეს კითხვა. და ყველამ გადაწყვიტა სხვა ნახატების შენახვა. ასე რომ, ფერთა ტალღებმა დაიწყეს დენა ნახატების გარშემო, მათი შეღებვის გარეშე.
ეს იყო გარდამტეხი მომენტი. უაზრო ფერადი ფრაქციები გახდა სასარგებლო დამცველები.
მაგრამ ეს ჯერ არ არის ბედნიერი დასასრული
საბოლოოდ, ფერის დაუოკებელი ტალღები შეჩერდა და შემქმნელებს შეეძლოთ შემოქმედებისკენ დაბრუნება. ნახატები უფრო და უფრო რთული ხდებოდა. გამოჩნდა პიქსელებით დაწერილი ტექსტები.
შემქმნელები გაერთიანდნენ მცირე ჯგუფები, ქვერედიტების შექმნა Reddit-ზე, სადაც შესაძლებელი იქნებოდა ნახატებისა და სტრატეგიის პროექტების განხილვა. Ერთ - ერთი ყველაზე წარმატებული ჯგუფებიმე დავხატე დავალების პანელი Windows 95-ის სტილში. მეორემ დახატა ადგილი გულებით.
შემდეგ გამოჩნდა ვან გოგი.
მაგრამ ეს ასე მარტივი არ იყო. დამცველები გადაიქცნენ ტირანებად, კარნახობდნენ ნახატების სტილს. მათ გადაწყვიტეს, რისი დახატვა შეიძლებოდა და რა არა. ფრაქციებმა დაიწყეს მომხმარებლების დაყოფა, მხარეების მოწოდებით, ხოლო შემქმნელები ახალი იდეების დამტკიცებას ელოდნენ.
ბრძოლები დამცველებს შორის სულ უფრო სასტიკი ხდებოდა. Twitch-ის ერთ-ერთმა სტრიმპერმა მოუწოდა თავის მიმდევრებს თავს დაესხნენ ბლუს. შემუშავდა საბრძოლო სტრატეგიები. პროვოკაციებიც კი იყო: იმავე ფერის თაყვანისმცემლები საკუთარ ტერიტორიაზე მტრის ფერის პიქსელებს ხატავდნენ, რათა საპასუხო შეტევის საბაბი ჰქონოდათ. სანამ ფრაქციები ერთმანეთს ებრძოდნენ, შემქმნელებმა აღმოაჩინეს, რომ ადგილი აღარ დარჩა ახალი ნახატებისთვის.
დროშები დაიწყო სხვა და სხვა ქვეყნები- როცა ისინი იზრდებოდნენ, ისინი აუცილებლად შეეჯახნენ ერთმანეთს. მაგალითად, გერმანიისა და საფრანგეთის დროშები ერთმანეთს შეეჯახა „არავის მიწაზე“.
ჩანდა, რომ ეს პატარა სამყარო ომის ზღვარზე იყო. ყველა მხარე ცდილობდა კონფლიქტის დიპლომატიური გზით მოგვარებას. შემოქმედთა და დამცველთა ლიდერები კომუნიკაციას უწევდნენ ჩატებში, მაგრამ ეს ჩვეულებრივ მთავრდებოდა ურთიერთბრალდებებით.
ადგილს სჭირდებოდა ბოროტმოქმედი, რომლის წინააღმდეგაც ყველას შეეძლო გაერთიანება.
გამანადგურებლები
სიცარიელე დადგა.
ეს დაიწყო 4chan-ით, მსოფლიოში ყველაზე ცნობილი იმიჯბორდით. მასში მცხოვრებმა პრანკერებმა შეამჩნიეს რა ხდებოდა Reddit-ზე და იგნორირება არ შეეძლოთ. ისინი გახდნენ სიცარიელე.
ადგილის ცენტრში დაიწყო შავი პიქსელების ლაქა. თავდაპირველად, ფრაქციები დიპლომატიის გამოყენებით ცდილობდნენ პაქტის დადებას Void-თან. მაგრამ მათ ვერ მოახერხეს, Void სხვაგვარად მოიქცა. ის არ იყო ერთ-ერთი დამცველი, ის არ იცავდა ხელოვნებას. მისი მიმდევრები ქადაგებდნენ, რომ სიცარიელე ყველაფერს შთანთქავდა. ისინი არ ქმნიდნენ გვერდებს, მათ მხოლოდ სურდათ მთელი სამყარო შავად დაეხატათ.
ეს იყო ზუსტად ის დარტყმა, რომელიც პლეისს სჭირდებოდა. საერთო საფრთხის წინაშე მყოფი შემქმნელები და დამცველები კვლავ გაერთიანდნენ ხელოვნების გადასარჩენად. მაგრამ Void-ის მიზანი არ იყო მხოლოდ განადგურება, რატომღაც მან წარმოშვა ახალი, უკეთესი ხელოვნება.
მაგალითად, ცენტრში პოზიცია ერთ-ერთი ყველაზე სადავო იყო შემქმნელებს შორის. და როდესაც ის გაშავდა, დამცველები მიხვდნენ, რომ მათ უნდა შეექმნათ უკეთესი იდეა, რომელიც მოიზიდავდა საკმარის მიმდევარს შავ ურჩხულთან საბრძოლველად. ერთ-ერთი ასეთი იდეა იყო აშშ-ს დროშა.
ადგილის არსებობის ბოლო დღეს მასში შეიქმნა ყველაზე წარმოუდგენელი კოალიცია, რომელიც შექმნილია სიცარიელესთან საბრძოლველად - იყვნენ ტრამპის თაყვანისმცემლები და ტრამპის ოპონენტები, რესპუბლიკელები და დემოკრატები, ამერიკელები და ევროპელები.
Reddit-ის ექსპერიმენტი მალე დასრულდა. ბოლო ტილოზე არ იყო არც ერთი რასისტული ნახატი ან სიძულვილის ერთი სიმბოლო.
ჯიბე
ფბ მესენჯერი
დასაწყისისთვის, უაღრესად მნიშვნელოვანი იყო პირველი აპრილის პროექტის მოთხოვნების დადგენა, რადგან ის უნდა გაშვებულიყო „გადატვირთვის“ გარეშე, რათა Reddit-ის ყველა მომხმარებელს დაუყოვნებლივ შეეძლო მასზე წვდომა. თავიდანვე იდეალურად რომ არ ემუშავა, ძნელად ბევრი ადამიანის ყურადღებას მიიპყრობდა.
- მოქნილი კონფიგურაცია უნდა იყოს უზრუნველყოფილი მოულოდნელი შეფერხებების ან წარუმატებლობის შემთხვევაში. ანუ, თქვენ უნდა შეგეძლოთ დაფის ზომის და დაშვებული ნახაზის სიხშირის რეგულირება, თუ მონაცემთა რაოდენობა ძალიან დიდია ან განახლების სიხშირე ძალიან მაღალია.
"დაფა" უნდა იყოს 1000x1000 ფილების ზომის, რომ ძალიან დიდი გამოიყურებოდეს.
ყველა კლიენტი უნდა იყოს სინქრონიზებული და აჩვენოს დაფის იგივე მდგომარეობა. ყოველივე ამის შემდეგ, თუ სხვადასხვა მომხმარებლებს აქვთ სხვადასხვა ვერსიები, მათ გაუჭირდებათ ურთიერთობა.
თქვენ უნდა მხარი დაუჭიროთ მინიმუმ 100000 ერთდროულ მომხმარებელს.
მომხმარებლებს შეუძლიათ ყოველ ხუთ წუთში ერთი კრამიტის განთავსება. აქედან გამომდინარე, აუცილებელია შენარჩუნდეს განახლების საშუალო სიჩქარე 100,000 ფილა ხუთ წუთში (333 განახლება წამში).
პროექტი უარყოფითად არ უნდა იმოქმედოს საიტის სხვა ნაწილებისა და ფუნქციების მუშაობაზე (თუნდაც r/Place-ზე მაღალი ტრეფიკია).
Backend
განხორციელების გადაწყვეტილებები
ბექენდის შექმნის მთავარი სირთულე იყო დაფის სტატუსის ჩვენების სინქრონიზაცია ყველა კლიენტისთვის. გადაწყდა, რომ კლიენტებმა მოესმინათ კრამიტის განთავსების მოვლენები რეალურ დროში და დაუყოვნებლივ მოეკითხათ მთელი დაფის მდგომარეობა. ოდნავ მოძველებული სრული მდგომარეობის არსებობა მისაღებია, თუ თქვენ გამოიწერეთ განახლებები სრული მდგომარეობის გენერირებამდე. როდესაც კლიენტი იღებს სრულ მდგომარეობას, ის აჩვენებს ყველა ფილას, რომელიც მიიღო ლოდინის დროს; ყველა შემდგომი ფილა უნდა გამოჩნდეს დაფაზე მიღებისთანავე.
იმისათვის, რომ ეს სქემა იმუშაოს, მოთხოვნა სრული მდგომარეობადაფები უნდა დასრულდეს რაც შეიძლება სწრაფად. თავიდან გვინდოდა მთელი დაფა ერთ რიგში შეგვენახა კასანდრაში და ყოველი მოთხოვნა უბრალოდ წაეკითხა ეს მწკრივი. ამ სტრიქონში თითოეული სვეტის ფორმატი იყო:
(x, y): („დროის შტამპი“: ეპოქები, „ავტორი“: მომხმარებლის_სახელი, „ფერი“: ფერი)
მაგრამ რადგან დაფა შეიცავს მილიონ ფილას, დაგვჭირდა მილიონი სვეტის წაკითხვა. ჩვენს წარმოების კლასტერზე ამას 30 წამამდე დასჭირდა, რაც მიუღებელი იყო და შეიძლება გამოიწვიოს კასანდრაზე გადაჭარბებული დატვირთვა.
შემდეგ გადავწყვიტეთ მთელი დაფა შეგვენახა რედისში. ჩვენ ავიღეთ მილიონი ოთხბიტიანი რიცხვის ბიტის ველი, რომელთაგან თითოეულს შეეძლო ოთხბიტიანი ფერის დაშიფვრა, ხოლო x და y კოორდინატები განისაზღვრა ოფსეტით (ოფსეტი = x + 1000y) ბიტის ველში. დაფის სრული მდგომარეობის მისაღებად, მთელი ბიტის ველი უნდა წაიკითხოთ.
შესაძლებელი იყო ფილების განახლება მნიშვნელობების განახლებით კონკრეტული ოფსეტებით (არ არის საჭირო მთელი წაკითხვის/განახლების/ჩაწერის პროცედურის დაბლოკვა ან განხორციელება). მაგრამ ყველა დეტალი მაინც უნდა იყოს შენახული კასანდრაში, რათა მომხმარებლებმა გაარკვიონ, ვინ და როდის მოათავსა თითოეული ფილა. ჩვენ ასევე ვგეგმავდით კასანდრას გამოყენებას დაფის აღსადგენად, როდესაც რედისი ჩამოვარდა. მისგან მთელი დაფის წაკითხვას 100 ms-ზე ნაკლები დასჭირდა, რაც საკმაოდ სწრაფი იყო.
აი, როგორ ვინახავდით ფერებს Redis-ში 2x2 დაფის მაგალითის გამოყენებით:
ჩვენ ვნერვიულობდით, რომ შეიძლება შეგვექმნა წაკითხვის გამტარუნარიანობა Redis-ში. თუ ბევრი კლიენტი დაუკავშირდება ან განახლდება ერთდროულად, ისინი ყველა ერთდროულად აგზავნიან მოთხოვნებს დაფის სრული მდგომარეობის შესახებ. ვინაიდან დაფა წარმოადგენდა საერთო გლობალურ სახელმწიფოს, აშკარა გამოსავალი იყო ქეშირების გამოყენება. ჩვენ გადავწყვიტეთ ქეში ჩაგვეყენებინა CDN (სწრაფად) დონეზე, რადგან მისი დანერგვა უფრო ადვილი იყო, ხოლო ქეში მიღებულ იქნა კლიენტებთან ყველაზე ახლოს, რამაც შეამცირა პასუხის მიღების დრო.
მოთხოვნები სრული დაფის მდგომარეობაზე ქეშირებული იყო Fastly-ის მიერ წამის დროით. დიდი რაოდენობის მოთხოვნების ვადის ამოწურვის თავიდან ასაცილებლად, ჩვენ გამოვიყენეთ stale-while-revalidate header. Fastly მხარს უჭერს დაახლოებით 33 POP-ს, რომლებიც დამოუკიდებლად ქეშირებენ ერთმანეთს, ამიტომ ველოდით, რომ მივიღებდით 33-მდე სრული დაფის სტატუსის მოთხოვნას წამში.
ყველა კლიენტისთვის განახლებების გამოსაქვეყნებლად, ჩვენ გამოვიყენეთ ჩვენი ვებსოკეტის სერვისი. ჩვენ ადრე წარმატებით ვიყენებდით Reddit.Live-ს 100000-ზე მეტ ერთდროულად მომხმარებელთან ერთად Live პირადი შეტყობინების შეტყობინებებისა და სხვა ფუნქციებისთვის. მომსახურებაც იყო ქვაკუთხედიჩვენი წარსული პირველი აპრილის პროექტები - The Button and Robin. r/Place-ის შემთხვევაში, კლიენტებმა მხარი დაუჭირეს ვებსოკეტის კავშირებს, რათა მიეღოთ რეალურ დროში განახლებები ფილების განთავსებაზე.
API
სრული დაფის მდგომარეობის მიღება
თავდაპირველად, მოთხოვნები წავიდა Fastly-ში. თუ მას ჰქონდა დაფის მოქმედი ასლი, ის დაუყოვნებლივ დააბრუნებდა მას Reddit-ის აპლიკაციის სერვერებთან დაკავშირების გარეშე. თუ არა, ან ასლი ძალიან ძველი იყო, მაშინ Reddit აპი წაიკითხავდა სრულ დაფას Redis-დან და დააბრუნებდა მას Fastly-ში, რათა ქეშებულიყო და დაუბრუნდეს კლიენტს.
გაითვალისწინეთ, რომ მოთხოვნის სიჩქარე არასოდეს აღწევდა 33 წამში, რაც იმას ნიშნავს, რომ ქეშირება Fastly-ით ძალიან იყო ეფექტური საშუალებები Reddit აპის დაცვა უმეტესი მოთხოვნებისგან.
და როდესაც მოთხოვნამ მიაღწია განაცხადს, რედისმა ძალიან სწრაფად უპასუხა.
კრამიტის დახატვა
კრამიტის დახატვის ეტაპები:
- მომხმარებლის მიერ კრამიტის ბოლო განთავსების დროის ანაბეჭდი იკითხება კასანდრადან. თუ ხუთ წუთზე ნაკლები იყო, მაშინ არაფერს ვაკეთებთ და შეცდომა უბრუნდება მომხმარებელს.
- კრამიტის დეტალები ეწერება რედისს და კასანდრას.
- მიმდინარე დრო ჩაწერილია კასანდრაში, როგორც ბოლო დროს, როდესაც ფილა მოათავსეს მომხმარებლის მიერ.
- ვებსოკეტის სერვისი უგზავნის შეტყობინებას ყველა დაკავშირებულ კლიენტს ახალი კრამიტის შესახებ.
მკაცრი თანმიმდევრულობის შესანარჩუნებლად, ყველა ჩაწერა და წაკითხვა კასანდრაში შესრულდა QUORUM თანმიმდევრულობის ფენის გამოყენებით.
სინამდვილეში, ჩვენ გვქონდა რბოლა აქ, სადაც მომხმარებლებს შეეძლოთ ერთდროულად რამდენიმე ფილების განთავსება. 1-3 ეტაპებზე არ იყო დაბლოკვა, ამიტომ ფილების დახატვის ერთდროული მცდელობა შეიძლება გაიაროს შემოწმება პირველ ეტაპზე და დახაზულიყო მეორეში. როგორც ჩანს, ზოგიერთმა მომხმარებელმა აღმოაჩინა ეს შეცდომა (ან გამოიყენეს ბოტები, რომლებიც იგნორირებას უკეთებდნენ მოთხოვნის სიხშირის ლიმიტს) - და შედეგად, დაახლოებით 15,000 ფილა განთავსდა მისი გამოყენებით (სულის 0,09%).
მოთხოვნის განაკვეთები და პასუხების დრო, რომელიც იზომება Reddit აპლიკაციით:
ფილების განლაგების პიკი იყო თითქმის 200 წამში. ეს ჩვენს სავარაუდო ლიმიტს 333 ფილა/წმ-ზე დაბალია (საშუალოდ იმ ვარაუდით, რომ 100 000 მომხმარებელი ათავსებს ფილებს ყოველ ხუთ წუთში).
დეტალების მიღება კონკრეტული ფილისთვის
კონკრეტული ფილების მოთხოვნისას, მონაცემები პირდაპირ კასანდრადან იკითხებოდა.
მოთხოვნის განაკვეთები და პასუხების დრო, რომელიც იზომება Reddit აპლიკაციით:
ეს მოთხოვნა ძალიან პოპულარული აღმოჩნდა. კლიენტის რეგულარული მოთხოვნის გარდა, ადამიანებს აქვთ დაწერილი სკრიპტები, რომ მოიძიონ მთელი დაფა ერთი ფილა ერთდროულად. ვინაიდან ეს მოთხოვნა არ იყო ქეშირებული CDN-ში, ყველა მოთხოვნას ემსახურებოდა Reddit აპლიკაცია.
ამ თხოვნებზე რეაგირების დრო საკმაოდ მოკლე იყო და პროექტის მთელი ცხოვრების მანძილზე რჩებოდა იმავე დონეზე.
ვებსოკეტები
ჩვენ არ გვაქვს ინდივიდუალური მეტრიკა, რომელიც აჩვენებს, თუ როგორ იმოქმედა r/Place-მა websocket სერვისზე. მაგრამ ჩვენ შეგვიძლია შევაფასოთ მნიშვნელობები პროექტის დაწყებამდე და მისი დასრულების შემდეგ მონაცემების შედარებით.
ვებსოკეტის სერვისთან კავშირების საერთო რაოდენობა:
საბაზისო დატვირთვა r/Place-ის გაშვებამდე იყო დაახლოებით 20000 კავშირი, პიკი იყო 100000 კავშირი. ასე რომ, პიკზე ჩვენ ალბათ გვყავდა დაახლოებით 80,000 კონკურენტი მომხმარებელი დაკავშირებული r/Place-თან.
Websocket სერვისის გამტარუნარიანობა:
r/Place-ზე დატვირთვის პიკზე, websocket სერვისმა გადაიტანა 4 გბიტ/წმ-ზე მეტი (150 Mbps თითო ინსტანციაზე, სულ 24 შემთხვევა).
Frontend: ვებ და მობილური კლიენტები
Place-ის ფრონტენტის შექმნის პროცესში ჩვენ მოგვიწია მრავალი რთული პრობლემის გადაჭრა, რომლებიც დაკავშირებულია კროს-პლატფორმის განვითარებასთან. ჩვენ გვინდოდა, რომ პროექტი ერთნაირად მუშაობდეს ყველა ძირითად პლატფორმაზე, მათ შორის დესკტოპ კომპიუტერებზე და მობილურ მოწყობილობებზე iOS და Android-ზე.
მომხმარებლის ინტერფეისს სამი მნიშვნელოვანი ფუნქცია უნდა შეესრულებინა:
- დაფის სტატუსის ჩვენება რეალურ დროში.
- ნება მიეცით მომხმარებლებს ურთიერთქმედონ დაფასთან.
- იმუშავეთ ყველა პლატფორმაზე, მათ შორის მობილურ აპლიკაციებზე.
ინტერფეისის მთავარი ობიექტი იყო ტილო და Canvas API იდეალური იყო მისთვის. ჩვენ გამოვიყენეთ ელემენტი
ტილოს დახატვა
ტილო რეალურ დროში უნდა ასახავდეს დაფის მდგომარეობას. საჭირო იყო მთელი დაფის დახატვა, როდესაც გვერდი ჩაიტვირთა და დასრულებულიყო ვებსოკეტების მეშვეობით შემოსული განახლებების ნახაზი. ტილოს ელემენტი, რომელიც იყენებს CanvasRenderingContext2D ინტერფეისს, შეიძლება განახლდეს სამი გზით:
- დახაზეთ არსებული სურათი ტილოში drawImage()-ის გამოყენებით.
- დახატეთ ფორმები სხვადასხვა ფორმის ხატვის ტექნიკის გამოყენებით. მაგალითად, fillRect() ავსებს მართკუთხედს გარკვეული ფერით.
- შექმენით ImageData ობიექტი და დახატეთ იგი ტილოზე putImageData()-ის გამოყენებით.
პირველი ვარიანტი არ შეგვეფერა, რადგან არ გვქონდა დაფა მზა გამოსახულების სახით. ეს დარჩა 2 და 3 ვარიანტები. უმარტივესი გზა იყო ცალკეული ფილების განახლება fillRect()-ის გამოყენებით: როდესაც განახლება მოდის websocket-ის მეშვეობით, ჩვენ უბრალოდ ვხატავთ 1x1 ოთხკუთხედს (x, y) პოზიციაზე. ზოგადად, მეთოდი მუშაობდა, მაგრამ არ იყო ძალიან მოსახერხებელი რენდერისთვის საწყისი მდგომარეობადაფები. putImageData() მეთოდი ბევრად უკეთესი იყო: ჩვენ შეგვიძლია განვსაზღვროთ თითოეული პიქსელის ფერი ერთ ImageData ობიექტში და ერთდროულად დავხატოთ მთელი ტილო.
დაფის საწყისი მდგომარეობის დახატვა
putImageData()-ის გამოყენება მოითხოვს დაფის მდგომარეობის განსაზღვრას Uint8ClampedArray-ის სახით, სადაც თითოეული მნიშვნელობა არის რვა ბიტიანი ხელმოუწერელი რიცხვი 0-დან 255-მდე დიაპაზონში. თითოეული მნიშვნელობა წარმოადგენს ფერის არხს (წითელი, მწვანე, ლურჯი, ალფა) და თითოეული პიქსელს სჭირდება ოთხი ელემენტი მასივში. 2x2 ტილო მოითხოვს 16-ბაიტიან მასივს, რომელშიც პირველი ოთხი ბაიტი წარმოადგენს ტილოს ზედა მარცხენა პიქსელს, ხოლო ბოლო ოთხი წარმოადგენს ქვედა მარჯვენა პიქსელს.
აი, როგორ უკავშირდება ტილოს პიქსელები მათ Uint8ClampedArray წარმოდგენებს:
ჩვენი პროექტის ტილოსთვის დაგვჭირდა ოთხი მილიონი ბაიტის მასივი - 4 მბ.
უკანა ნაწილში, დაფის მდგომარეობა ინახება ოთხბიტიან ველად. თითოეული ფერი წარმოდგენილია რიცხვით 0-დან 15-მდე, რაც საშუალებას გვაძლევს შეგვეკრა ორი პიქსელი თითოეულ ბაიტში. კლიენტის მოწყობილობაზე გამოსაყენებლად, თქვენ უნდა გააკეთოთ სამი რამ:
- გადაიტანეთ ორობითი მონაცემები ჩვენი API-დან კლიენტზე.
- ამოალაგეთ მონაცემები.
- გადაიყვანეთ ოთხბიტიანი ფერები 32-ბიტიანში.
ორობითი მონაცემების გადასატანად, ჩვენ გამოვიყენეთ Fetch API იმ ბრაუზერებში, რომლებიც მხარს უჭერენ მას. და მათ, ვინც მხარს არ უჭერს, ჩვენ გამოვიყენეთ XMLHttpRequest answerType-ზე დაყენებულია “arraybuffer”-ზე.
API-დან მიღებული ბინარული მონაცემები შეიცავს ორ პიქსელს თითოეულ ბაიტში. ყველაზე პატარა TypedArray კონსტრუქტორი, რომელიც ჩვენ გვქონდა, საშუალებას გაძლევთ იმუშაოთ ბინარულ მონაცემებთან ერთბაიტიანი ერთეულების სახით. მაგრამ მათი გამოყენება რთულია კლიენტის მოწყობილობებზე, ამიტომ ჩვენ გავხსენით მონაცემები, რათა გაადვილებულიყო მუშაობა. პროცესი მარტივია: ჩვენ გავიმეორეთ შეფუთული მონაცემების მეშვეობით, ამოვიღეთ მაღალი და დაბალი რიგის ბიტები და შემდეგ დავაკოპირეთ ისინი ცალკეულ ბაიტებად სხვა მასივში.
საბოლოოდ, ოთხი ბიტიანი ფერები უნდა გადაექცია 32 ბიტიანზე.
ImageData სტრუქტურა, რომელიც გვჭირდებოდა putImageData()-ის გამოსაყენებლად ამას მოითხოვს საბოლოო შედეგიიყო Uint8ClampedArray-ის სახით ბაიტებით, რომლებიც კოდირებენ ფერთა არხებს RGBA თანმიმდევრობით. ეს ნიშნავს, რომ ჩვენ გვჭირდებოდა კიდევ ერთი დეკომპრესია, თითოეული ფერის დაყოფა არხის კომპონენტურ ბაიტებად და განთავსება მათ სწორ ინდექსში. არ არის ძალიან მოსახერხებელი პიქსელზე ოთხი ჩაწერის შესრულება. მაგრამ, საბედნიეროდ, სხვა ვარიანტიც იყო.
TypedArray ობიექტები არსებითად ArrayBuffer-ის მასივის წარმოდგენებია. აქ არის ერთი სიფრთხილე: რამდენიმე TypedArray ინსტანციას შეუძლია წაიკითხოს და ჩაწეროს იმავე ArrayBuffer მაგალითზე. ჩაწერის ნაცვლად ოთხი ღირებულებარვა-ბიტიან მასივში შეგვიძლია ჩავწეროთ ერთი მნიშვნელობა 32-ბიტიანში! წერისთვის Uint32Array-ის გამოყენებით, ჩვენ შევძელით ადვილად განვაახლოთ კრამიტის ფერები მხოლოდ ერთი მასივის ინდექსის განახლებით. თუმცა, ჩვენ უნდა შევინახოთ ჩვენი ფერის პალიტრა დიდი ბაიტის თანმიმდევრობით (ABGR), რათა ბაიტები ავტომატურად დასრულდეს სწორ ადგილებში Uint8ClampedArray-ის გამოყენებით წაკითხვისას.
მიმდინარეობს ვებსოკეტით მიღებული განახლებების დამუშავება
drawRect() მეთოდი კარგი იყო ცალკეული პიქსელების განახლებების გამოსაყენებლად მათი მიღებისას, მაგრამ იყო ერთი სისუსტე: განახლებების დიდმა პარტიამ, რომელიც ერთბაშად მოვიდა, შეიძლება გამოიწვიოს ბრაუზერების შენელება. ჩვენ გვესმოდა, რომ საბჭოს სტატუსის განახლებები შეიძლება ძალიან ხშირად მოხდეს, ამიტომ პრობლემა როგორმე უნდა მოგვარებულიყო.
იმის ნაცვლად, რომ დაუყოვნებლივ გადაგვეხატა ტილო ყოველ ჯერზე, როდესაც განახლება მიიღება ვებსოკეტის საშუალებით, ჩვენ გადავწყვიტეთ, რომ ის ისე გაგვეკეთებინა, რომ ვებსოკეტის განახლებები, რომლებიც ერთსა და იმავე დროს მოდის, შესაძლებელი იყოს ჯგუფური და მასობრივად გადაცემა. ამის მისაღწევად ორი ცვლილება განხორციელდა:
- შეწყვიტე drawRect()-ის გამოყენება - აღმოვაჩინეთ მოსახერხებელი გზაგანაახლეთ მრავალი პიქსელი ერთდროულად putImageData() გამოყენებით.
- ტილოს რენდერის გადატანა requestAnimationFrame ციკლში.
რენდერის ანიმაციის მარყუჟში გადატანით, ჩვენ შევძელით დაუყოვნებლივ ჩაგვეწერა ვებსოკეტის განახლებები ArrayBuffer-ზე, ხოლო რეალური რენდერის გადადება. ყველა websocket განახლება, რომელიც მოდის ჩარჩოებს შორის (დაახლოებით 16 ms) დაჯგუფებული და ერთდროულად გადაიცემა. requestAnimationFrame-ის გამოყენების წყალობით, თუ რენდერირებას ძალიან დიდი დრო დასჭირდა (16 ms-ზე მეტი), ეს გავლენას მოახდენდა მხოლოდ ტილოს განახლების სიხშირეზე (ვიდრე მთელი ბრაუზერის მუშაობის შემცირებას).
ტილოსთან ურთიერთობა
მნიშვნელოვანია აღინიშნოს, რომ ტილო იყო საჭირო იმისათვის, რომ მომხმარებლებისთვის უფრო მოსახერხებელი ყოფილიყო სისტემასთან ურთიერთობა. ურთიერთქმედების მთავარი სცენარი არის ფილების განთავსება ტილოზე.
მაგრამ თითოეული პიქსელის ზუსტი რენდერის გაკეთება 1:1 მასშტაბით ძალიან რთული იქნება და შეცდომებს არ ავიცილებთ თავიდან. ასე რომ, ჩვენ გვჭირდებოდა (დიდი!) მასშტაბირება. გარდა ამისა, მომხმარებლებს სჭირდებოდათ ტილოზე ადვილად ნავიგაცია, რადგან ის ძალიან დიდი იყო ეკრანების უმეტესობისთვის (განსაკუთრებით მასშტაბირების გამოყენებისას).
მასშტაბირება
ვინაიდან მომხმარებლებს შეეძლოთ ფილების განთავსება ხუთ წუთში ერთხელ, განლაგების შეცდომები მათთვის განსაკუთრებით იმედგაცრუებული იქნებოდა. საჭირო იყო ისეთი ფაქტორის გადიდების განხორციელება, რომ ფილა საკმარისად დიდი ყოფილიყო და ადვილად მოთავსებულიყო Სწორი ადგილი. ეს განსაკუთრებით მნიშვნელოვანი იყო სენსორულ მოწყობილობებზე.
ჩვენ განვახორციელეთ 40x მასშტაბირება, ანუ თითოეულ ფილას ჰქონდა ზომა 40x40. ჩვენ შევფუთეთ ელემენტი