+ Reply to Thread
Page 1 of 3 123 LastLast
Results 1 to 10 of 24
  1. #1
    Talokaaa

    [Tutorial] Memory Leak คืออะไร ? ตัวสำคัญที่ทำคอมแลค

    **ทำไมต้องอ่าน**
    เพราะ การเรียนรู้ และ ทำลาย Memory Leak เป็นปัจจัยหนึ่งมีความสำคัญในการสร้างแมพเป็นอย่างมาก
    **อ่านแล้วได้อะไร ทำให้แมพดีขึ้นหรือ?????**
    ได้แน่นอน เป็นการลดความแลค ให้กับแมพครับ ลดอัตราการหลุดด้วย สำคัญมาก

    Memory Leak คือ การใช้ Ram อันเป็น Memory อย่างฟุ่มเฟือย หมายถึงการใช้ตัวแปรต่างๆที่กำหนดขึ้น ตัวแปรนี้จะถูกเป็นไว้ใน Ram เพื่อใช้งานอื่นๆ แล้วไม่ลบทิ้งหรือคืนค่านั้นให้กับ Ram เหมือนเดิม ผลคือ Memory จะถูกกิน (แดก) ไปเรื่อยๆ ทำให้คอมทำงานช้าลง จนกระทั่งค้างในที่สุด การใช้ตัวแปรเหล่านี้ จะเกิดขึ้นจากการใช้ Program ต่างๆรวมถึงการเรียก Window ด้วย Memory ที่เสียไปจะไม่สามารถเรียกคืนได้หากไม่มีการวางโปรแกรมที่ดี ทำให้ต้องRestartเครื่องบ่อยๆ
    หากเป็น program ที่ดี จะต้องลบตัวแปรที่จอง Memory นี้ทิ้ง สามารถสังเกตได้จาก Task Manager เช่นเดียวกัน แมพที่ดีก็ควรมีการคืนค่า memory เหล่านี้เช่นกัน

    **แล้วทำไมต้องคืนค่า ??? ตัวแปรชนิด Real หรือ ตัวแปรทศนิยม มันกิน Memory แค่ 4 bytes เองนี่ ยังไม่ถึง 1kb เลย เรามี Ram ตั้ง 2 GB สนใจทำไม ??
    แต่ใน World Editor นั้น ตัวแปรทุกตัว (Point, Player,etc) จะกิน Memory ถึง 32bytes ซึ่งถือว่าเยอะมาก การใช้ Memory ผ่าน Trigger อย่างสิ้นแปลือง เช่น

    Code:
    BAD BAD BAD Gold income
      Events
        Time - Every 1.00 seconds of game time
      Conditions
      Actions
        Player Group - Pick every player in (All players) and do (Actions)
          Loop - Actions
            Player - Add 1 to (Picked player) Current gold
    ตัว All Players นั้น เป็นตัวแปรที่เกมสร้างขึ้นใหม่ จะกิน Ram 32bytes และไม่มีการลบทิ้ง Triggerนี้ทำงานทุก1วิ ถ้าเล่น 60นาที จะกิน Ram = 60*60*32 = 115200 Bytes หรือประมาณ 100kb แต่หากไม่มีการคืน Memory เลยสัก 100 Trigger อีกทั้งบางTrigger ใช้ "Every 0.01s of game time" + ยังมีโปรแกรมอื่นที่ทำงานอยู่ นอกจาก Warcraft อีกก็คอมค้างได้เลยครับ

    **ตัวอย่างเกมที่มี Memory Leak มาก ??
    สังเกตได้ง่ายคือ เกมที่เล่นนาน จะมี memory leak มากกว่าเกมที่เล่นแปปเดียว ที่สำคัญคือ บางเกมเวลาออกจาก Warcraft จะนานมากๆ (หน้าจอดำๆอะ) คือเป็นช่วงที่ com reset memory อยู่แสดงให้เห็นว่ามีการใช้ memory เยอะมากครับ RPG บางเกมยิ่งแล้วใหญ่ เล่นๆไปถึงช่วงหนึ่งค้างหลุดเลย แสดงว่าไม่มีการบริหารด้าน memory ครับ

    **ถ้า Ram โดนกินจะมีอะไร หรือ ทำไมต้องยุ่งด้วยอ่า ??
    ถ้า Ram ถูกใช้มากๆ เหลือที่เก็บน้อย มีผลก็ทำให้ LAGLAGLAGLAG ครับ นอกจากนี้มีผลให้ Gameหลุด ServerSplit RandomDisconnect และส่งผลให้คอมช้าด้วย

    **ถ้ารู้แล้วว่า Memory Leak เป็นไง แล้วทำไงจะป้องกันไม่ให้มัน Leak อ่า
    วิธีป้องกัน ต้องป้องกันตั้งแต่ในโครงสร้างของ Trigger เลย เช่น

    Code:
    Good Gold income
      Events
        Time - Every 1.00 seconds of game time
      Conditions
      Actions
        Set Variable_All_Player = (All players controlled by a User player)
        Player Group - Pick every player in Variable_All_Player and do (Actions)
          Loop - Actions
            Player - Add 1 to (Picked player) Current gold
        Custom script:  call DestroyForce (udg_Variable_All_Player)
    กล่าวคือ เราต้องระบุให้ชัดเจนว่าตัวแปรที่เราสร้างขึ้น (อาจจะตั้งใจหรือไม่ก็ตาม) มีการเก็บไว้ในที่ที่เราระบุได้ ทำให้เราสามารถลบตัวแปรนั้นได้เช่นกัน ดังนั้นเราจำเป็นต้องสร้างตัวแปรขึ้น แล้วจึงใช้คำสั่ง Destroy ตัวแปรนั้นหลังจากใช้งานเสร็จ

    **แล้วสร้างตัวแปรมันเต็มไปหมดเลย ลายตา ไม่ชอบ ไม่สร้างดีกว่า + เดี๋ยวขนาดแมพใหญ่เกิน
    อย่าละเลยเรื่อง Memory Leak นะครับ ขนาดแมพมันใหญ่ขึ้นเพราะคำสั่งที่เพืมขึ้นก็จริง แต่มันจะเล็กนิดเดียวถ้าเทียบกับ ขยะตัวแปรที่กำลังจะสร้าง ห้ามละเลยเด็ดขาด

    **แล้วจะรู้ได้ไงว่าอะไร Leak อะไรไม่ Leak อ่า
    Action ที่ใช้กันบ่อยๆ แล้วมี Leak ให้ระวัง คือ
    Special Effects
    Groups
    Points
    Units
    Regions
    Forces
    Lightning Effects
    Floating Text
    Countdown Timers

    **วิธี Remove Leak/ Destroy Leak
    จำเป็นต้องใช้ Custom Script เล็กน้อย แต่บางตัวก็มีแบบเป็น GUI(แบบกดเลือก)ให้อยู่แล้ว ต่อไปนี้คือตัวอย่างการป้องกันLeakครับ (Custom Script ให้คงไว้อย่างนั้นแล้วเปลี่ยนเฉพาะชื่อตัวแปร)

    Code:
    Special Effect จะมีคำสั่ง Remove Leak เป็น GUI อยู่แล้วครับ
        Special Effect - Destroy (Last created special effect)
    Code:
    Point (จุดต่างๆ)
      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)
    Code:
    Unit Group (กลุ่มของยูนิต)
      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)
    Code:
    Unit (ไม่LeakMemoryแต่ทำให้เกมLagถ้าไม่เอาออก คนส่วนมากชอบใช้ Dummy Unit ในการช่วยสกิลแล้วลืมเอาออก ทำให้Lagได้ง่าย)
      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)
    Code:
    อื่นๆ
    Custom script: call DestroyForce( udg_Your_Variable ) //Player Group
    Custom script: call RemoveRect(udg_Your_Variable) //Region
    Custom script: call DestroyLightning( udg_Your_Variable ) //Lightning Effect
    Custom script: call DestroyTextTag( udg_Your_Variable ) //Floating Text หรือ
      Floating Text - Change the lifespan of (Last created floating text) to 5.00 seconds
      Floating Text - Destroy (Last created floating text)
    Custom script: call DestroyTimer( udg_Your_Variable ) //Countdown Timer
    Custom script: call DestroyTrigger( GetTriggeringTrigger() ) //Trigger
    **Trigger เป็น Leak ด้วยหรือ ??
    Trigger ใน Warcraft ถือเป็นตัวแปรชนิดหนึ่ง แต่แต่แต่... มีการคืนค่าแน่นอนหลังจากเกมจบ จึงไม่ถือว่า Memory Leak แต่อย่างใด แต่หากถ้าเราทำลาย trigger ที่ทำงานเพียงรอบเดียวทิ้ง ก็เท่ากับลดตัวแปรในเกม และลดการทำงานของเกม จะช่วยลดแลคได้ดี แต่ต้องระวัง Error เพราะมันทำงานไม่เหมือน Turn off trigger นะครับ

    **ทำยากอ่า เขียนแล้วมันไม่ติด
    ตรง Custom Script: call DestroyLocation (ตัวอย่าง) ต้องใช้ตัวพิมพ์ใหญ่ตามนี้เลยครับเพราะถือเป็นคำสั่ง ถ้าเปลี่ยนเป็นตัวพิมพ์เล็ก ก็Errorเพราะเกมหาคำสั่งนั้นไม่เจอ ตอนแรกๆก็ยากครับ ผมก็พิมพ์ผิดบ่อยในตอนแรก แต่ทำๆไปให้แล้วก็ชินเอง

    ********
    ห้ามละเลย เรื่อง Memory Leak เด็ดขาด แม้จะเล็กน้อยก็ตาม เพราะเป็นพื้นฐานการเขียนโปรแกรมที่ดี ถ้าละเลยจะเป็นนิสัย ทำให้แมพที่สร้างไม่สมบูรณ์ และมีจุดอ่อนเยอะ แก้ไขทีหลังก็สายไปแล้ว เพราะเยอะเกินแก้แล้วครับ
    ********

    สุดท้ายนี้ ขอขอบคุณเว็ปอ้างอิงด้วยครับ
    http://www.thehelper.net/forums/showthread.php?t=27219

    ขอบคุณที่อ่านครับ หวังว่าผู้อ่านจะนำไปใช้ประโยชน์ได้ ถ้ามีคนถามTriggerแล้วไม่รู้เรื่องMemory Leakให้มาอ่านนี้ได้ครับ เวอร์ชั่นไทย ไม่มีลาว อ่านออกแน่นอน

    เดี๋ยววันหลังถ้ามีโอกาส จะเอาแมพDemoเรื่องนี้มา Post ให้ศึกษาเพื่อไม่เข้าใจครับ...
    ...มาแล้ว แมพทำเอง สอน Memory Leak ครับ (แก้ลิงค์ให้แล้ว)
    http://www.thaicyberupload.com/get/KUI8N04LIb

    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    มีบางคนไม่เข้าใจเรื่องการใช้ custom script นะครับ ผมจะอธิบายให้

    Custom Script เป็นคำสั่งที่ไว้ใช้ นอกเหนือจากคำสั่งที่มีใน GUI (แบบกดเลือก)
    การใช้คำสั่ง (funtion) ผ่าน custom script จะใช้คำสั่ง call ครับ
    udg ย่อมาจาก user defined global หมายถึง ตัวแปร variable ที่คุณตั้งขึ้นมาเอง

    ถ้าตัวแปรที่คุณสร้างเป็น point (เจอบ่อย) มีชื่อว่า Temp_Point (ใช้ udg ขึ้นต้นเพื่อบอกคอมพิวเตอร์ว่าเป็นตัวแปรที่เราสร้างนะ) เวลาจะทำลายก็ให้ใช้คำสั่ง ดังนี้
    Custom Script: call RemoveLocation (udg_Temp_Point)
    พูดง่ายๆ คือ call functionที่เรียกใช้ (udg_ชื่อตัวแปร) แค่นั้นเองครับ

    คำสั่งใน World Editor มันมีเยอะมากครับ คำสั่งทำลายตัวแปรเป็นเพียงส่วนหนึ่งที่ไม่อยู่ในตัวเลือกจึงจำเป็นต้องสั่งเองครับ (ไม่เกี่ยวกับสร้างคำสั่งเองนะครับ)

    /////////////////////////////////////////////////////////////////////////////////////////////////////

    คำถาม: เขียนทับลงไปใหม่เลย จะleakไม๊ครับ
    ตอบ: เขียนทับใหม่ก็ leak ครับ ยิ่งมีปัญหาเลยตรงที่เราไม่สามารถแก้ตัวเก่าได้อีกเลย (เหมือนถูกโยนทิ้งคลอง แทนที่จะไปอยู่ในถังขยะ ทีนี้เราก็ต้องปล่อยมันไปเลยครับ ทำอะไรไม่ได้เลย)

    /////////////////////////////////////////////////////////////////////////////////////////////////////

    ขอบคุณคุณ Pakawinz นะครับ ตัวนี้มันใช้ไม่ได้ แต่ผมลืมบอกไปครับ (ยังไม่แน่ใจเรื่อง blizzard coding ด้วย)

    Set tempForce = (All Players)
    call DestroyForce (udg_tempForce)

    สำหรับกรณีนี้ ให้ใชคำสั่งนี้แทนครับ
    Set tempForce = (All players matching (True Equal to True))
    Last edited by Talokaaa; 28-05-2011 at 09:01 PM.

  2. #2
    konlhon

    Re: [Tutorial] Memory Leak คืออะไร ? ตัวสำคัญที่ทำคอมแลค

    เยี่ยม ^^

  3. #3
    noomyakoo

    Re: [Tutorial] Memory Leak คืออะไร ? ตัวสำคัญที่ทำคอมแลค

    ดีมากๆๆคับ
    :004:

  4. #4
    tadekza20

    Re: [Tutorial] Memory Leak คืออะไร ? ตัวสำคัญที่ทำคอมแลค

    ก็ยังไม่เข้าใจอยุ่ดีอะ

  5. #5
    Talokaaa

    Re: [Tutorial] Memory Leak คืออะไร ? ตัวสำคัญที่ทำคอมแลค

    Quote Originally Posted by tadekza20
    ก็ยังไม่เข้าใจอยุ่ดีอะ
    ตรงไหนละครับ ช่วยบอกหน่อย จะได้อธิบาย -*-

  6. #6
    UnlimitedBlaze

    Re: [Tutorial] Memory Leak คืออะไร ? ตัวสำคัญที่ทำคอมแลค

    Custom Scriptนี้ ช่วยอธิบายเพิ่มเติม ด้วยนะ
    เช่น มันมีอะไรบ้าง,Coppyไป ต้องแก้ตรงไหน
    พอดีไม่เข้าใจตรงบรรทัดสุดท้าย

    ขอบคุณมากจ้า^ ^

  7. #7
    Nasnet

    Re: [Tutorial] Memory Leak คืออะไร ? ตัวสำคัญที่ทำคอมแลค

    คล้ายๆ Mysql_close ซินะ

  8. #8
    Illidan_stormrage
    Unit (ไม่LeakMemoryแต่ทำให้เกมLagถ้าไม่เอาออก คนส่วนมากชอบใช้ Dummy Unit ในการช่วยสกิลแล้วลืมเอาออก ทำให้Lagได้ง่าย)
    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)
    ถามเกี่ยวกับข้อนี้หน่อย ถ้าเกิด เรา Set HP regenให้ Unit ตายแล้วมันจะแลค ป่าว
    thx ครับ

  9. #9
    Talokaaa
    ถ้าUnitตาย มันจะไม่ได้removeออกทันที (จะมี Delay corpse ครับ) เพราะฉะนั้นก็จะแลคนานกว่าremoveออกเลยหน่อยหนึ่ง ถ้าตามหลักแล้ว ไม่ได้สร้างUnitอะไรมากมายก็ไม่มีผลครับ เพราะเมื่อunitตายสักพักหนึ่งแล้ว เกมมันจะremoveออกเอง แต่แนะนำremoveเลยดีกว่ารอให้เกมremoveให้นะครับ

    แล้วก็ถ้าตั้ง Expiration Timer เราสามารถกำหนดเวลาได้ แต่ถ้าตั้ง hp regen -1 ใน Object Editor เรากำหนดเวลาไม่ได้ครับ อย่าลืมว่า DummyUnit 1 ตัวมันใช้ทำได้หลายอย่าง เช่น 100 สกิลสามารถใช้dummyตัวเดียวกัน โดยการadd abilityและexpiration timerได้ ยังไงก็ดีกว่าสร้างunitในobject editor 100 ตัวนะครับ

  10. #10
    Illidan_stormrage
    เคครับ ผม ลบออกไปมาก แล้ว(มากกว่าครึ่ง) แต่ทำไมตอนครี ยัง ไม่คนหลุดออกจากห้องอีก อะ - -* ถามหน่อย ครับ

Facebook Comments


Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •