quickcocos2dx的性能瓶颈在哪里?

项目做得一大半了,但是性能优点堪忧
即时RPG游戏,同屏刷100个avatar(衣服,武器,技能特效),加上地图,UI界面,大约600~800个显示对象,在windows的player上大约20~30帧,在安卓设备上大约20帧

所有的avatar渲染逻辑是在Lua的,地图部分在C++
每帧会遍历所有的avatar并且判断衣服,武器和状态,显示相应的动画

网络消息处理也在lua,如果同屏100个avatar,每0.1秒大约会有20~30条消息需要处理(改变avatar状态),也会对性能有影响

现在想优化性能但是有点无从下手(之前地图写在lua,每帧会遍历一万到两万个地图格子,很卡,现在移到C++了)

求优化思路

600~800个显示对象,不知是不是同批量渲染的?如果不是,这个性能本身已经接近极限了吧。
你可以通过Log打印时间来确定一下各个逻辑处理模块的执行时间,看一下哪一部分是瓶颈。当然如果所有逻辑处理时间远少于渲染处理的时间的话,就只有考虑提高渲染效率或者是减少同屏显示对象个数了。

测试可以刷100个同样的对象,但是实际游戏过程中不可能这么多同类的对象出现,所以不是同批量渲染

Lua和C++互相调用会影响性能吗?如果不会就没关系,如果会影响,那么是全部写到C++侧还是全部写到lua侧更优?

不少见……我们的C++版本已经在线上了。。。经常大几十个玩家同屏对战。。很卡的

在windows上控制台大量print信息都会影响帧率。。。蛋疼

C++版本都很卡, lua版本就不用说了。

首先分析下你c++版本,卡的原因,以及个个模块消耗

版主大大,我想顺便问一下,多点触控的问题啥时候修复啊

估计下周 吧

我觉得问题在网络部分吧。每个角色都有自己的网络请求?

只有主角有网络请求,其他角色都是根据服务器发送的通知进行处理

网络部分会严重影响帧率吗?

现在socket部分在C++,socket接收数据后进行分割处理,将消息包存在队列里。lua以0.1秒为间隔调用C++接口获取队列中的消息包(每次都是while循环,清空消息包队列)

瓶颈还是得靠数据来检测。除非是自己做的项目,不然凭感觉是很难找的。

你们可以Xcode真机调试,看看 Xcode 的性能检测。可以看到 CPU/GPU 的占用率,如果GPU满了,说明是渲染导致卡。如果GPU没满,而CPU满了,那就是代码慢了。然后再逐层找问题吧。

如果做不到批次渲染 可以尝试把看不见的东西裁减掉 直接减少没有意义的绘制
然后就是使用压缩纹理 大幅度降低内存 并且提高绘制效率
然后我怀疑你降帧还和文件io有关系 因为你不可能做到几百个元素全进内存 总有载入载出 io的消耗也是非常可观的

你还要把网络消息的处理移动到其他的线程去 或者限制每秒钟处理网络消息的耗时 不然你的cpu时间大部分都会阻塞在对网络消息的处理上

2d游戏的优化无非几个条条框框 自己钻研一下就好了

网络数据的接收和分包已经在独立线程了,但是消息处理只能在主线程啊,消息直接影响游戏内容显示的

贴图全部是异步加载并缓存,定期(10或20秒)将不再使用的贴图释放一次。应该没有同时进行大量io

压缩纹理可以减少内存占用,但是绘制效率不见得能提高多少吧

看来你的优化已经很成功了
已经不需要优化了 :11:

基本上就是drawCall太高的原因吧

吧垃圾回收关掉试一下呢?看看性能瓶颈是不是在这里.

在main.lua中调用:
collectgarbage(‘stop’)

其实我想说移动端不适合做同屏N多人的游戏。移动端不是PC,况且你PC都这么卡了。

  1. 人物的渲染方面,别用 Sprite,而是写一个 DrawNode 子类,用 Texture2D 直接绘制,特别是你一个角色有身体、衣服、武器的时候,直接绘制很减少很多性能卡点。参考:http://www.cocoachina.com/bbs/read.php?tid=216582#1013159

  2. 在客户端做一个简单的 area of interest 来过滤服务器发来的事件,在 aoi 之外的事件是需要做结果渲染,而不需要做过程渲染。这个话听上去比较虚,因为跟你们的网络协议处理机制耦合,自己琢磨琢磨