[Tutorial] Load map nhanh như dota ?!

vuongkkk

T.E.T.Я.I.S
Tham gia ngày
22/5/10
Bài viết
588
Reaction score
844
Dota allstars loading time !?
Source : http://www.thehelper.net/forums/showthread.php/14918-Dota-allstars-loading-time!
True.Rus đã giảm được thời gian load map 3 phút xuống còn chưa đầy 20 giây!

Bản dota 5.84b có khoảng 10k strings. Loại bỏ vấn đề về size map thì chỉ còn cách giải thích duy nhất đó là do string bị phân mảnh. Với những ai gặp vấn đề time load map thì chắc chắn đây là căn nguyên vấn đề. Nếu ko có string, bản 6.01 có thể load xong trong vòng 30 giây

Đã tìm ra được nguyên do vấn đề, nhưng tại sao string lại bị phân mảnh???

Thực ra việc phân mảnh string rất dễ xảy ra
Tạo item A
Thay đổi 1 số miêu tả của item A
Save
Tạo item B
Thay đổi 1 số miêu tả của item B
Save
Quay lại item A
Hoàn thành nốt miêu tả cho item A
Save

Thế là phân mảnh rồi. Giờ hãy tưởng tượng đến viễn cảnh có hàng nghìn thay đổi về items/abilities/heroes (updated/changed/created) mỗi 50 phiên bản.

Mỗi ability/unit/item được gán 4 kí tự 'code'. Những gì mà WE làm là phân chia tất cả những custom abilites thành 2 file. The phần liên quan đến hoạt động của war3 (damage/duration/effect, ...) vào file w3a and và phần string vào wts file (file này bao gồm tất cả string trong map).

Theo lý thuyết thì khi load map, game engine cố nhặt từng phần miêu tả trở lại ability. Nó search kiểu tìm lần lượt theo thứ tự trong string file 4 ký tự 'code' và ghép nó vào từng trường của ability/item.

Kể cả việc nạp loading screen trước khi vào game (trước khi đếm 5..4..3..2..1..) cũng mất 1 khoảng thời gian

Lại vấn đề string. Map description có 1863 string, Kể cả nó có nằm trong top 5 string đầu tiên. Bằng cách delete file string thì việc load nó chả tốn tí thời gian nào. Căn bản là vì kiểu search, từng string 1 cho đến khi tìm thấy cái khớp. Nên mỗi lần load screen picture, nó lại duyệt 1863 string, tương tự với các miêu tả của ability

Tôi đã PM lại Neichus về việc sửa map với string file. Có 1 cách là:

1. Delete .wts file
2. Mở map editor
3. Copy and paste(ko phải là import) tất cả các miêu tả lại
4. Save map

Làm thế sẽ sinh ra 1 file wts mới theo đúng tuần tự.
1 chú ý nữa là miêu tả cho creep, 1 vài miêu tả ko hề cần thiết cho những unit kiểu này, để chúng trống vì nhiều string đống nghĩa có nhiều thứ cho game engine search.

Chính xác là thế.
Tôi có 1 map ver 6.0 với 0 description và chỉ load trong in 20/30 seconds!

NHưng tôi nghe nói có thằng cha nào đó đã viết để làm điều đó tự động thay vì PASTING TẤT CẢ miêu tả lại như ý nêu trên (nghĩ thôi đã thấy khiếp)

Các phần mềm có thể giúp load map nhanh hơn
Wc3MapOptimizer của Vexorian
Widgetizer của PitzerMike
Ultimate Map SLK Optimizer của u9shasure (từ bbs.uuu9.com = đồ Tàu )

Những phần mềm này hoàn toàn stack (dùng kết hợp) với nhau !

Thực nghiệm khi kết hợp các phần mềm trên
Source : http://www.wc3c.net/showthread.php?p=1027540#post1027540
Thử nghiệm với 1 map : 117s load time / 4402 kb thì
- SLK opt only for BLP and MDX (mip2) + Widgetizer + Vex Opt (no attributes) = 67s load time / 3740 kb
- SLK opt only for BLP and MDX (mip2) + Widgetizer + Vex Opt (attributes) = 67s load time / 4163 kb
- Widgetizer + Vex Opt = 67s load time / 4053 kb
- SLK Opt (opt+clean) + Vex Opt = 62s load time / 3862 kb + broken models + broken units (units ko còn hiện trong map) + .... (quá dài để liệt kê)
- SLK Opt (opt) + Vex Opt = 66s load time / 3965 kb + broken units (units ko còn hiện trong map)
- SLK Opt (ko tích OPTION) = cleaned war3map.wts

Chỉ dùng đơn lẻ từng phần mềm
- SLK Opt alone = 69s / ~3650 kb
- Widgetizer alone = 68s / ~4120 kb
- Vex Opt alone = 97s / ~3440 kb

Thời gian cần để opt xong :
- Widgetizer = 8min 42s
- SLK Opt (nothing checked) = 33s
- SLK Opt (opt+clean) = 97s
- Vex Opt (no attribute) = 13s

BLP compression :
- Dường như kill 1 số .blp (ko hiện hoặc chỉ 1 màu đen)

mip2 :
- Khiến tất cả custom models đen sì

Có lẽ SLK Opt vẫn cần fix nhiều.

Qua đó mà ta có cách thức để tích hợp nhắm đến việc dung hòa size map + load time :
- Widgetizer (same thing) + SLK Opt (optimize only) + Vex Opt (finalizes again)
- SLK Opt (chỉ mip1 or mip16) + Widgetizer (dùng những option căn bản) + Vex Opt
có thể loại trừ SLK opt nếu SLK Opt làm hỏng 1 số cái

- safety: Widgetizer > SLK Opt
- speed: SLK Opt > Widgetizer
- load time: Widgetizer = SLK Opt (ai để ý nếu chỉ chênh 1 giây?)

Nếu ko quan tâm size map mà tập trung cho việc tối ưu load time (để chơi lan chả hạn) :
- SLK Opt + Vex Opt = Nếu ko muốn đợi
- Widgetizer + Vex Opt = cách an toàn hơn

Nếu chỉ muốn tối giảm map size (ko quan tâm time load map) :

- chỉ dùng Vex Opt
 
Chỉnh sửa cuối:
Cách thức kết hợp các phần mềm
Đấy là cách của người ta chưa có kiểm chứng!
Còn cách của tớ đã qua kiểm chứng là như sau:

Cách thức an toàn, tối đa size map và giảm 1 phần time load map:
Thực ra với kết hợp 3 phần mềm này theo các kiểu đều được hết!
Miễn là
- SLK Opt chỉ chọn option: Opt war3map.wts và Opt war3map.j
- Widgetizer thì tích như mình, bỏ hết Remove Unused Trig/Abil/...
Widgetizer.JPG
- Vex Opt dùng cuối cùng với các option chọn như tut http://forum.gamevn.com/showthread....ich-cho-viec-lam-map-&p=13507618#post13507618
Thì OK!

Cách thức tối đa size map và time load map:
- Đầu tiên phải đảm bảo rằng thứ tự của các rawcode phải đúng nếu là do tự sinh:
  • Sai: A001, A003, A004 (thiếu A002 do làm rồi delete)
  • Đúng: A001, A002, A003
- Widgetizer

Widgetizer1.JPG

- SLK opt

SLK Opt 1.JPG

- Cuối cùng là Vex Opt với opt vẫn như ở trên

Note:
- Hãy để Vex Opt làm việc cuối cùng vì nó là phần mềm tối ưu size map chất lượng nhất và để đạt hiệu quả cao nhất
- Về tốc độ load map, làm theo cách 2 thì map các cậu nhanh hơn dota trừ khi dung lượng map lớn hơn

Download 3 tool nói trên:
http://forum.gamevn.com/showthread....ich-cho-viec-lam-map-&p=13507618#post13507618

Credits:
Tom_Kazansky
wc3c.net and Chocobo
thehelper.net and SD_Ryoko
forum.gamevn.com and Maiev Shadowsong
 
Chỉnh sửa cuối:
sao lại phải post 2 bài?
sao Widgetizer lại bỏ hết option thế?
 
1 số thứ khác liên quan đến vấn đề tốc độ load map

  1. Các Object được đặt sẵn = WE (units/items/doodads/rects/effects....)
  2. Các trigger chạy lúc Map Initialization
    Hoàn toàn có thể thay = event Time elapsed (nhưng nhớ theo đúng thứ tự sử dụng kẻo lỗi)​
  3. Code chạy với init: method onInit(struct), function Init(library/scope initializers)
    Gần như bất khả kháng, có thể thay = event Time elapsed (tùy cái thôi)​
  4. Số lượng và dung lượng file import (map 100 HQ Obj > ~5s so với 1000 normal Obj)
    Nên lựa chọn các file import với dung lượng < 150kb​
  5. Số lượng dòng code
    Bất khả kháng, ko phải nghĩ​

Tuy nhiên vấn đề lớn nhất đã được xử lý ở post trên, các yếu tố đang nêu là phụ nhưng cũng vẫn ảnh hưởng đến tốc độ load map có thể là rất lớn nếu xử lý ko tốt

---------- Post added at 11:18 ---------- Previous post was at 11:15 ----------

@Tom_Kazansky: sao lại phải post 2 bài?
Anh nhìn thời gian post của 2 bài đi. Với lại post đầu hoàn toàn là trích dẫn từ site khác!
@Tom_Kazansky: sao Widgetizer lại bỏ hết option thế?
Đấy là cách an toàn đảm bảo ko sai. Anh coi lại cách thứ 2 đi.
Vấn đề là cả Widgetizer và SLK Opt có khả năng bị sai rawcode ở 1 số chỗ và vì lý do nào đó mà 2 cái này sai hoàn toàn giống nhau, có lẽ do cùng nguyên lý hoạt động :-?

P/S: Đã thử nghiệm trên map thực tế
 
Chỉnh sửa cuối:
Theo cách này thì load map nhanh nhưng không protect map đc.Hiện nay protect object bằng cách chuyển hết qua slk mà tick vào cái clean slk and txt trong Widgetizer thì còn cái gì đâu ( sạch object hết trở lại map new).
1 số thứ khác liên quan đến vấn đề tốc độ load map
Các Object được đặt sẵn = WE (units/items/doodads/rects/effects....)
-vậy tại sao không tick vào Remove Unused Trigger/Unit/Ability vậy?
 
^ Cách nào tớ nói ko protect được map ?

Ko chọn Remove Unused Trigger/Unit/Ability là cách 1
Cách 2 nó có thể xảy ra sai rawcode (map mình bị :(( ) còn bạn nào ko bị thì dùng cách 2 là cách tối ưu cả tốc độ load map lẫn size
 
Cách thức an toàn, tối đa size map và giảm 1 phần time load map:
Thực ra với kết hợp 3 phần mềm này theo các kiểu đều được hết!
Miễn là
- SLK Opt chỉ chọn option: Opt war3map.wts và Opt war3map.j
- Widgetizer thì tích như mình, bỏ hết Remove Unused Trig/Abil/...

Đây.Theo như cái tick ở widgetizer thì không thể tick vào cái clean slk and txt.Nếu xài SLK Optimez rồi xài cái widgetizer theo cách cậu nói thì map sẽ mất toàn bộ object ( vì convert sang slk rồi mà còn clean nữa thì.... )
 
Anh thử chưa :|
Chả hiểu anh thử sao mà bị. Đây đã thử ko phải với 1 map, và đấy là lý do vì sao em gọi đấy là cách an toàn
Còn cách 2 em thử với các map khác đều được nhưng chả hiểu sao map proj em bị lỗi ....
Ai ko bị cứ cách 2 mà táng !

Còn thử nghiệm của thằng Chocobo, em đã thử với map của bản thân và hoàn toàn có thể tin tưởng và các thông số đó
Nhưng đừng quá để ý về số cụ thể chỉ nên so sánh giữa các cái thôi
Vì tốc độ có tăng nhiều hay ít còn tùy map nữa ....
 
Chỉnh sửa cuối:
sự thật cách của doom tớ đã thử và rất good trong map Hoth v1.00 >:D<
 
Cách của Doom là cách nào nhỉ ? Đưa ra cho mọi người tham khảo và học tập đi :D
 
Cho hỏi, sao map mình khóa = Wc3MapOptimizer của Vexorian mà mất tới 7-8 phút ( map có chưa tới 4mb ? ).
người ngoài hay muốn host click vào map cũng lag ( treo ~5s )
 
mình mở map bằng SLK opt thì nó báo chữ tàu là có ghi cái file sfmpq.dll gì đó,cho sau đó nén map thì chẳng có gì xảy ra,cửa sổ SLK opt tự tắt đi.

1-8.jpg
 
Chỉnh sửa cuối:
Download SLK opt ở địa chỉ này http://www.wc3c.net/showthread.php?t=101586 (Mình dùng cái này ko bị gì hết cũng là bản mới nhất rồi)

@phutu: hỏi, sao map mình khóa = Wc3MapOptimizer của Vexorian mà mất tới 7-8 phút ( map có chưa tới 4mb ? ).
người ngoài hay muốn host click vào map cũng lag ( treo ~5s )

Mình mới gặp 1 map như map của cậu có 1 lần và chỉ mất có 1 phút 46 giây để mở map đó
 
cho hỏi Load map nhanh chậm có phụ thuộc cấu hình máy chơi war ko?
 
Trường hợp cậu phutu01 thì hum qua mình mới để ý map bị như vậy nếu ko nhầm chính là do deprotect map đúng ko :-/

@Ranknjk: cho hỏi Load map nhanh chậm có phụ thuộc cấu hình máy chơi war ko?
Có nhưng rất ít
 
mình mở map bằng SLK opt thì nó báo chữ tàu là có ghi cái file sfmpq.dll gì đó,cho sau đó nén map thì chẳng có gì xảy ra,cửa sổ SLK opt tự tắt đi.
Trước tiên hãy thoát tất cả những gì đang chạy map cậu ( vd map đang còn chạy trong world editor hay warcraft 3 )

Cho hỏi, sao map mình khóa = Wc3MapOptimizer của Vexorian mà mất tới 7-8 phút ( map có chưa tới 4mb ? ).
người ngoài hay muốn host click vào map cũng lag ( treo ~5s )

Cái này nhiều yếu tố như số lượng object và trigger . Và theo nghiên cứu hiện tượng click vào map hay bị treo hoặc lag là do một số data trong object bạn chỉnh quá cao hoặc vượt mức ( như damage armor hay stats hero và hp quá lớn ).Trường hợp này xảy ra ở các map hero defense là chủ yếu ( X hero siege,Legend of the Dragon,.... )
Mún đỡ lag thì xài widgetez hay slk opt
 
Hãy thử theo cách của mình xem, mình thấy tiết kiệm được khá nhiều dung lượng map cũng như loading time.
- trước hết là widgetiger, y như cũ
- thứ 2 là slkopt, cũng để y như vậy, không bỏ chọn Remove Editor only files
- thứ 3 là phần mềm của Vex, mình chỉ bỏ chọn 3 cái: New buffer size, Zlib Deflate, Maintain (alltribute). Các bạn có thể tick thử Zlib với Maintain nếu thấy có bị mất gì thì untick 2 cái đó ra. Còn nhiu thì để y như cũ (mặc định).
 
Back
Top