[Tutorial] Reducing Lag

Thảo luận trong 'World Editor' bắt đầu bởi Maiev Shadowsong, 4/11/09.

  1. Maiev Shadowsong

    Maiev Shadowsong Donkey Kong

    Tham gia ngày:
    24/6/09
    Bài viết:
    355
    Nơi ở:
    Pikachu Hội
    Reducing Lag
    By: [​IMG]Darthfett


    Bạn có thường xuyên nghe người chơi phàn nàn về một bản đồ "lag" hoặc tạm dừng đột ngột trong khi bản đồ của bạn đang chạy ? ? ?
    Hướng dẫn này sẽ cho bạn biết một chút về những nguyên nhân của "lag", và dạy cho bạn làm thế nào để tránh "lag".

    1. Map Initialization Lag

    Lag xuất hiện khi bạn khởi đầu map

    Có vài nguyên nhân:

    A. Việc tạo Hero và Unit

    Tạo mới một Unit trong game mà ở đây chưa được load trước bởi game sẽ gây lag. Đưa nó vào map Initialization sẽ giúp bạn thoát khỏi phiền toái là bị giật trong game, nhưng map của bạn sẽ load lâu hơn.:P
    Nếu bạn không muốn gặp phải cả 2 phiền toái trên, bạn hãy thử làm một đoạn Cinematic sau khi game khởi đầu, người chơi sẽ không nhận thấy dấu hiệu game load lâu hay bị dừng đột ngột khi game bắt đầu!

    B. Lượng code "khủng khiếp"

    Nếu bạn có một lượng code lớn chạy trong Map Intialization, nó có thể gây ra một khoảng thời gian load map dài T_T. Đôi khi, vấn đề này chỉ xuất hiện sau khi game bắt đầu, hãy thử tạo một đoạn Cinematic, nó có thể giúp bạn phần nào. ( theo mình hiểu là map initialization chỉ load trước một số lượng code nhất định, nếu code trong map init quá nhiều thì sẽ có một số còn lại không được load! )

    C. Loading the Map

    Người chơi map cũng có thể bị lag nếu kích thước bản đồ của bạn là quá lớn. Nếu bản đồ của bạn ở kích thước Lớn hay Rất Lớn, thì vấn đề này chỉ có thể giải quyết bởi người chơi ( một Computer mạnh đó! ;) )

    2. Game Lag

    Bạn có thấy sau khi game bắt đầu, skill càng nhiều thì game ngày càng lag không ? Sau đây là nguyên nhân và khắc phục ( mình xin phép lấy thông tin từ tutorial về anti leak của bạn tom )

    A. Memory Leak ( hay rò rỉ bộ nhớ )
    1. Loại bỏ GUI gây rò rỉ
    [​IMG]Ẩn, click vào để đọc!
    [spoil]Memory Leaks là gì ? Memory Leaks là sự thất thoát (leak) những "handle object" (tạm dịch là vật có tính chất "handle", hay nói cách khác có type handle). Có rất nhiều type: unit, group (unit group), location (point), region, floating text,... nhưng những type kia đều là handle. Bất kì lúc nào, bạn tạo ra một handle thì bạn đã mất một phần bộ nhớ (trong trường hợp này có thể nói là RAM). Nếu bạn dùng xong handle này mà ko remove đi thì bạn đã bị thất thoát bộ nhớ và nếu thất thoát quá nhiều sẽ gây ra lag, rất nghiêm trọng.

    JASS là ngôn ngữ trong Warcraft, dùng để "scripting" (tôi chả dịch nổi, sorry) Map và AI. Trong đó trigger mà mọi người hay sử dụng là GUI (Graphic User Inteface - giao diện đồ họa cho người sử dụng), tức là phần giao diện của JASS.

    Custom Script đây là 1 "action" trong GUI cho phép ta viết 1 dòng JASS. Vì sự hạn chế của GUI nên ta phải sử dụng action này để "viết 1 dòng JASS" trong GUI và để xóa hết các "thất thoát bộ nhớ" (Memory Leaks)

    ----

    Các thứ có thể gây ra memory leak:

    Special Effects
    Groups <- unit group
    Points <- Location
    Units
    Regions
    Forces <- player group
    Lightning Effects
    Floating Text
    Countdown Timers
    (Còn nữa nhưng những thứ trên là những thứ hay đc dùng)

    Bây giờ Tom sẽ lấy ví dụ về các leak trên và làm thế nào để xóa.

    Unit Groups
    Mã:
    Unit Group Bad
        Events
        Conditions
        Actions
            Unit Group - Pick every unit in (Units in (Playable map area)) and do (Actions)
                Loop - Actions
                    Unit - Kill (Picked unit)
    
    Đó là leak group. Cách remove:
    Mã:
    Unit Group Good
        Events
        Conditions
        Actions
            Set Temp_Group = (Units in (Playable map area))
            Unit Group - Pick every unit in Temp_Group and do (Actions)
                Loop - Actions
                    Unit - Kill (Picked unit)
            Custom script:   call DestroyGroup (udg_Temp_Group)
    
    Đầu tiên tạo 1 variable có type là group, tên là Temp_Group (cái này thì tùy thôi) sau đó đặt variable này là group cần pick. Pick unit trong group variable đó, chạy action và destroy group variable trên. Các bạn nhớ rằng tên variable khi chuyển sang JASS sẽ phải thêm "udg_" ở đằng trước.

    Points

    Mã:
    Point Bad
        Events
        Conditions
        Actions
            Unit - Create 1 Footman for Player 1 (Red) at (Center of (Playable map area)) facing Default building facing degrees 
    Tạo 1 footman ở "giữa bản đồ", leak point "giữa bản đồ", leak này thật ra ko lớn nhưng nếu nhiều sẽ thành lớn. Mà các bạn biết ko, point đc sử dụng rất nhiều.
    "Giải quyết" cái point trên:
    Mã:
    Point Good
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Unit - Create 1 Footman for Player 1 (Red) at Temp_Point facing Default building facing degrees
            Custom script:   call RemoveLocation (udg_Temp_Point)
    
    Tạo 1 point variable trên là Temp_Point (tên thì tùy), set variable trên là point cần sử dụng, tạo unit ở point đó (sử dụng point này) và rồi remove point này.

    Special Effects
    Mã:
    Special Effect Bad
        Events
        Conditions
        Actions
            Special Effect - Create a special effect at (Center of (Playable map area)) using Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
    
    Có 2 leak, một là leak point, hai là leak special effect. Thật ra trong GUI đã có action để destroy special effect rồi. (Special Effect - Destroy Special Effect)
    Mã:
    Special Effect Good 1
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Special Effect - Create a special effect at Temp_Point using Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
            Special Effect - Destroy (Last created special effect)
            Custom script:   call RemoveLocation (udg_Temp_Point)
    
    Chú ý là có vài special effect, nếu destroy luôn ngay sau khi đc tạo ra thì sẽ ko có gì cả (Thunder Clap thì ko sao). Vì vậy ta phải đợi 1 chút rồi mới destroy.

    Mã:
    Special Effect Good 2
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Special Effect - Create a special effect at Temp_Point using Abilities\Spells\Undead\UnholyAura\UnholyAura.mdl
            Set Temp_SFX[(Integer A)] = (Last created special effect)
            Custom script:   call RemoveLocation (udg_Temp_Point)
            Wait 2.00 seconds
            Special Effect - Destroy Temp_SFX[(Integer A)]
    
    Ta có 1 special effect variable tên là Temp_SFX.
    Tạo 1 special effect ở giữa bản đồ, đợi 2 giây rồi destroy effect đó.

    Units
    Mã:
    Units Bad
        Events
        Conditions
        Actions
            Unit - Create 1 Dummy Caster for Player 1 (Red) at (Center of (Playable map area)) facing Default building facing degrees 
    Có 2 leak, một là point leak, hai là unit leak, dummy unit đc tạo ra xong thì ở đó, ko bị remove -> leak.
    Mã:
    Units Good
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Unit - Create 1 Dummy Caster for Player 1 (Red) at Temp_Point facing Default building facing degrees
            Custom script:   call RemoveLocation (udg_Temp_Point)
            Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
    
    Lệnh Unit - Add Timed Life thì đc dùng cho dummy unit, cái này hầu như ai dùng dummy unit cũng biết và đây là remove unit leak rồi.
    That pretty much covers all the major leaks problems people have in their maps. Here are a few more custom script functions you can use to remove other leaks that sometimes occur:

    Mã:
     Custom script: call DestroyForce( udg_Your_Variable ) //Player Group 
    Mã:
     Custom script:   call RemoveRect(udg_Your_Variable) //Region 
    Mã:
     Custom script: call DestroyLightning( udg_Your_Variable ) //Lightning Effect 
    Mã:
    Custom script: call DestroyTextTag( udg_Your_Variable ) //Floating Text 
    This is one of the only things that can also be easily destroyed in GUI. There ar two way of doing this, each are equally effective.

    Mã:
    Floating Text - Change the lifespan of (Last created floating text) to 5.00 seconds
    Floating Text - Destroy (Last created floating text) 
    Dòng lệnh 1 cũng tương đương với Unit - Add Timed Life nhg sử dụng với floating text. Sử dụng dòng 2 nếu bạn muốn tự tay xóa floating text.


    Mã:
     Custom script: call DestroyTimer( udg_Your_Variable ) //Countdown Timer 
    Mã:
     Custom script:   call DestroyTrigger( GetTriggeringTrigger() ) 
    Dòng lệnh trên để destroy trigger, nhưng thật ra với GUI user thì nó ko cần thiết.
    ---
    Kết thúc tutorial, ta có trigger sau:
    Mã:
    Final Good Trigger
        Events
            Unit - A unit Starts the effect of an ability
        Conditions
            (Ability being cast) Equal to Animate Dead
        Actions
            Set Temp_Point = (Position of (Casting unit))
            Special Effect - Create a special effect at Temp_Point using Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
            Special Effect - Destroy (Last created special effect)
            Set Temp_Group = (Units within 512.00 of Temp_Point matching (((Matching unit) is A structure) Equal to False))
            Custom script:   call RemoveLocation (udg_Temp_Point)
            Unit Group - Pick every unit in Temp_Group and do (Actions)
                Loop - Actions
                    Set Temp_Point = (Position of (Picked unit))
                    Unit - Create 1 Dummy Caster for (Owner of (Casting unit)) at Temp_Point facing Default building facing degrees
                    Unit - Order (Last created unit) to Human Priest - Inner Fire (Picked unit)
                    Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
                    Custom script:   call RemoveLocation (udg_Temp_Point)
            Custom script:   call DestroyGroup (udg_Temp_Group)
    
    Tutorial đã hết, Tom hi vọng các bạn hiểu :D

    Credit bài viết này dựa theo Memory Leaks tutorial của emjlr trên thehelper ( link: Memory Leak Tutorial )[/spoil]

    b. Nulling Local Handle Variables ( null biến local )

    Bạn vừa mới loại bỏ một location, một group, một effect gây leak ( rò rỉ ) nhưng giữ lại biến local chứa location, group, effect gì gì đó sẽ gây leak[-X. Để sửa nó, hãy null nó hay set = null !

    Có vài biến local không gây leak là real, boolean, integer string !
    Hãy làm như thế này:

    local VARIABLETYPE NAME, là local! Và nếu nó không phải là real, boolean, integer string thì hãy null nó, giống:

    Mã:
    set NAME = null
    Có vài trường hợp là ngoại lệ, tuy vậy:

    Ví dụ, trigger hầu như không bao giờ được Destroy. Nếu bạn tạo một trigger như thế này:

    Mã:
    function InitTrig_Untitled_Trigger_001 takes nothing returns nothing
        local trigger t = CreateTrigger()
    endfunction
    Không bao giờ Destroy các trigger, và sau đó nó không cần phải được nulled

    Players là một ví dụ, không gây rò rỉ, mà cũng không cần Destroy, cũng như không cần null player.


    B. Trigger Enhanced Spells


    Đây là điều cuối cùng, lag game có thể được giải quyết đơn giản vì loại bỏ preloading và rò rỉ bộ nhớ
    .​
    Tuy nhiên, vẫn có trường hợp ngoại lệ.



    Thậm chí nếu tất cả các rò rỉ ( leak ) của bạn đã được chăm soc, vẫn có thể lag từ triggered spells (??).

    Sử dụng Periodic Event ( event lặp ) với thời gian lặp bé tầm < 0.05s sẽ gây ra lag ( giải thích đơn giản chạy đoạn code liên tục cứ 0.05s thì không lag hơi phí ! )

    Dưới đây là một số mẹo để giữ bản đồ của bạn lag ít nhất có thể :


    • Tránh né các Periodic Event, hạn chế.
    • Giữ cho các spell có sử dụng Periodic Event ở mức độ nhất định, có thể là vài spell, như Heroes
    • Tối ưu hóa spell với Jass/vJass. Vì nó tốt hơn GUI về mọi mặt
    • Tránh việc sử dụng quá nhiều Effect ( hiệu ứng ), và ở đây thử dùng dummy
    • Thử sử dụng một Periodic Event có thời gian định kì lớn hơn. Hãy sử dụng >0.05s hay 0.03s thay vì 0.02s và 0.01s ( theo mình là 2s - 3s thay vì 1s - 0.5s ý chứ! )
    C. Massive Amounts of Objects

    Hãy thử giảm số lượng Objects ( F6 ) trong map của bạn, như units, destructables, doodads, và special effects.

    Thay vì có hàng trăm units, chỉ nên có một vài trăm
    .​
    Bạn cũng có thể tiết kiệm graphical power bằng cách sử dụng các unit dummy thay vì special effect, và gỡ bỏ các khối doodads (như cỏ, bụi rậm quá nhiều).


    3. PreLoading


    A. Các Unit

    Một lần nữa, mỗi khi 1 unit hoặc 1 heroes được tạo ra, game có thể load trước. Bạn có thể loại bỏ game lagging bằng cách ngay khi game bắt đầu, hãy đặt các unit đó vào game, và ngay lập tức loại bỏ nó

    B. Các Ability

    Nếu bạn thêm bất cứ ability cho các unit, sau đó bạn cũng nên tạo ra một unit đặc biệt, mà đã có sắn ability, chỉ cần cho preloading. Chỉ cần đặt trước unit này, và gỡ bỏ nó ngay sau khi bản đồ bắt đầu. Hãy chắc chắn rằng để spellbooks preload là tốt.

    4. Optimization Tools

    Cái này mình nói ngắn gọn thôi!



    A. Loading Time

    Sử dụng Witgetizer ( của Pizer Mike ) hay SLKOptimizer ( cái này chịu )

    B. Tối ưu hóa Script ( kịch bản à ?? )

    Hãy sử dụng Vexorian MapOptimizer
    Kết hợp giữa VexOPTWitgetizer hoặc SLKOPT là một sự kết hợp tuyệt vời, bạn có thể bảo vệ bản đồ của mình khỏi hacker tốt hơn! nhưng thực sự hacker muốn là map của bạn sẽ bị mở [-X


     
    Chỉnh sửa cuối: 10/1/10
  2. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM
    khi đang khởi động map có sự lag là gì ?
    1, do người soạn map sử dụng nhiều triger và Items and Untis với mức sấp quá hạng thì sẻ hiển thị gọi là lag nếu gọi chỉ là FPS :P
    còn FPS có gì liên quan đến map xem như là
    60.0 F per seconds thì = 1 giây / 1.000 - 60.0 :P
    FPS gặp rất nhiều là Effect khủng :)
    một cái map lag có thể là do cấu hình người chơi không lạc yêu cầu T.T
    hoặc là cái map đã quá T.T

    ____________________________________________________________________
    mà sao mình thấy như là Copy bài của anh tom dịch chế lại =))
    quá giống :) cái từ
    Mã:
    Memory Leaks là gì ? Memory Leaks là sự thất thoát (leak) những "handle object" (tạm dịch là vật có tính chất "handle", hay nói cách khác có type handle). Có rất nhiều type: unit, group (unit group), location (point), region, floating text,... nhưng những type kia đều là handle. Bất kì lúc nào, bạn tạo ra một handle thì bạn đã mất một phần bộ nhớ (trong trường hợp này có thể nói là RAM). Nếu bạn dùng xong handle này mà ko remove đi thì bạn đã bị thất thoát bộ nhớ và nếu thất thoát quá nhiều sẽ gây ra lag, rất nghiêm trọng.
    
    JASS là ngôn ngữ trong Warcraft, dùng để "scripting" (tôi chả dịch nổi, sorry) Map và AI. Trong đó trigger mà mọi người hay sử dụng là GUI (Graphic User Inteface - giao diện đồ họa cho người sử dụng), tức là phần giao diện của JASS. 
    
    Custom Script đây là 1 "action" trong GUI cho phép ta viết 1 dòng JASS. Vì sự hạn chế của GUI nên ta phải sử dụng action này để "viết 1 dòng JASS" trong GUI và để xóa hết các "thất thoát bộ nhớ" (Memory Leaks)
    
    ----
    
    Các thứ có thể gây ra memory leak:
    
    Special Effects 
    Groups <- unit group
    Points <- Location
    Units
    Regions
    Forces <- player group
    Lightning Effects
    Floating Text
    Countdown Timers
    (Còn nữa nhưng những thứ trên là những thứ hay đc dùng)
    
    Bây giờ Tom sẽ lấy ví dụ về các leak trên và làm thế nào để xóa.
    
    Unit Groups
    
    Code:
    Unit Group Bad
        Events
        Conditions
        Actions
            Unit Group - Pick every unit in (Units in (Playable map area)) and do (Actions)
                Loop - Actions
                    Unit - Kill (Picked unit)Đó là leak group. Cách remove:
    
    Code:
    Unit Group Good
        Events
        Conditions
        Actions
            Set Temp_Group = (Units in (Playable map area))
            Unit Group - Pick every unit in Temp_Group and do (Actions)
                Loop - Actions
                    Unit - Kill (Picked unit)
            Custom script:   call DestroyGroup (udg_Temp_Group)Đầu tiên tạo 1 variable có type là group, tên là Temp_Group (cái này thì tùy thôi) sau đó đặt variable này là group cần pick. Pick unit trong group variable đó, chạy action và destroy group variable trên. Các bạn nhớ rằng tên variable khi chuyển sang JASS sẽ phải thêm "udg_" ở đằng trước.
    
    Points
    
    
    Code:
    Point Bad
        Events
        Conditions
        Actions
            Unit - Create 1 Footman for Player 1 (Red) at (Center of (Playable map area)) facing Default building facing degreesTạo 1 footman ở "giữa bản đồ", leak point "giữa bản đồ", leak này thật ra ko lớn nhưng nếu nhiều sẽ thành lớn. Mà các bạn biết ko, point đc sử dụng rất nhiều.
    "Giải quyết" cái point trên:
    
    Code:
    Point Good
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Unit - Create 1 Footman for Player 1 (Red) at Temp_Point facing Default building facing degrees
            Custom script:   call RemoveLocation (udg_Temp_Point)Tạo 1 point variable trên là Temp_Point (tên thì tùy), set variable trên là point cần sử dụng, tạo unit ở point đó (sử dụng point này) và rồi remove point này.
    
    Special Effects
    
    Code:
    Special Effect Bad
        Events
        Conditions
        Actions
            Special Effect - Create a special effect at (Center of (Playable map area)) using Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdlCó 2 leak, một là leak point, hai là leak special effect. Thật ra trong GUI đã có action để destroy special effect rồi. (Special Effect - Destroy Special Effect)
    
    Code:
    Special Effect Good 1
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Special Effect - Create a special effect at Temp_Point using Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
            Special Effect - Destroy (Last created special effect)
            Custom script:   call RemoveLocation (udg_Temp_Point)Chú ý là có vài special effect, nếu destroy luôn ngay sau khi đc tạo ra thì sẽ ko có gì cả (Thunder Clap thì ko sao). Vì vậy ta phải đợi 1 chút rồi mới destroy.
    
    
    Code:
    Special Effect Good 2
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Special Effect - Create a special effect at Temp_Point using Abilities\Spells\Undead\UnholyAura\UnholyAura.mdl
            Set Temp_SFX[(Integer A)] = (Last created special effect)
            Custom script:   call RemoveLocation (udg_Temp_Point)
            Wait 2.00 seconds
            Special Effect - Destroy Temp_SFX[(Integer A)]Ta có 1 special effect variable tên là Temp_SFX.
    Tạo 1 special effect ở giữa bản đồ, đợi 2 giây rồi destroy effect đó.
    
    Units
    
    Code:
    Units Bad
        Events
        Conditions
        Actions
            Unit - Create 1 Dummy Caster for Player 1 (Red) at (Center of (Playable map area)) facing Default building facing degreesCó 2 leak, một là point leak, hai là unit leak, dummy unit đc tạo ra xong thì ở đó, ko bị remove -> leak.
    
    Code:
    Units Good
        Events
        Conditions
        Actions
            Set Temp_Point = (Center of (Playable map area))
            Unit - Create 1 Dummy Caster for Player 1 (Red) at Temp_Point facing Default building facing degrees
            Custom script:   call RemoveLocation (udg_Temp_Point)
            Unit - Add a 2.00 second Generic expiration timer to (Last created unit)Lệnh Unit - Add Timed Life thì đc dùng cho dummy unit, cái này hầu như ai dùng dummy unit cũng biết và đây là remove unit leak rồi.
    That pretty much covers all the major leaks problems people have in their maps. Here are a few more custom script functions you can use to remove other leaks that sometimes occur:
    
    
    Code:
     Custom script: call DestroyForce( udg_Your_Variable ) //Player GroupCode:
     Custom script:   call RemoveRect(udg_Your_Variable) //RegionCode:
     Custom script: call DestroyLightning( udg_Your_Variable ) //Lightning EffectCode:
    Custom script: call DestroyTextTag( udg_Your_Variable ) //Floating TextThis is one of the only things that can also be easily destroyed in GUI. There ar two way of doing this, each are equally effective.
    
    
    Code:
    Floating Text - Change the lifespan of (Last created floating text) to 5.00 seconds
    Floating Text - Destroy (Last created floating text)Dòng lệnh 1 cũng tương đương với Unit - Add Timed Life nhg sử dụng với floating text. Sử dụng dòng 2 nếu bạn muốn tự tay xóa floating text.
    
    
    
    Code:
     Custom script: call DestroyTimer( udg_Your_Variable ) //Countdown TimerCode:
     Custom script:   call DestroyTrigger( GetTriggeringTrigger() )Dòng lệnh trên để destroy trigger, nhưng thật ra với GUI user thì nó ko cần thiết. 
    ---
    Kết thúc tutorial, ta có trigger sau:
    
    Code:
    Final Good Trigger
        Events
            Unit - A unit Starts the effect of an ability
        Conditions
            (Ability being cast) Equal to Animate Dead
        Actions
            Set Temp_Point = (Position of (Casting unit))
            Special Effect - Create a special effect at Temp_Point using Abilities\Spells\Human\ThunderClap\ThunderClapCaster.mdl
            Special Effect - Destroy (Last created special effect)
            Set Temp_Group = (Units within 512.00 of Temp_Point matching (((Matching unit) is A structure) Equal to False))
            Custom script:   call RemoveLocation (udg_Temp_Point)
            Unit Group - Pick every unit in Temp_Group and do (Actions)
                Loop - Actions
                    Set Temp_Point = (Position of (Picked unit))
                    Unit - Create 1 Dummy Caster for (Owner of (Casting unit)) at Temp_Point facing Default building facing degrees
                    Unit - Order (Last created unit) to Human Priest - Inner Fire (Picked unit)
                    Unit - Add a 2.00 second Generic expiration timer to (Last created unit)
                    Custom script:   call RemoveLocation (udg_Temp_Point)
            Custom script:   call DestroyGroup (udg_Temp_Group)
    đã nói như vậy :P
     
  3. Maiev Shadowsong

    Maiev Shadowsong Donkey Kong

    Tham gia ngày:
    24/6/09
    Bài viết:
    355
    Nơi ở:
    Pikachu Hội
    Cuối cùng cũng xong, à còn attach thêm công cụ tối ưu hóa map nữa! :) Edit

    Thì chả chế gì cả, "mình xin phép lấy thông tin từ tutorial về anti leak của bạn tom!"
     
  4. dh-g

    dh-g Fire in the hole!

    Tham gia ngày:
    29/8/09
    Bài viết:
    2,654
    Nơi ở:
    Q1 TP.HCM

    :)
    bạn có thể tự biên soạn 1 cái map để anti leak được hôk

    nói củng khó hiểu lắm :)
     
  5. Maiev Shadowsong

    Maiev Shadowsong Donkey Kong

    Tham gia ngày:
    24/6/09
    Bài viết:
    355
    Nơi ở:
    Pikachu Hội

Chia sẻ trang này