设计开发

Android Studio中项目NDK原生部分整合方式

UPDATE 2016.11.14:
目前的新版Android Studio 2.2已经可以完美支持NDK原生代码整合,通过cmake以及lldb实现c/c++代码调试,并且支持代码补全等功能!

自从Android Studio出现以后,我就很少再使用Eclipse+ADT的组合做Android开发了,更快的反应速度和更人性化的操作方式以及智能感知方面等等的优势,确实体现出了Google最初宣传Android Studio时的大部分特点,不过这些种种优势目前还只是体现在Java应用开发部分,而对于需要用到C/C++的Android NDK开发时,目前还没有很好的支持,当然,参考目前Android Studio的版本迭代速度来看,这应该也只是时间问题,当初ADT刚出的时候也是问题多多,包括后来的CDT+NDK支持,最初也只是支持原生代码的编译生成so,过了很久很久的某次update才加入了原生代码的可视化调试功能(当时也是历尽万难才测试成功的,还只是很简单的混合ndk项目…)。

最近看到了ndk又更新到了r10b版本,而且又据说新版的Android Studio中已经加入了一些ndk支持,于是正好一次测试一下(Android Studio beta 0.8.14, android-ndk32-r10b-windows-x86_64):

Continue reading…

更新Cocos2d-x 3.2 Spine runtime运行库到2.1以及相关lua binding的更新

Cocos2d-x整合的Spine运行库版本一直是1.1,在3.2的Cocos2d-x下测试Spine功能时,很快就发现了问题(用的还只是某个泄漏的1.7版本),在做动画时如果关键帧中有alpha的话,比如做淡入淡出动画效果,会发现只有在win32平台时显示效果和Spine Editor中看到的一致,其它平台,如iOS Android Mac等看到的都是alpha基本没有变化,而且有些像叠加出来的效果一样。看了一下官方运行库的github readme (https://github.com/EsotericSoftware/spine-runtimes),提到有可能是由于3.x对于图片的alpha预乘(Premultiplied Alpha)处理导致,可以尝试改变export时的图片选项,开启预乘,试了一下,发现依然不对,而且奇怪的是反复重加载错误Spine动画的场景时有一定可能性显示正确!这时第一反应就是整合的Spine runtime问题,于是准备更新到2.1…
Continue reading…

我的cocos2d-x-3.2集成云风pbc lua binding方法

关于protobufcocos2d-x lua的集成,参考过网上的一些资料,考虑过用google官方实现,但感觉过于臃肿,且没有直接的lua接口,实际应用需要做的框架级的工作较多,再有就是protoc-gen-luahttps://code.google.com/p/protoc-gen-lua/),这个感觉就比较轻量了,但是还是有需要proto转换lua的前置操作,另外就是据说某些protobuf的使用方式还不被支持,最后发现了云风做的一个实现:pbchttps://github.com/cloudwu/pbc)感觉思路很不错,而且有lua binding,决定尝试下cocos2d-x的集成。

Continue reading…

熟悉一下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…不过既然是没见过的提示,还是搜索学习一下吧。

Continue reading…

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或{unity install path}/Data/CGIncludes/Lighting.cginc Windows, /Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc Mac)的LightingBlinnPhong在移动设备上使用时会出现高光曝掉的问题!

简单看lighting.cginc中的相关函数:

Continue reading…

修改Android签名证书keystore的密码、别名alias以及别名密码

之前在测试Eclipse ADT的Custom debug keystore自定义调试证书的时候,发过一篇关于调试证书规格的博文:Eclipse ADT的Custom debug keystore所需证书规格,提到过自定义调试证书的密码和alias命名以及alias密码都是有规矩的。其实Android应用开发接入各种SDK时会发现,有很多SDK是需要靠package name和keystore的指纹hash来识别的(百度地图SDK、Facebook SDK等等…),这样如果使用默认自动生成的debug keystore的话就会给开发调试工作带来一些麻烦。这时可以通过修改正式的release keystore,生成一份“遵守规矩”的临时自定义调试证书给开发时用,就方便多了,具体方法如下:

Continue reading…

关于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输出

最近研究GAE上的Java支持,接触到了不少J2EE的技术,先记录一些基础小问题吧,短期内没遇到GAE硬伤导致放弃的话应该会继续丰富这方面的内容。

这次记录的是关于Java JsonGson的缩进格式输出方法。

这个库默认情况下会输出格式紧凑没有缩进的Json字符串,像这样:

{"data1":100,"data2":"hello","list":["String 1","String 2","String 3"]}

这样虽然能减少一些字节,但是开发调试时量大了的话看着会很不舒服,开启缩进格式化的方法是不要直接new Gson对象,而是使用GsonBuilder创建Gson对象,像这样:

Continue reading…

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…