• <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>

            Daly的游戲人生

            資源和內存管理學習總結

            整理了手頭上幾本書中關于資源和內存管理的章節


            <Understanding the linux kenel 第三版> 8.1.7 the buddy system
                Buddy算法, 解決內存碎片問題. 張貼書本原文如下:

            The technique adopted by Linux to solve the external fragmentation problem is based on the well-known buddy system algorithm. All free page frames are grouped into 11 lists of blocks that contain groups of 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, and 1024 contiguous page frames, respectively. The largest request of 1024 page frames corresponds to a chunk of 4 MB of contiguous RAM. The physical address of the first page frame of a block is a multiple of the group sizefor example, the initial address of a 16-page-frame block is a multiple of 16 x 212 (212 = 4,096, which is the regular page size).


            We'll show how the algorithm works through a simple example:

            Assume there is a request for a group of 256 contiguous page frames (i.e., one megabyte). The algorithm checks first to see whether a free block in the 256-page-frame list exists. If there is no such block, the algorithm looks for the next larger blocka free block in the 512-page-frame list. If such a block exists, the kernel allocates 256 of the 512 page frames to satisfy the request and inserts the remaining 256 page frames into the list of free 256-page-frame blocks. If there is no free 512-page block, the kernel then looks for the next larger block (i.e., a free 1024-page-frame block). If such a block exists, it allocates 256 of the 1024 page frames to satisfy the request, inserts the first 512 of the remaining 768 page frames into the list of free 512-page-frame blocks, and inserts the last 256 page frames into the list of free 256-page-frame blocks. If the list of 1024-page-frame blocks is empty, the algorithm gives up and signals an error condition.

            The reverse operation, releasing blocks of page frames, gives rise to the name of this algorithm. The kernel attempts to merge pairs of free buddy blocks of size b together into a single block of size 2b. Two blocks are considered buddies if:

            • Both blocks have the same size, say b.

            • They are located in contiguous physical addresses.

            • The physical address of the first page frame of the first block is a multiple of 2 x b x 212.

            The algorithm is iterative; if it succeeds in merging released blocks, it doubles b and tries again so as to create even bigger blocks




            <Modern C++ design 泛型編程與設計模式> Chapter 4 small object allocation
                本書討論的是loki庫。第4章探討了小對象的內存分配

            <STL源碼解析>  2.2 STL空間分配器  翻譯by 侯捷
                SGI的STL實現中,allocator的實現例子。
                二級分配器:大于128byte交給一個分配器,直接分配內存。小數據塊交給次級分配器。
                次級分配器用一個freelist數組維護可分配的小塊內存區域。freelist數組中的項是一個固定內存大小的鏈表。freelist中的項

            這 里用了一個小技巧(union)
                
            union obj {
                union obj*  free_list_link;
                char client_data[1];
            }
              
                這個既可用于空閑列表節點,又能作為數據指針(強制轉換), 這樣就可以節省信息記錄的空間。
                詳細說明參考原書


            < 游戲編程精粹1> 1.6 通用的基于句柄的資源管理器

                該文章實現HandleMgr模板類實現不同類型資源的管理器.handle為整數值
                基本思路
            1. vector<DATA>存放實際數據, vector儲存magic number, FreeVector儲存數據vector中的空閑索引值
            2. Acquire根據 handl值返回數據指針(引用計數+1), Release釋放data( 引用計數減1 )

                技巧1: 利用空結構實現類型匹配(STL內經常用這個技巧)
                    struct tagTexture {}
                    typedef Handle<tagTexture> HTexture
                技巧2:資源釋放時不需要析構,只需要把相應index加入空閑列表。分配時重用該對象,重新初始化值,可以提高效率。
                技巧3:一般資源管理器類作為Singleton

                擴展1:為標準功能增加自動引用計數(參考智能指針的實現?)

            < 游戲編程精粹1> 1.9 基于幀的內存分配 by steven ranck
                思路:棧方式(后進先出)的內存分配器。預先分配大塊內存,然后按棧順序分配和釋放內存。
                        僅適用于分配,釋放有嚴格順序的資源(如關卡資源)

            <游戲編程精粹1> 1.1
                技巧:所謂的數據繼承
                對于不變的對象屬性,具體類用引用指向這些固定屬性,而不是繼承。
                因為僅通過對象繼承,每個對象都有這些固定屬性的拷貝,浪費空間。
                Sprite(速度,滿血值,攻擊力) <-- SpriteInstance( 對sprite引用, 位置,當前生命值)

            posted on 2010-05-02 00:02 Daly 閱讀(2263) 評論(1)  編輯 收藏 引用 所屬分類: C/C++游戲開發

            評論

            # re: 資源和內存管理學習總結 2010-05-05 08:47 欣萌

            不錯。  回復  更多評論   

            99精品久久精品| 久久五月精品中文字幕| 久久不射电影网| 久久久久久噜噜精品免费直播| 波多野结衣AV无码久久一区| 国产一级持黄大片99久久| 欧美精品一区二区久久| …久久精品99久久香蕉国产| 亚洲Av无码国产情品久久| 99久久超碰中文字幕伊人| 奇米影视7777久久精品人人爽| 青青热久久综合网伊人| 亚洲国产精品一区二区久久hs| 久久婷婷人人澡人人| 大香网伊人久久综合网2020| 久久久一本精品99久久精品88| 伊色综合久久之综合久久| 久久久人妻精品无码一区| 91精品国产91久久久久久蜜臀| 久久久噜噜噜久久中文福利| 无夜精品久久久久久| 狠狠色丁香婷婷综合久久来来去 | 国产成人精品综合久久久| 亚洲色婷婷综合久久| 久久经典免费视频| 亚洲欧美国产精品专区久久| 久久国产成人午夜AV影院| 国产精品99久久久久久董美香| 亚洲天堂久久精品| 亚洲嫩草影院久久精品| 88久久精品无码一区二区毛片| 91精品免费久久久久久久久| 国产精品成人无码久久久久久| 久久99精品国产一区二区三区| 99久久免费国产精品热| 久久亚洲欧美日本精品| 国产午夜精品理论片久久 | 99精品国产在热久久| 久久91精品久久91综合| 国产婷婷成人久久Av免费高清| AV狠狠色丁香婷婷综合久久|