Android中的GraphicBuffer的分配

2021-08-04 23:54:47 字數 1936 閱讀 3408

android中影象緩衝區的分配是由單例類graphicbufferallocator實現的。

[frameworks/native/include/ui/graphicbufferallocator.h]

#ifndef android_buffer_allocator_h

#define android_buffer_allocator_h

#include

#include

#include

#include

#include

#include

#include

#include

namespace android ;

//獲取單例例項。

static

inline graphicbufferallocator& get()

status_t alloc(uint32_t w, uint32_t h, pixelformat format, uint32_t usage,

buffer_handle_t* handle, uint32_t* stride);

status_t free(buffer_handle_t handle);

void dump(string8& res) const;

static

void dumptosystemlog();

private:

struct alloc_rec_t ;

//靜態變數

static mutex slock;

static keyedvectorsalloclist;

//父類宣告為友元類,原因是?不清楚。

friend

class singleton;

//構造和析構函式均為private。

graphicbufferallocator();

~graphicbufferallocator();

alloc_device_t *mallocdev;

};}; // namespace android

#endif // android_buffer_allocator_h

具體的實現思路是:

1. 在建構函式中開啟gralloc模組,在析構函式中關閉開啟的gralloc檔案描述符;

graphicbufferallocator::graphicbufferallocator()

: mallocdev(0)

}graphicbufferallocator::~graphicbufferallocator()

alloc()函式執行成功後,會插入到graphicbufferallocator類的靜態變數salloclist中,每次操作需要加鎖slock。在free時,會刪除key為handle的key-value對。

[frameworks/native/libs/ui/graphicbufferallocator.cpp]

mutex graphicbufferallocator::slock;

keyedvectorgraphicbufferallocator::salloclist;

status_t graphicbufferallocator::alloc(uint32_t width, uint32_t height,

pixelformat format, uint32_t usage, buffer_handle_t* handle,

uint32_t* stride)

return err;

}status_t graphicbufferallocator::free(buffer_handle_t handle)

return err;

}

android開發中的

線性布局 linear layout 相對布局 relative layout 布局 table layout 網格檢視 grid view 標籤布局 tab layout 列表檢視 list view 絕對布局 absolutelayout 1.實現tab的效果必須使用tabhost控制項作為ta...

Android中的Message Pool實現

為了避免物件頻繁建立銷毀帶來的開銷,可以採用乙個pool來維護這些物件,物件使用後可重新放到pool中被重新使用。message是乙個被頻繁使用的物件,因此message提供了乙個message pool。下面是message pool的實現。obtain方法用來從pool中獲取乙個message物...

Android中的廣播

android中的廣播。有發射廣播,必須要有收音機才能接到,並且調對臺才能得到對應的臺。1.電台發射廣播 使用intent,intent intent new intent 需要廣播的臺的名字 context。sendbroadcast intent 也就是先 生成一下你需要廣播的臺,然後用send...