使用directx渲染, 解决WP8 wp8.1 wp10 版本内存与效率

Cocos2d-x
3.x
移植WP8版本

2015/11/25
我们的官方网站: http://starbroundary.com/http://starbroundary.com/

声明
Cocos2dx v3.x - wp8 版本 由于使用 Angle Project模拟directx ,所以效率不高,内存占用是安卓和 ios 的2倍,对游戏开发有非常大的限制,所以上海星界软件有限公司,直接使用directx 11 渲染,改写了cocos2dx v3.x-wp8 的底层,现在你可以开发出和 ios 和 一样的体验的游戏了。
支持的平台 wp8 wp8 .1 win 8 ,win 8 .1, win10

  1. libcurl找不到了?
    将这个工程cocos\platform\third_party\wp8\libcurl,添加到解决方案,重新引用一下。

  2. 字体边缘毛刺或黑边如何处理?
    修改ccx的源码,关于CCFreeTypeFont的修改,Github已给出解决方案,参见https://github.com/cocos2d/cocos2d-x/pull/4885

  3. 音效格式
    Cocos2dx 官方只支持wav 格式,我给他支持了mp3格式。

  4. 关于字体

    字体库太大,而使用的文字不多,可以使用字体图片来处理,参考http://www.cnblogs.com/haogj/p/3835258.htmlhttp://www.cnblogs.com/haogj/p/3835258.html
    或者可以下载一个迷你字体库

  5. 关于输入键盘
    在ccx激活输入法是通过CCEGLView::setIMEKeyboardState方式,但会遇到问题,在WP8下面会出现在中文输入法时,会同时接收到用户输入的英文和中文,而在WP8.1下面,则完全不能接受到中文。解决方式:当要激活键盘输入时,通过CCEGLView::OpenXamlEditBox来打开一个单独的专门输入页面。Cpp-test项目有示例。

  6. 关于内存限制
    WP8上对应用内存的限制有严格限制:
    http://msdn.microsoft.com/en-us/library/windows/apps/jj681682(v=vs.105).aspxhttp://msdn.microsoft.com/en-us/library/windows/apps/jj681682(v=vs.105).aspx
    ![](file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml\wpsB06B.tmp.png)

特别是512M机器在市面非常多,必须做好适配工作。512M属于低内存机器,一般情况下单个应用只能支持150M的运行内存,最多可以扩大到180M,做法如下:

  1. 图片的处理
    使用dds格式纹理,可以大量节约内存。dds格式的纹理是dirextx引擎支持的格式。(我们改成的引擎已经支持这个格式,由于cocos2dx官方编辑器不支持dds,在编辑ui 等模式的时候,请使用png,最后打包的时候改成dds ,删除png既可,注意dds纹理像素大小必须是2的次方)
  2. 内存释放
    如果游戏有很多场景,在切换场景的时候可以把前一个场景的内存全部释放,防止总内存过高。Ccx内存管理参考http://cn.cocos2d-x.org/tutorial/show?id=1331http://cn.cocos2d-x.org/tutorial/show?id=1331

// 目前为止所有加载的图片
CCTextureCache::sharedTextureCache()->removeAllTextures();

// 将引用计数为1的图片释放掉
CCTextureCache::sharedTextureCache()->removeUnusedTextures();

//单独释放某个图片
CCTextureCache::sharedTextureCache()->removeTexture();

CCSpriteFrame Cache 与 CCTextureCache 释放的方法差不多。

值得注意的是释放的时机,一般在切换场景的时候释放资源,如果从A场景切换到B场景,调用的函数顺序为B::init()—->A::exit()—->B::onEnter() 。
可如果使用了切换效果,比如CTransitionJumpZoom::transitionWithDuration这样的函数,则函数的调用顺序变为B::init()—->B::onEnter()—->A::exit() 。
而且第二种方式会有一瞬间将两个场景的资源叠加在一起,如果不采取过度,很可能会因为内存吃紧而崩溃。
有时强制释放全部资源时,会使某个正在执行的动画失去引用而弹出异常,可以调用CCActionManager::sharedManager()->removeAllActions();来解决。
参考http://blog.csdn.net/zhangjingyangguang/article/details/7618048http://blog.csdn.net/zhangjingyangguang/article/details/7618048
3. 内存优化
优化的心得就是尽量去拼接图片,使图片边长尽可能的保持2的N次方并且装的很满。但要注意,有逻辑关系的图片尽量打包在一张大图里,另外一点就是打包的时候要考虑到层的分布。因为为了渲染效率可能会用到CCSpriteBatchNode; 同一个BatchNode里的图片都是位于一个层级的,因此必须根据各个图片的层级关系,打包到不同的plist里。有时内存和效率不可以兼得,只能尽量平衡了。

  1. 屏幕锁定或从桌面恢复时,游戏会崩溃?
    这个问题是ccx的Bug,Github上已修复:
    https://github.com/cocos2d/cocos2d-x/commit/b0bc97152354b92f21d64295b328dcbfea99d2d0https://github.com/cocos2d/cocos2d-x/commit/b0bc97152354b92f21d64295b328dcbfea99d2d0
    并收入ccx3.0以上版本中了。

  2. 如果遇到难以解决的问题可以联系我, QQ :85105031

下载地址: http://starbroundary.com/download/cocos2d-x-3.3.zip

虽然你打广告了,但是还是有些干货的。
你排版不好,我帮你重新排一下。

:8: 谢谢了

好像很强大,其实我试了,好像一点用都没,新创建的工程都编译不起来,我表示下载下来的包也无法运行,这是助人还是坑人。可能是我自己的原因:10:

mark…

新的下载地址 : http://starboundary.com/download/cocos2d-x-3.3.zip