对于帖子: pebble 开发 -- 图像缓存优化
https://tieba.baidu.com/p/4642104033我的最新理解是: 如果已经创建了图像内存, 就最好放到内存数组里面, 我制作了个api, pebble没有字典概念, 至少我还是用老办法数组:
代码虽然很长, 但是你只需要使用
static BitmapLayer* ZAPI_ImageCreate(uint32_t resourceId, GRect rect, bool isTransparent)
和
static void ZAPI_ImageChange(BitmapLayer* bitmapLayer, uint32_t resourceId)
这两个api即可, 内部可存储100张图片, 你可以扩展但我觉得用处不大, pebble50张都很难达到, 这样在真正的暴力测试的时候, pebble也不会因为重复读取位图而崩溃了(不这么做app运行久了会崩溃, 位图内存没有有效释放)
#define BUFFER_SIZE 8192
#define IMAGE_OPTIMAZED true
static uint32_t poolResourceId[100];
static GBitmap* poolResourceBitmap[100];
static bool poolResourceIsInited = false;
static void ZAPI_ImageINIT(){
poolResourceIsInited = true;
for(int i=0;i<100;i++){
poolResourceId[i]=0;
poolResourceBitmap[i] = NULL;
}
}
static void ZAPI_ImageDESTROYALL(){
for(int i=0;i<100;i++){
if(poolResourceId[i]!=0){
poolResourceId[i] = 0;
gbitmap_destroy(poolResourceBitmap[i]);
poolResourceBitmap[i] = NULL;
}
}
}
static GBitmap* ZAPI_ImageResource(uint32_t resourceId){
if(!poolResourceIsInited){
ZAPI_ImageINIT();
}
//have
for(int i=0;i<100;i++){
if(poolResourceId[i]==resourceId){
return poolResourceBitmap[i];
}
}
//no have
#if IMAGE_OPTIMAZED
uint8_t* load_buffer = malloc(BUFFER_SIZE);
size_t png_size = resource_load(resource_get_handle(resourceId),load_buffer, BUFFER_SIZE);
GBitmap* bitmap = gbitmap_create_from_png_data(load_buffer, png_size);
free(load_buffer);
#else
GBitmap* bitmap = gbitmap_create_with_resource(resourceId);
#endif
for(int i=0;i<100;i++){
if(poolResourceId[i]==0){
poolResourceId[i] = resourceId;
poolResourceBitmap[i] = bitmap;
break;
}
}
return bitmap;
}
static BitmapLayer* ZAPI_ImageCreate(uint32_t resourceId, GRect rect, bool isTransparent){
APP_LOG(APP_LOG_LEVEL_WARNING, "image %d",(int)resourceId);
// GBitmap* bitmap = gbitmap_create_with_resource(resourceId);
GBitmap* bitmap = ZAPI_ImageResource(resourceId);
BitmapLayer* layer = bitmap_layer_create(rect);
if(isTransparent){
bitmap_layer_set_compositing_mode(layer, GCompOpSet);
}
bitmap_layer_set_bitmap(layer, bitmap);
return layer;
}
static void ZAPI_ImageChange(BitmapLayer* bitmapLayer, uint32_t resourceId){
APP_LOG(APP_LOG_LEVEL_WARNING, "image %d",(int)resourceId);
GBitmap* bitmap = ZAPI_ImageResource(resourceId);
bitmap_layer_set_bitmap(bitmapLayer, bitmap);
}