MLO არის GTA V-ის მორგებული ინტერიერი - ოთახები, პორტალები და მათში მოთავსებული prop-ები - და FiveM-ზე ის ნებისმიერი სხვა resource-ივით ყენდება: საქაღალდე fxmanifest.lua-ით და stream საქაღალდით, სადაც მოდელის, ტექსტურისა და collision-ის ფაილებია. stream საქაღალდის ყოველ ფაილს ჩამოტვირთავს ყოველი მოთამაშე, ვინც შემოდის, და ყოველი ფაილი კლიენტის მეხსიერებაში იტვირთება, როცა მოთამაშე მას უახლოვდება. აქედან გამოდის ორი წესი, რომელიც წყვეტს, კარგად იმუშავებს თუ არა რუკებით დატვირთული სერვერი: ცალკეული asset-ები იმდენად პატარა შეინარჩუნე, რომ FXServer მათზე არ გაფრთხილებდეს, ხოლო ჯამი იმდენად პატარა, რომ პირველი შესვლები და ტექსტურების მეხსიერება გონივრულ ფარგლებში დარჩეს. ეს გზამკვლევი ხსნის, როგორ მუშაობს streaming, manifest-ის რომელი ხაზები სჭირდება MLO-ს, ფაილების ტიპებს, რუკებს შორის კონფლიქტებს და როგორ შეამცირო გაბერილი asset-ების პაკეტი.
როგორ მუშაობს streaming FiveM-ზე#
GTA V სამყაროს ნაწილ-ნაწილ ტვირთავს, როცა მასში მოძრაობ, დისკზე არსებული არქივებიდან. FiveM ამას ზემოდან ფენას ამატებს: resource-ებს შეუძლიათ დამატებითი ფაილების მიწოდება, რომლებსაც კლიენტი ისე არეგისტრირებს, თითქოს თამაშის საკუთარი არქივების ნაწილი იყოს. ეს არის stream-ით მიწოდებული asset-ები.
- resource-ში
stream-ად წოდებული საქაღალდის შიგნით არსებული ნებისმიერი ფაილი streaming-ისთვის ავტომატურად რეგისტრირდება. ქვესაქაღალდეებიstream-ის შიგნით ნორმალურია და ორგანიზებაში გეხმარება. - პირველი შესვლისას კლიენტი ყოველ stream ფაილს სერვერის HTTP endpoint-იდან TCP
30120-ზე ჩამოტვირთავს და თავის ლოკალურ ქეშში ინახავს. შემდგომი შესვლები მხოლოდ შეცვლილ ფაილებს იღებს. - streaming ფაილის სახელით მუშაობს. ფაილი
v_ilev_door.ydrშენს resource-ში თამაშის იმავე სახელის ფაილს ანაცვლებს. ორი resource, რომლებიც ერთი და იმავე სახელის ფაილებს აწვდის, კონფლიქტშია, და ერთ-ერთი ჩუმად აგებს. - კლიენტი stream asset-ებს მეხსიერებაში ტვირთავს, როცა მოთამაშე უახლოვდება რამეს, რაც მათ იყენებს, ზუსტად ისე, როგორც საბაზისო თამაშისთვის.
ასე რომ, stream asset-ები სამ რამეს ხარჯავს: სერვერის დისკს და გამტარუნარიანობას ჩამოტვირთვებისთვის, კლიენტის ჩამოტვირთვის დროს პირველი შესვლისას და კლიენტის მეხსიერებას თამაშისას. სერვერის CPU-ს ისინი თითქმის არაფერს უჯდება. რუკების პაკეტი შენს სერვერს tick-ს არ უნელებს; ის შესვლას ანელებს და შეიძლება თამაშმა დატვირთულ ადგილას ტექსტურები ვერ ჩატვირთოს.
ფაილების ტიპები, რომლებსაც ნახავ#
| გაფართოება | რას შეიცავს |
|---|---|
.ymap | განლაგებები: რომელი ობიექტი სად დგას სამყაროში |
.ytyp | არქეტიპების განსაზღვრებები, მათ შორის MLO ინტერიერები და მათი ოთახები |
.ydr | ერთი drawable მოდელი |
.ydd | drawable-ების ლექსიკონი, ხშირად ტანსაცმელი ან prop-ები |
.ytd | ტექსტურების ლექსიკონი |
.ybn | collision-ის საზღვრები |
.yft | ფრაგმენტული მოდელები, მაგალითად მანქანები და მსხვრევადი ობიექტები |
.ycd | ანიმაციის კლიპები |
MLO პაკეტი ჩვეულებრივ შედგება .ytyp-ისგან, რომელიც ინტერიერს განსაზღვრავს, .ymap-ისგან, რომელიც მას სამყაროში ათავსებს, .ydr და .ytd ფაილებისგან გარსისა და მისი prop-ებისთვის, და .ybn ფაილებისგან collision-ისთვის. რუკის ცვლილება, რომელიც მხოლოდ გარე prop-ებს ამატებს, შეიძლება მხოლოდ .ymap და რამდენიმე მოდელი იყოს. მანქანები ცალკე თემაა საკუთარი meta ფაილებით, აღწერილი FiveM-ის მანქანებსა და addon მანქანებში.
ხელსაწყოები, რომლებითაც ხალხი ამათ ქმნის და ამოწმებს, არის CodeWalker სანახავად და განსათავსებლად, OpenIV თამაშის არქივების დასათვალიერებლად და Blender-ის Sollumz დამატება მოდელირებისთვის. დასრულებული MLO-ს დასაყენებლად არცერთი არ გჭირდება, მაგრამ CodeWalker-ის ქონა ღირს კონფლიქტის დიაგნოსტიკისთვის.
MLO-ს დაყენება#
ტიპური MLO resource ასე გამოიყურება:
resources/ [maps]/ cfx_pillbox_hospital/ fxmanifest.lua stream/ pillbox_shell.ydr pillbox_shell.ytd pillbox_col.ybn pillbox.ytyp pillbox_mlo.ymapfx_version 'cerulean'game 'gta5'this_is_a_map 'yes'data_file 'DLC_ITYP_REQUEST' 'stream/pillbox.ytyp'this_is_a_map 'yes' resource-ს რუკის შიგთავსად მონიშნავს, რომ კლიენტმა მისი stream ფაილები შესაბამისად დაამუშაოს. DLC_ITYP_REQUEST ხაზი არეგისტრირებს არქეტიპის ფაილს, რომელიც ინტერიერს განსაზღვრავს; MLO პაკეტების უმეტესობა მას შეიცავს და ადგილზე უნდა დატოვო, მაშინაც კი, როცა .ytyp მის გარეშეც ჩაიტვირთებოდა. ზოგიერთ პაკეტს ასევე მოყვება interiorproxies.meta, რომელიც ასე რეგისტრირდება:
files { 'interiorproxies.meta' }data_file 'INTERIOR_PROXY_ORDER_FILE' 'interiorproxies.meta'შემდეგ დაამატე resource server.cfg-ში:
ensure cfx_pillbox_hospitalკვადრატულ ფრჩხილებში მოთავსებული საქაღალდეები, როგორიცაა [maps], კონტეინერებია და არა resource-ები, ამიტომ ensure ხაზი მხოლოდ resource-ის სახელს იღებს. სერვერის მუშაობისას დამატებულ ახალ საქაღალდეს კონსოლში refresh სჭირდება, სანამ ensure მას იპოვის. ensure-ის თანმიმდევრობა და ფაილის დანარჩენი ნაწილი აღწერილია FiveM-ის server.cfg-ის ახსნაში.
oversized asset-ის გაფრთხილება#
FXServer stream ფაილებს გაშვებისას ამოწმებს და გაფრთხილებს ყველაზე, რაც კლიენტზე ზედმეტ მეხსიერებას დაიკავებს:
Asset pillbox_shell.ytd uses 38.0 MiB of physical memory. Oversized assets can and WILLlead to streaming issues (such as models not loading/rendering).ზღვარი არის 16 MiB ფიზიკური მეხსიერება თითო asset-ზე. გაფრთხილება ზუსტად იმას ნიშნავს, რასაც ამბობს: თამაშის streaming სისტემა ამაზე გაცილებით პატარა asset-ებისთვის აიგო, და ერთი 38 MiB-იანი ტექსტურების ლექსიკონი ეჯიბრება ყველაფერს დანარჩენს, რის ჩატვირთვასაც კლიენტი ახლომახლო ცდილობს. სიმპტომებია ტექსტურები, რომლებიც ბუნდოვანი რჩება, შენობები, რომლებიც გვიან ჩნდება, და ცუდ შემთხვევებში ქალაქის ნაწილები, რომლებიც oversized asset-ის გარშემო საერთოდ არ იტვირთება.
თითქმის ყოველთვის მიზეზი ტექსტურებია. შემქმნელმა 4096-ზე 4096 ტექსტურები გამოიტანა ზედაპირებისთვის, რომლებსაც მოთამაშე სამი მეტრიდან ხედავს, ან შეუკუმშავი ფორმატები დატოვა. გამოსწორება ნიშნავს .ytd-ის გახსნას, დიდი ტექსტურების 2048-მდე ან 1024-მდე შემცირებას, შეკუმშულ ფორმატში შენახვას და იმის შემოწმებას, რომ ხილული არაფერი გაუარესდა. ტიპურ გადაჭარბებულად აგებულ MLO-ზე ეს ზომას ანახევრებს ისე, რომ თამაშში ვერავინ შეამჩნევს. თუ ფაილებს თავად არ გინდა შეეხო, გაფრთხილება შემქმნელისთვის დასაბრუნებლად სამართლიანი რამაა; ფასიან MLO-ს, რომელსაც რამდენიმე oversized asset მოყვება, ხარისხის პრობლემა აქვს.
ნუ გაასწორებ ამას მოდელების დაბალი დეტალიზაციის ვერსიების (LOD) წაშლით, რასაც ზოგიერთი გზამკვლევი ადგილის დასაზოგად გთავაზობს. LOD-ები არის ის, რასაც თამაში შორიდან ხატავს; მათ გარეშე ობიექტები არსაიდან ამოხტება.
ჯამური ზომა და პირველი შესვლები#
საკმარისი არ არის, რომ თითოეული asset ზომის შემოწმებას გადის. ყოველი ახალი მოთამაშე მთელ კომპლექტს ჩამოტვირთავს, და კლიენტი ახლომახლო ყველაფრის ტექსტურებს ერთდროულად ინახავს მეხსიერებაში. სერვერმა ორმოცი MLO-თი და სამასი მანქანით შეიძლება ახალ მოთამაშეს რამდენიმე გიგაბაიტის ჩამოტვირთვა სთხოვოს, სანამ ის პერსონაჟის მენიუს დაინახავს.
რა ეხმარება სინამდვილეში, სარგებლის მიხედვით დალაგებული:
- წაშალე ის, რასაც არავინ იყენებს. ინტერიერები სამუშაოებისთვის, რომლებიც აღარ გაქვს, მეორე პოლიციის განყოფილება ძველი რუკიდან, სატესტო prop-ები. ყოველი გამოუყენებელი resource მაინც ჩამოიტვირთება.
- შეამცირე ყველაზე დიდი ტექსტურები. დაალაგე შენი
streamსაქაღალდეები ზომით და დაიწყე ზემოდან; ათი ყველაზე დიდი ფაილი ჩვეულებრივ პრობლემის უმეტესი ნაწილია. - მოერიდე დუბლიკატებს. ორი რუკის პაკეტი, რომლებიც ერთსა და იმავე prop-ებს სხვადასხვა სახელით აწვდის, ჩამოტვირთვას აორმაგებს. ორი, რომლებიც მათ ერთი და იმავე სახელით აწვდის, ამის ნაცვლად კონფლიქტშია, და ეს უარესია.
- უთხარი მოთამაშეებს. ჩატვირთვის ეკრანი, რომელიც ამბობს, რომ პირველი შესვლა დიდ მოცულობას ჩამოტვირთავს, სჯობს support არხს, სავსეს ხალხით, რომლებსაც ჰგონიათ, რომ სერვერი გაიყინა.
მოთამაშეებსაც შეუძლიათ დახმარება თავიანთ მხარეს: FiveM-ის ახალ კლიენტებს პარამეტრებში აქვთ ტექსტურების გაფართოებული ბიუჯეტის ოფცია, რომელიც stream ტექსტურებს მეტ ადგილს აძლევს მანქანებზე, სადაც საკმარისი ვიდეომეხსიერებაა. ეს შემოვლითი გზაა და არა შემცირების შეწყვეტის მიზეზი.
სერვერის მხარეს asset-ები დისკიდან TCP endpoint-ით მიეწოდება. სწრაფი მეხსიერება სერვერის ნახევარს სწრაფს ხდის, დანარჩენი კი მოთამაშის საკუთარი კავშირია. RE:NODE-ზე ყველა გეგმა NVMe-ზეა და გამტარუნარიანობა შეუზღუდავია, რაც ნიშნავს, რომ გიგაბაიტზე ანგარიშს არ გიწერენ - ეს არ არის მოწვევა, რომ ყოველ ახალ მოთამაშეს ხუთი გიგაბაიტი ჩამოატვირთინო, და მოთამაშის კავშირი ისედაც ყოველთვის ნელი ბოლო იქნებოდა. გამტარუნარიანობა და სამართლიანი გამოყენება ხსნის, რას ნიშნავს ეს პრაქტიკაში.
კონფლიქტები რუკებს შორის#
ორი რუკის resource შეიძლება სამი გზით შეეჯახოს, და თითოეული თამაშში სხვანაირად გამოიყურება.
ერთი და იგივე ადგილი. ერთსა და იმავე სივრცეში განთავსებული ორი MLO - ვთქვათ, Mission Row-ის პოლიციის განყოფილების ორი სხვადასხვა ვერსია - ერთმანეთს ეფარება. მოთამაშეები ხედავენ კედლებს კედლებში, ცვივიან იატაკში, სადაც ერთი ინტერიერის collision მეორის მოდელს არ ემთხვევა, ან პოულობენ კარებს, რომლებიც სიცარიელეში იღება. ერთ ადგილას მხოლოდ ერთი ინტერიერი; მეორე წაშალე.
ფაილის ერთი და იგივე სახელი. streaming ფაილის სახელით მუშაობს, ამიტომ ორი resource, რომლებიც prop_desk_01.ydr-ს განსხვავებული შიგთავსით აწვდის, კონფლიქტშია. რომელი იმარჯვებს, ჩატვირთვის თანმიმდევრობაზეა დამოკიდებული, და ეს შეიძლება გადატვირთვის შემდეგ შეიცვალოს. გადაარქვი სახელი ერთ მხარეს ან წაშალე დუბლიკატი.
vanilla ინტერიერები და IPL loader-ები. resource-ები, როგორიცაა bob74_ipl, GTA Online-ის ინტერიერებსა და მათ ვარიანტებს ტვირთავს. MLO, რომელიც ამ ინტერიერებიდან რომელიმეს ანაცვლებს, loader-ს ებრძვის. ჩანაცვლების დაყენებისას გამორთე ეს ინტერიერი loader-ის კონფიგურაციაში.
როცა კონფლიქტს ეჭვობ, გააჩერე რუკის resource-ების ნახევარი, გადატვირთე და შეამოწმე ეს ადგილი. CodeWalker, ჩატვირთული შენი სერვერის ფაილებით, გაჩვენებს, რა სად არის განთავსებული, და ეს უფრო სწრაფია, ვიდრე resource-ების სიით სიარული.
ინტერიერები თამაშში: entity set-ები, collision და ტელეპორტები#
ბევრ MLO-ს აქვს არჩევითი ნაწილები, სახელად entity set-ები - ავეჯის სხვადასხვა განლაგება, დაზიანებული და მთელი ვერსია, დამატებითი ოთახები - რომლებიც სკრიპტიდან ირთვება:
-- client sidelocal interior = GetInteriorAtCoords(311.0, -594.0, 43.0)ActivateInteriorEntitySet(interior, "pillbox_reception")RefreshInterior(interior)MLO-ს დოკუმენტაცია მის entity set-ებს ასახელებს. არაფერი ჩანს, სანამ რამე მათ არ გაააქტიურებს, და სწორედ ამიტომ შეიძლება ინტერიერი დაყენების შემდეგ ცარიელი ჩანდეს.
ინტერიერში ტელეპორტის შემდეგ იატაკში ჩავარდნა collision-ის დროის პრობლემაა და არა გაფუჭებული MLO. მოთამაშე ჩამოდის მანამ, სანამ ამ ადგილის collision ჩაიტვირთება. ტელეპორტის სკრიპტებმა collision უნდა მოითხოვონ და დაელოდონ:
RequestCollisionAtCoord(x, y, z)while not HasCollisionLoadedAroundEntity(PlayerPedId()) do Wait(0)endთუ მოთამაშეები იატაკში ჩვეულებრივად შესვლისას ცვივიან, .ybn აკლია, დაზიანებულია ან სხვა რუკასთან კონფლიქტშია.
თამაშის build-საც აქვს მნიშვნელობა. MLO, რომელიც GTA Online-ის ბოლო განახლების prop-ებით აიგო, მხოლოდ მაშინ მუშაობს, თუ სერვერი sv_enforceGameBuild-ით მინიმუმ ამ build-ს აიძულებს. შემქმნელმა უნდა თქვას, რომელი build სჭირდება MLO-ს; თუ თამაშში prop-ები აკლია, ჯერ ეს შეამოწმე.
რუკებით დატვირთული სერვერის მართვადად შენარჩუნება#
დიდ სერვერებს საბოლოოდ ათობით რუკის resource უგროვდება. რამდენიმე ჩვევა ამას საიდუმლოდ ქცევისგან იცავს:
- ერთი საქაღალდე თითო დანიშნულებაზე.
[maps]MLO-ებისთვის,[vehicles]მანქანებისთვის,[props]პატარა დამატებებისთვის. უფრო ადვილია შუაზე გაყოფა, უფრო ადვილია გაზომვა. - სია, რისთვის არის თითოეული რუკა. რომელი სამუშაო იყენებს, ვინ იყიდა, საიდან, რომელი build სჭირდება. როცა შემქმნელის ანგარიში იცვლება ან ლიცენზია გადადის, ეს გჭირდება.
- გაზომე მანამდე და მერე. ჩაიწერე
streamსაქაღალდეების ჯამური ზომა, როცა პაკეტს ამატებ, რომ იცოდე, რა უჯდება თითოეული დამატება შენს ახალ მოთამაშეებს. - გააკეთე resource-ების backup და არა მხოლოდ მონაცემთა ბაზის. ფასიანი MLO, რომლის ჩამოტვირთვაც აღარ შეგიძლია, დაკარგულია, თუ საქაღალდე წავა. backup-ები, რომლებიც მართლა აღდგება აქაც ისევე ეხება, როგორც მონაცემთა ბაზას.
RE:NODE-ზე შეგიძლია მთელი რუკის resource ფაილების მენეჯერში გადაათრიო და არქივები ადგილზევე იხსნება, ან, თუ პაკეტი დიდია, SFTP-ით ატვირთო; SFTP და ფაილების მენეჯერი კავშირის დეტალებს შეიცავს. backup-ები პანელიდან ეშვება, შეიძლება დაიგეგმოს და მანქანის გარეთ ინახება.
პრობლემების მოგვარება#
"Oversized assets can and WILL lead to streaming issues". asset, რომელიც 16 MiB ფიზიკურ მეხსიერებას აღემატება, ჩვეულებრივ ტექსტურების ლექსიკონი. შეამცირე მისი ტექსტურები ან სთხოვე შემქმნელს.
ინტერიერი უხილავი ან ცარიელია. აკლია DLC_ITYP_REQUEST ხაზი, resource არ არის გაშვებული, ან მისი entity set-ები არ არის გააქტიურებული.
მოთამაშეები იატაკში ცვივიან. ტელეპორტის შემდეგ collision ჯერ არ ჩატვირთულა, ან .ybn აკლია ან კონფლიქტშია.
ტექსტურები ერთ ადგილას ბუნდოვანი რჩება. ამ ადგილის ახლოს ზედმეტად ბევრი stream შიგთავსია კლიენტის ტექსტურების ბიუჯეტისთვის. შეამცირე ტექსტურები ახლომდებარე პაკეტებში.
ორი შენობა ერთ ადგილას. ორი რუკა ერთსა და იმავე ადგილას, ან MLO, რომელიც IPL loader-ს ებრძვის. დატოვე ერთი.
რუკა ზოგიერთ მოთამაშესთან მუშაობს, ზოგთან არა. მოთამაშეები თამაშის ძველ build-ზე, ან escrow-ით დაცული შიგთავსი, მიბმული key-ზე, რომელიც შეიცვალა. შეამოწმე sv_enforceGameBuild და კონსოლი უფლების შეცდომებზე.
FAQ#
რა არის MLO FiveM-ში?
მორგებული ინტერიერი: ოთახებისა და პორტალების ნაკრები, განსაზღვრული .ytyp ფაილში, სამყაროში განთავსებული .ymap-ით, საკუთარი მოდელებით, ტექსტურებითა და collision-ით. ის resource-ად ყენდება stream საქაღალდით, როგორც რუკის ნებისმიერი სხვა შიგთავსი.
MLO-ები FiveM სერვერს ალაგებს?
სერვერზე არა - stream ფაილები დისკიდან მიეწოდება და CPU-ს ცოტას ხარჯავს. ისინი კლიენტს უჯდება: ჩამოტვირთვის დრო პირველი შესვლისას და მეხსიერება თამაშისას. oversized asset-ები იწვევს დაკარგულ ტექსტურებს და ნელ ჩატვირთვას, რასაც მოთამაშეები ხშირად ლაგს ეძახიან.
რა ლიმიტი აქვს stream asset-ს?
FXServer გაფრთხილებს ნებისმიერ asset-ზე, რომელიც 16 MiB ფიზიკურ მეხსიერებას აღემატება. ის მაინც იტვირთება, მაგრამ დიდი asset-ები ახლომახლო ყველაფერს ეჯიბრება და streaming-ის პრობლემებს იწვევს. თითოეული asset ზღვარს ქვემოთ შეინარჩუნე.
რატომ აფუჭებს ჩემი ორი რუკა ერთმანეთს?
ან ერთსა და იმავე ადგილს იკავებენ, ან ერთი და იმავე სახელის ფაილებს აწვდიან, ან MLO ანაცვლებს ინტერიერს, რომელსაც IPL loader-იც ტვირთავს. წაშალე ერთი, გადაარქვი სახელი დუბლიკატს ან გამორთე ინტერიერი loader-ში.
მოთამაშეებს ყოველ შესვლაზე უწევთ რუკების ჩამოტვირთვა?
არა. stream ფაილები პირველი შესვლის შემდეგ მოთამაშის მანქანაზე ქეშირდება. თავიდან მხოლოდ მას შემდეგ შეცვლილი ფაილები ჩამოიტვირთება, და სწორედ ამიტომ ნიშნავს დიდი პაკეტის განახლება ყველასთვის კიდევ ერთ გრძელ შესვლას.




კომენტარები
სრულიად ანონიმურად: ანგარიშის, ელფოსტის და cookie-ის გარეშე. ინახება მხოლოდ სახელი, ტექსტი და დრო - სხვა არაფერი. ბმულების რაოდენობა ლიმიტირებულია.