• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            (轉)
            TIME_WAIT狀態
            根據TCP協議定義的4次握手斷開連接規定,發起socket主動關閉的一方socket將進入TIME_WAIT狀態,TIME_WAIT狀態將持續2個MSL(Max Segment Lifetime),在Windows下默認為4分鐘,即240秒,TIME_WAIT狀態下的socket不能被回收使用. 具體現象是對于一個處理大量短連接的服務器,如果是由服務器主動關閉客戶端的連接,將導致服務器端存在大量的處于TIME_WAIT狀態的socket,甚至比處于Established狀態下的socket多的多,嚴重影響服務器的處理能力,甚至耗盡可用的socket,停止服務. TIME_WAIT是TCP協議用以保證被重新分配的socket不會受到之前殘留的延遲重發報文影響的機制,是必要的邏輯保證.
            可以用如下代碼嘗試關閉TIME_WAIT,但這樣作是很危險的,違背TCP協議的,也不一定有效果.
            linger InternalLinger = { 1, 0 };
            ::setsockopt(socket, SOL_SOCKET, SO_LINGER, (const char*)&InternalLinger, sizeof(linger));

            中庸的做法是,可在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名為TcpTimedWaitDelay的
            DWORD鍵,設置為30-240,以縮短TIME_WAIT的等待時間,這也是對IIS服務器的優化手段之一.編程上,除非必要,應盡量讓客戶端發起斷開操作.

            posted @ 2007-01-16 11:58 修一居士 閱讀(9070) | 評論 (2)編輯 收藏

            檢測內存泄漏:
            ???mfc Crt內存泄漏檢測dump出的數據可以觀察到內存塊泄漏的編號,記下經常不變化或者變化不大的內存塊編號,??在運行程序初始化時調用_CrtSetBreakAlloc(45);? 參數為編號,在程序運行在調試狀態下分配這塊內存時則會int3中斷。

            調試觀察窗口
            輸入@err 則輸出錯誤信息 效果等同于GetLastError
            輸入@hr 則返回 HRESULT 值
            輸入@+寄存器 如 @EAX 可以查看寄存器里的值

            posted @ 2007-01-08 11:45 修一居士 閱讀(885) | 評論 (0)編輯 收藏

            Algorithm

            ?????? A* 在地圖中兩點間找出一條路徑,如果存在至少一條路徑,在各種不同的算法中 A* 將找到最短路徑,而且相比之下算法速度快。 A* 是一種可控的算法,是一種啟發式搜索算法,也就是說算法本身不會盲目的搜索路徑,而是估計一個最佳的考察方向,進行搜索。

            ? ???? A* 尋路算法中,我們從起點開始,檢查相鄰方格的方式,向外擴展直到找到目標。

            我們做如下操作開始搜索:

            1. 從起點開始,并且把它作為待處理的第一個點存入一個 開啟列表 。開啟列表就像一張購物清單。盡管現在列表里只有一個元素,但以后就會多起來。你的路徑可能會通過它包含的方格,也可能不會。基本上,這是一個待檢查方格的列表。

            2. 從開啟列表中取出一個代價最小的點

            關于代價值的計算

            F = G + H

            這里:
            ??? * G =
            從起點,沿著產生的路徑,移動到當前節點的移動耗費。
            ??? * H =
            從網格上那個方格移動到終點的預估移動耗費。這經常被稱為啟發值

            ?

            如果開啟列表為空則說明路徑沒有找到,結束搜索。如果取到這個節點,則將這個結點加入到 關閉列表 ,如果這個點是終點,則結束搜索。如果不是終點就把這個點作為當前點。

            3. 按照八個方向查找與當前點相鄰的節點,如果是可以移動的點(尋找起點周圍所有可到達或者可通過的方格,跳過有墻,水,或其他無法通過地形的方格)

            a. 如果新考核的點在 關閉列表 中,并且從當前點到達這個點的 G 值更小則

            將這個點作為當前點的孩子節點

            更新這個點的 G

            更新這個點所有孩子節點的父節點指針、 G 值、 F

            b. 如果新考核的點在 開啟列表中 ,并且從當前點到達這個點的 G 值更小則

            將這個點作為當前點的孩子節點

            更新這個點的 G

            ?c. 將這個點作為當前點的孩子節點,計算這個點的 G H F 值,將這個節點加入到 開啟列表 中。

            ?

            4 .跳回第二步周而復始,直到 開啟列表 為空,或者將終點加入到 關閉列表

            ? 流程圖:

            流程圖.JPG

            算法優化:

            ? ? ?? 算法中消耗分析

            1.???? 節點的內存分配與釋放

            ?

            節點的內存分配與釋放非常頻繁,大規模搜索的時候通常需要數千個節點乃至上萬個節點。所以很有必要做內存管理。考慮用 placement new 來分配內存減少分配與釋放的開銷,但是需要在程序運行開始就事先分配好內存。每個節點大約 20 字節左右,正常的情況下一張稍大的地圖有 1500x1500 大小 2,250,000 格,那么最壞情況下,需要內存約 40,000k ,所以如果一開始就分配這么多內存是不現實的,所以只能限制一個內存分配極值,比如一次分配一兆,如果用完就結束搜索。但如果游戲一開始就分配 1 兆內存用于尋路,實際上有可能一直都不需要大規模搜索,所以最好有增長方式的內存管理。

            另一個方案是每次分配一批節點所需內存,用完了再增長,分配粒度越大命中效果也會更好些。

            ?

            2.???? 從開啟列表中取出一個代價最小的點

            從開啟列表中取出一個代價最小的點需要比較并遍歷所有在開啟表中節點。優化的做法是在每次插入開啟表的時候都將節點插入在表的最前端,這樣每次從前端取就可以避免遍歷的開銷,但是分析證明,每次節點的值改變都需要重新排序,一次大循環中可能需要多次排序,而每次大循環只會取一次代價最小節點,所以這一次的遍歷相比開銷要比排序小的多。

            3.???? 查找考核點是否在關閉列表

            查找考察點是否在關閉或者開啟列表中都需要遍歷整張表,優化的辦法是選擇合適的數據結構。

            相比使用 vector 插入和刪除的速度會很慢,但是訪問和遍歷的速度很快,但如果 vector 預先分配內存,內存命中會很高,訪問和遍歷也會更快,插入和刪除如果用 swap 也會相對較快。

            使用 list 插入和刪除速度會很快,但是遍歷會很慢,內存命中也會比較差。如果算法中對表的插入比遍歷頻繁,可以考慮使用 list

            經過測試發現,瓶頸在表的遍歷與搜索上, vector 無論有多快搜索速度都是線性的而且隨著節點的增加,遍歷時間也隨之線性增長,而 map 的查找速度是常數級的, Hash map 查找的時間復雜度為 O(1) ,即使用 STL map 也會有 O(log (n)) 比線性查找 O(n) 快很多, map 永遠是穩定的。

            ?

            4.???? 如果已經存在在列表中并且當前 G 值最小則更新其 G 值和這個考核點所有的孩子節點的 G 值和父節點指針。

            遍歷孩子節點需要遞規來完成搜索整棵樹,開銷在于函數調用,所以采用棧的方式來模擬遞規。

            5.???? 查找考核點是否在開啟列表,如果在開啟列表則更新這個節點。

            6.???? 函數調用帶來的開銷,所有檢測函數都做成內聯函數,封裝后的 A* 需要對外開放一個檢測函數指針,可以實現函數對象來做檢測函數,函數對象的可以內聯 operator 操作符。

            ?

            A* 帶來的其他問題

            A* 在最壞的情況下會廣度搜索地圖,花費很多時間才能找到終點,尤其是目標點為掩碼(即無論如何到達不了的終點),所以通常情況下要對尋路時間加以限制,但是限制時間短了可能找不到目標點,限制時間長了又可能影響游戲幀率,比如在在游戲 Mouse Hold 的情況下,尋路是頻繁進行的。一個經驗值是 20 毫秒,對有效的目標點搜索超過 20 毫秒都沒有找到有效的路徑就放棄搜索,找一個離目標最近的終點即可。

            但是時間限制可能存在硬件不同而效果不同的問題,對于不同的 cpu 來說,相同的時間搜索的范圍會不一樣,另一個選擇是利用循環次數來限制。

            對于目標點為掩碼的處理,與其讓 A* 進行超時搜索不如在開始設置目標點的時候就計算一個離目標點最近的可以到達的點。可以從目標點為中心一圈一圈向外搜索,直到搜索到一個可以到達的點(非掩碼 )為止,這比起直接用 A* 消耗要小的多。

            ?

            算法的進一步改進

            1.?????? 需要更快的速度

            a.???? 改進數據結構

            ?????? 當前使用的是 STL map ,是使用紅黑樹來管理內存的而不是真正的 Hash Map ,如果改為 HashMap ,效率可能會再有一些改進。 ???

            b. ?? 分時計算

            如果需要更快速的得到路徑,需要分時計算。一開始就計算出一條快速路徑,可能只有幾步,只是一個大概的方向,然后讓角色開始按照這條路徑開始行進,與此同時繼續計算完整路徑。

            2. ?? 需要更優的路徑

            ?????? 如果需要更優的路徑,可以做進一步對路徑進行修正,也就是在搜索好的路徑上面選取一個點為目標再次進行搜索,找到更短路徑。這也意味著運算時間更長,這時候就需要在性能和更好的效果上取一個平衡點。

            posted @ 2006-12-30 11:07 修一居士 閱讀(3771) | 評論 (0)編輯 收藏
                 摘要: 在內存中運行可執行程序,好處是可以給程序加殼,加密源程序,靜態反匯編無法獲得PE輸入節,但是因為運行后仍然是獨立的進程,所以沒辦法防止遠程線程注入,掛接API鉤子。 ??typedef?IMAGE_SECTION_HEADER?( * PIMAGE_SECTION_HEADERS)[ 1 ];????? // ...  閱讀全文
            posted @ 2006-12-30 10:24 修一居士 閱讀(1170) | 評論 (0)編輯 收藏
            char sChar[MAX_PATH];
            const WCHAR wChar[] = L"我的朋友";

            // 設置代碼頁為默認代碼頁
            ? _tsetlocale(LC_ALL,_T(""));
            // 把wChar這個Unicode字符串轉換成ANSI字符串,保存到sChar,并且返回ANSI的字符串大小,如果失敗,則返回-1
            ? wcstombs(sChar, wChar, MAX_PATH);


            這樣就可以了,不用調用煩人的WideCharToMultiByte!
            相反的函數:mbstowcs,可以從ANSI轉換到Unicode
            posted @ 2006-12-28 11:10 修一居士 閱讀(2600) | 評論 (2)編輯 收藏
            僅列出標題
            共2頁: 1 2 

            導航

            <2009年8月>
            2627282930311
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            統計

            常用鏈接

            留言簿(3)

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久热这里只有精品在线观看| 久久久久女人精品毛片| 久久夜色精品国产www| 亚洲精品乱码久久久久久不卡| 麻豆亚洲AV永久无码精品久久| 亚洲国产成人久久综合一| 日韩久久无码免费毛片软件 | 久久久这里有精品中文字幕| 香港aa三级久久三级老师2021国产三级精品三级在 | 久久精品国产久精国产一老狼| 久久久精品2019免费观看| 久久AAAA片一区二区| 久久狠狠爱亚洲综合影院 | 久久国产乱子精品免费女| 日产精品久久久久久久| 久久精品国产99久久久香蕉| 国产精品美女久久久久网| 久久婷婷五月综合国产尤物app| 一级做a爰片久久毛片人呢| 久久综合给久久狠狠97色| 少妇人妻综合久久中文字幕| 精品欧美一区二区三区久久久| 热久久国产精品| 国产精品视频久久| 国产精品美女久久久久网| 久久综合噜噜激激的五月天| 久久精品国产亚洲AV忘忧草18| 一本一道久久a久久精品综合| 久久青青草原精品国产软件| 久久www免费人成精品香蕉| 99久久99久久精品国产片| 国产一级持黄大片99久久| 久久er国产精品免费观看2| 国产精品久久亚洲不卡动漫| 好属妞这里只有精品久久| 日本精品久久久久中文字幕| 久久综合九色综合久99| 精品国产婷婷久久久| 久久黄色视频| 亚洲中文字幕无码一久久区| 伊人久久大香线蕉av不卡|