pebble开发经验总结
pebble吧
全部回复
仅看楼主
level 11
zszen 楼主
首先必须掌握的知识是c语言和js脚本代码,都不是很难,c只需要知道基础就可以了,为了节省cpu开销,pebble手表内的逻辑并不具备面向对象编程功能,更像是c语言或者cmd命令脚本这样依次执行的方式,所以想要声明变量或者函数,就必须写在前面,否则后面调用会找不到,另外c开发部分主代码
int main(void){
init()
app_event_loop()
deinit()

很像单片机的运行原理,在app event loop中是个语句死循环,除非关闭程序否则不会执行deinit销毁程序
有时间继续聊
2016年06月30日 15点06分 1
level 11
zszen 楼主
发布时如何移除log信息:
js头部加入:
console.log=function(strOutput){};
clang头部加入 (include之后):
#undef APP_LOG
#define APP_LOG(level, fmt, args... )
2016年07月01日 06点07分 2
level 11
zszen 楼主
2016年07月01日 07点07分 4
level 11
zszen 楼主
更新频繁的优化方法:
1.对频繁更新的对象单独创建一个独立的window
2.在频繁刷新时添加独立window, 这样只刷新频繁刷新的区域
3.需要整体刷新再把独立window移除
https://github.com/ron064/classio-battery-connection-Economy
2016年07月03日 09点07分 6
先收藏了,等空下来也研究研究
2016年07月07日 02点07分
感谢楼主, 请问楼主知道pebble自带的中文字体的名字吗? 我这边无法显示中文, 都是方框, 但是我弄一个中文字体就可以显示出来, 所以肯定是字体的问题, 万分感谢啊
2016年07月12日 03点07分
pebble没有提供中文系统字体, 只给自己通知使用, 你还是自己用resource来导入外部字体吧, 另外中文字在js和c之间传递也很麻烦, 自行搜索unicode传码解码方式, 本人基本表盘不涉及中文, 所以对这个了解的不多
2016年07月14日 08点07分
level 11
zszen 楼主
pebble app和表盘都弱化了版本和升级
当提交一个高版本时,如果手表app正在运行,则在最近几分钟内就会自动更新,而如果未运行的app,则在一启动第一时间更新app,本身大小轻量化下,这样的版本更替做的非常好
2016年07月07日 10点07分 7
level 11
zszen 楼主
貌似pebble的js部分和c部分都进行了打包,是否能解开我作为一个破解小白,是解不开的,为此暂时不担心内部接口泄露问题(比如坏人拿到接口结构,可以随便盗取用户信息等)
2016年07月07日 10点07分 8
level 11
zszen 楼主
pebble 的 c语言字符串操作 只集成了strcmp, strcpy, strcat
但是分割字符串的strtok没有支持
这里有解决方案, 把下面代码放到你的项目里面就可以了, 记住不要用这个strtok.c的名字会和内部库冲突(有都不让用, 坑爹)
http://opensource.apple.com//source/Libc/Libc-167/string.subproj/strtok.c
2016年07月11日 17点07分 9
level 11
zszen 楼主
对于帖子: 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);
}
2016年07月12日 04点07分 10
level 11
zszen 楼主
另一点要提到的是:
static void setDeviceStatus(TextLayer* textLayer,DEVICE_ID deviceId){
char str[63];
snprintf(str,sizeof(str),"%s",ik_deviceNames[deviceId]);
APP_LOG(APP_LOG_LEVEL_WARNING, "device status %s",str);
text_layer_set_text(textLayer, str);
}
这个函数会在用一次后崩溃, 或者不显示文字, log中并不显示错误具体原因, 一点一点断点查, 才查到这里, 轻则游戏关闭, 重则手表重启
这个问题是因为字符串变量 str 是在函数内部构造, 脱离了函数就会被销毁, 而为了节省内存, text_layer_set_text 只是把文本变量 textLayer 和 str 字符串变量绑定在一起, str 消失了, 就会出现各种问题错误. 简单的用法就是在 char 前面写上static, 告诉内存机制不要销毁这个内部变量
另外我只是对同一个文本变量进行反复设置, 如果多个, 有可能还是会出问题, 以后等我有这个需求再更新我的这个层
2016年07月12日 05点07分 11
很不错,加油
2016年07月14日 07点07分
level 11
zszen 楼主
如果你已经开发了一款足够稳定又富有特色的app, 苦于没有人下载么? 去官方论坛分享吧
论坛地址:
https://forums.pebble.com/
发帖类型选择Showcase, 在你的标题前面加上"[WATCHFACE] "
然后附上gif动画展示你的app, 这样老外就来下载了, 下载量就上去了
2016年07月14日 12点07分 13
论坛经常看到楼主的名字,是管理员吗?我想知道pebble time 2现在能买了吗?怎么个买法?
2016年07月19日 04点07分
level 11
zszen 楼主
关于编程中的交叉引用问题, 变量声明肯定放到最前端, 而函数声明不必
注意下面
void test(int p1){
}
其实它已经把声明和实现放在了一起, 如果你想调用一个后面实现的函数, 那么可以在变量声明后面加上函数声明, 也就是把声明放到最开头
void test(int p1);
像这样就可以在前面引用到后面的函数
2016年07月23日 07点07分 14
level 11
zszen 楼主
网页版开发地址: https://cloudpebble.net/ide/
想要代码提示稳定, chrome浏览器最好在匿名下进行, 避免任何插件对其进行干扰, 正常模式下很容易代码补全无法使用
2016年07月28日 16点07分 15
level 11
zszen 楼主
前面提到的可以局部刷新的方法, 说明一点, 只能局部包含window黑背景情况下才可以刷新, 否则, 无法做到省电效果, 所以只适合数字, 不适合表针
2016年09月06日 15点09分 16
level 11
zszen 楼主
之前借鉴代码, 发现运行就崩溃, 查了半天不知道为什么后来发现把返回参数从括号内移到return处就没有错误了, 也不知道对方代码怎么跑成功的
static createTextLayer(TextLayer* text, GRect frame, char text[], const char * fontKey, GColor color) ;
这样创建text并在下面调用会导致app崩溃
改成下面问题解决:
static TextLayer* createTextLayer(GRect frame, char text[], const char * fontKey, GColor color) ;
顺便附上创建文本的封装函数:
static TextLayer* createTextLayer(GRect frame, char text[], const char * fontKey, GColor color) {
TextLayer* text_layer = text_layer_create(frame);
text_layer_set_font(text_layer,fonts_get_system_font(fontKey));
text_layer_set_text_alignment(text_layer, GTextAlignmentCenter);
if(strlen(text)>0)text_layer_set_text(text_layer, text);
text_layer_set_text_color(text_layer, color);
text_layer_set_background_color(text_layer, GColorClear);
layer_add_child(window_get_root_layer(my_window), text_layer_get_layer(text_layer));
return text_layer;
}
2016年10月05日 13点10分 19
level 11
zszen 楼主
代码运行平台:
C 手表
Rocky.js 手表
Pebble.js 手机
PebbleKit JS 手机
2016年10月07日 18点10分 20
膜拜一下
2017年02月03日 10点02分
大神您好,我有一些关于pebble编程的问题想要请教。
2017年02月13日 14点02分
现在设想的架构是希望通过外界的一些传感器连接在arduino板子上,传感器所获得的数据通过蓝牙传到pebble表上。
2017年02月13日 14点02分
我感觉应该不需要去写一个app来实现,应该基本上就是通过蓝牙传消息的功能。您能给我一些指点吗,我该如何实现这个消息传输的功能呢,或者说哪里有没有类似这种消息传输的代码可以让我参考一下呢?真的很感谢您,真心的希望得到您的回复!!!
2017年02月13日 14点02分
1