关于protobuf的cocos2d-x lua的集成,参考过网上的一些资料,考虑过用google官方实现,但感觉过于臃肿,且没有直接的lua接口,实际应用需要做的框架级的工作较多,再有就是protoc-gen-lua(https://code.google.com/p/protoc-gen-lua/),这个感觉就比较轻量了,但是还是有需要proto转换lua的前置操作,另外就是据说某些protobuf的使用方式还不被支持,最后发现了云风做的一个实现:pbc(https://github.com/cloudwu/pbc)感觉思路很不错,而且有lua binding,决定尝试下cocos2d-x的集成。
设计开发
熟悉一下Xcode下Mac App动态链接库的runpath
Xcode虽然已经用过很久了,但是很少接触Mac App的开发,尤其是对于Mac App的动态链接库用法更是知之甚少(大部分时间都是在做iOS开发而iOS又不支持动态链接库⊙﹏⊙b汗),果然在研究FMOD Studio的跨平台音效库时遇到了问题…先是在win32下写了一段测试代码,配合Studio工具做出的bank完成了基本加载、播放等基本逻辑,准备上Mac平台试验一下,结果一通忙活include和lib后,编译链接没问题了,停掉虾米的推荐准备听听Mac版的声音效果如何,结果一运行程序就崩溃了,看了下日志输出:
dyld: Library not loaded: @rpath/libfmodL.dylib
Referenced from: /Users/wzkres/Library/Developer/Xcode/DerivedData/CCTechDemo-gdcppdyfmrhlhzhidvykxyjrcvwo/Build/Products/Debug/CCTechDemo Mac.app/Contents/MacOS/CCTechDemo Mac
Reason: image not found
感觉有点类似win32下的没找到动态链接库的dll…不过既然是没见过的提示,还是搜索学习一下吧。
iOS6下慎用MPMoviePlayerViewController!
这个MPMoviePlayerViewController的事要从何说起呢,嗯……其实主要还是由于在播放视频时按Home键切出引发的问题:
先是测试发现游戏在播放开场视频时按Home键切换到后台后会触发libGPUSupportMercury.dylib: gpus_ReturnNotPermittedKillClient导致crash,关于这个异常大苹果的Technical Q&A QA1766(http://developer.apple.com/library/ios/#qa/qa1766/_index.html)已经交待得很清楚了,简单来说就是应用在处于后台状态时是不允许执行任何OpenGL命令的,包括前台时提交但尚未实际执行的缓冲指令!不过文档中提到的几个关键点我也都按规矩做了处理,稍作跟踪后发现,导致这个异常的原因是在应用播放视频时切到后台之后,MPMoviePlayerPlaybackDidFinishNotification通知被莫名其妙的触发了,导致后续逻辑按照开场视频播放结束开始执行,进而去加载OpenGL贴图,初始化状态等,于是自然被OS认为是违规调用了OpenGL命令,因此被kill掉了!
Android中GLSurfaceView在横竖屏切换时重新创建表面缓冲导致的问题
在做Android的OpenGL ES应用时,经常会遇到接入各种支付SDK等弹出UI导致当前横竖屏状态切换的问题,比如游戏是横屏landscape的,而支付SDK弹出的View是竖屏portrait的,这时如果不插手处理的话,系统会对GL的表面缓冲进行重新创建的处理,比如横屏的800×480会被重新创建为480×800,这样就会导致绘图错误,效果可以参考下面stackoverflow上贴出的图片。
解决这个问题的方法是:
Continue reading…
关于Unity3D内置Blinn Phong光照模型计算在移动设备上的曝光问题
Unity3D的surface shader用起来很是方便,比直接的cg写起来省事的多,而且有很多现成的东西可以include,比如光照部分就是,常用的lambert, blinn phong都提供了现成的实现,但是最近在做specular时发现,内置(https://unity3d.com/unity/download/archive下载全部内置shader source或 Windows, Mac)的LightingBlinnPhong在移动设备上使用时会出现高光曝掉的问题!
简单看lighting.cginc中的相关函数:
关于Javascript闭包closure的应用
最近在研究百度地图API的应用,试验了iOS SDK后又开始试验Web端的JS版应用,做到在地图上通过Ajax异步调用方式从后端取得数据后,添加标注并给标注添加对应的点击时间alert出此位置的信息时遇到了一个Javascript问题,最开始的code是这样写的:
$.ajax({ type : "get", url : urlStr, async : true, dataType : "json", error : function() { alert('No valid location record!'); }, success : function(json) { for(var i=0;i<json.length;i++) { var point = new BMap.Point(json[i].longtitude, json[i].latitude); var marker = new BMap.Marker(point); // 创建标注 // 添加点击事件侦听 mark.addEventListener("click", function() { alert('记录时间: '+json[i].logTime+' 定位时间: '+json[i].gpsTime); return; }); map.addOverlay(marker); // 将标注添加到地图中 } var point = new BMap.Point(json[0].longtitude, json[0].latitude); map.centerAndZoom(point, 15); } });
这样运行时,点击任意一个标注后就会收到浏览器的js脚本错误,提示json[i].logTime还有后面同样的gpsTime部分有问题,检查了一下,发现Ajax请求成功后的函数内循环遍历数据时的i是局部变量,而每一个mark的click侦听函数内的i都为对同一个变量的引用,也就是说循环遍历后每次点击触发执行这段响应代码时的i都是同一个数,而不是认为的对应每一个mark时的i,也自然就取不到所期望的数据了!
Continue reading…
开启Gson的缩进格式Json输出
Project Ne10在iPhone 4S上的试验结果
Project Ne10: https://github.com/projectNe10/Ne10
是由ARM官方人员创建并维护的一套基于neon SIMD指令集的优化函数库,可以用于提高多媒体,信号处理等计算的速度(类似于Intel的MMX和AMD的3D NOW!)。其实这个也是由于ARM意识到了现在很少会有iOS或Android等这些热门平台开发人员会去使用汇编优化的问题,才建立了这个开源项目。想想当初上学时学数字图像处理做算法,发现用MMX可以提高算法速度,然后吭哧了半天MMX的各种寄存器,指令集,然后很欢喜的看到提高了几十ms的速度后,那个欢乐啊,现在的程序猿真是幸福!
git clone了项目在Mac上用Xcode Version 5.0 (5A1413)试验一下,记录一下在我的iPhone 4S上的试验结果:
Continue reading…
使用图片方式自定义iOS导航栏navigationItem的backBarButtonItem
在做ViewControlller的navigationItem时,我们经常需要使用自定义的图片来替换系统默认的按钮样式,这点在对普通导航项,比如leftBarButtonItem或rightBarButtonItem来说还是比较简单的,通过UIBarButtonItem的setImage设置做好的图片按钮,然后再通过
[item setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
去掉默认的背景image就可以了。但是如果是想自定义特殊的backBarButtonItem就比较麻烦了, Continue reading…
如何转换Android打包用jks格式keystore证书为Air用pkcs12格式p12证书
由于受到Flash先进的Stage3D技术以及Unreal Epic Citadel演示的诱惑,决定试用一下Flash Builder的跨平台性能,顺利运行Starling 2D框架demo后决定打包上设备一试,遂即发现Air的跨平台导出Android安装包所需的签名证书居然是.p12格式,虽然这种“合体”证书在开发iOS时用到的还是蛮多的,但对Android开发来说还是头一次。
很明显,默认情况下原生Android开发生成的发布证书keystore不是.p12的格式,这时就需要转换一下,好在JDK中的一个叫keytool的工具可以完成此项工作,方法如下:
Continue reading…