一直忙项目,很长时间没有更新博客了。
近期碰到一个问题, 就是设定了DirectFB的主Surface输出到高清接口,比如HDMI, 而副Surface的内容则要输出到标清接口,比如CVBS。
我不想一条语句调用两次,分别向不同的Surface画, 研究了一下, Directfb是可以做到在输出到主Surface的同时,flip一份到副Surface的。
具体代码如下:
#include <stdio.h> #include <directfb.h> static IDirectFB *dfb = NULL; static IDirectFBSurface *primary = NULL; static IDirectFBDisplayLayer* secondaryLayer = NULL; static IDirectFBSurface* secondarySurface = NULL; static int screen_width = 0; static int screen_height = 0; #define DFBCHECK(x...) \ { \ DFBResult err = x; \ if (err != DFB_OK) \ {\ fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ );\ DirectFBErrorFatal( #x, err );\ }\ } int main(int argc, char **argv) { DFBSurfaceDescription dsc; DFBDisplayLayerConfig layerCfg; DFBCHECK (DirectFBInit (&argc, &argv)); DFBCHECK (DirectFBCreate (&dfb)); // DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN)); dsc.flags = DSDESC_CAPS; dsc.caps = DSCAPS_PRIMARY | DSCAPS_FLIPPING; DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary )); DFBCHECK (primary->SetColor (primary, 0xff, 0x00, 0x00, 0xff)); DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height)); DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height)); DFBCHECK (primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff)); DFBCHECK (primary->DrawLine (primary, 0, screen_height / 6, screen_width - 1, screen_height / 6)); DFBCHECK (primary->Flip (primary, NULL, 0)); dfb->GetDisplayLayer(dfb, DLID_PRIMARY+1, &secondaryLayer); secondaryLayer->SetCooperativeLevel(secondaryLayer, DLSCL_ADMINISTRATIVE); layerCfg.flags = DLCONF_SOURCE; layerCfg.source = DLSID_SURFACE; secondaryLayer->SetConfiguration(secondaryLayer, &layerCfg); secondaryLayer->GetSurface(secondaryLayer, &secondarySurface); secondarySurface->Flip(secondarySurface, NULL, DSFLIP_NONE); sleep(10); secondaryLayer->Release( secondaryLayer ); secondarySurface->Release( secondarySurface ); primary->Release(primary); dfb->Release(dfb); return 0; }
移动跨平台开发中使用Lua实现业务逻辑多平台重用
@authorAnderson Mao, 2013-03-26
移动跨平台应用,如果不是用HTML5的Web应用,经常需要在多个客户端开发原生程序,如J2ME/Android/iOS/等。
一般来说会有两大类客户端代码: C/ObjectC 和 Java。
如果没有代码重用/共享,开发类似的功能,比如一个Job, 在每个平台上都需要有一个Job Service业务逻辑。
使用原生应用,优点是UI方面现在可以比HTML5等表现更好。(以后HTML5可能会功能增强)。缺点是需要为每个平台编写类似,但是不共用的代码,比如Job Service, 功能类似,但是有多个平台版本。
对于HTML5可以满足的应用,跨平台可以用类似PhoneGap框架等来实现跨平台。
对于游戏等图像操作,也可以用基于Mono的Unity3D等框架来实现跨平台开发。
但是,对于业务逻辑比较复杂的其它应用,HTML5的UI效果又达不到要求,需要原生UI的,则可以考虑在业务逻辑层共享代码。
结构:
特点:
优点:
- 客户端UI 可以用原生做到性能最好
- 客户端业务逻辑多平台重用
- Lua业务逻辑代码可以在PC上直接测试。(不需要客户端和模拟器)
- Lua语言和引擎小巧使用广泛比较稳定可靠。
缺点:
- 需要学习Lua, 在多平台上配置嵌入Lua环境.
问题:
Q: 可不可以用JavaScript 引擎替代Lua?
A: JavaScript引擎也可以被嵌入,但是相比Lua体积太大,JavaScript功能主要是操作DOM方面比较方便,但是写业务逻辑Lua应该也可以胜任。
Q: Mono 平台也可以跨平台使用,用C#实现业务逻辑重用,然后也用原生做UI,相比Lua是不是更好?
A: Mono平台本身的以后发展可能是一个问题。另外如果以前没用过C#,也需要学习C#。
参考:
Lua: http://www.lua.org/
Calatrava:自由构建UI的跨平台移动框架(使用JavaScript开发重用业务逻辑) http://www.infoq.com/cn/articles/calatrava
使用NGUI的时候,如果上面的图片或者Label不能正常显示,注意3点
1)transform的z轴是不是在底层背景的上面。
2)在同一个panel下,检查下Depth是否正确。
3)如果你上面的图片或者Label在一个panel里,而背景不在panel里,这时的Depth是不起作用的,你要把背景图片也放在已经存在的panel里,或者新建一个panel,把背景图片放进去。再调整下前后顺序,就好了。