在 iOS 平台下我们可以用 Xcode 自带的 Profile 工具来测试我们程序的性能,Android 平台使用的 gprof

这里整理了一下具体的cocos2dx 使用gprof进行性能分析的具体步骤、 遇到的问题及解决方案

因为 Android 本来就是基于 Linux 的,所以这里用 gprof 来做性能测试是没什么问题的。不过需要注意的是,这里所说的性能测试是针对 NDK 编译的 C++ 代码的。就想 Cocos2d-x 这样的 C++ 实现的游戏引擎就可以通过 gprof 来分析。下面我们来说说搞法

一.准备工作

1.参考资料

网上有很多前辈写的比较好的帖子,这里先贴出来让大家看看。

教程:

http://leenjewel.github.io/blog/2015/04/17/android-ping-tai-yong-gprof-gei-cocos2d-x-zuo-xing-neng-fen-xi/

http://www.cnblogs.com/tibetanmastiff/p/3625569.html

http://www.cnblogs.com/anxin1225/p/6151092.html

http://blog.csdn.net/kesaihao862/article/details/7313679

http://www.cnblogs.com/feisky/archive/2010/03/09/1681997.html

本文主要依据Android 平台用 Gprof 给 Cocos2d-x 做性能分析 。

2.环境

Mac  下,Cocos2d-x 3.11.1,只不过是编译出的 so 文件有所不同罢了。

只要是 NDK 的代码都可以用 gprof 来做性能分析的。

2.android-ndk-profiler 下载Gprof

要想生成 gprof 的性能分析报告,我们优先要把一个叫做 android-ndk-profiler 的模块集成到我们的项目中。

原文提到的第一种下载:

android-ndk-profiler 模块的源代码在 GitHub 上面,首先要把模块代码 clone 下来

1
git clone git@github.com:richq/android-ndk-profiler.git

android-ndk-profiler 的项目自带了一篇文档说明教授如何集成和使用,但是写的比较简单,我来详细的说一下。android-ndk-profiler 项目 clone 下来后进到项目目录可以看到如下结构

1
2
3
4
 |-docs
|-example
|-jni
|-test

而我们需要的就是jni这个目录下面的文件。

2、我这里使用的别的方式

下载地址 :
https://github.com/richq/android-ndk-profiler

解压缩之后:

需要的就是jni这个目录下面的文件。

3.项目中集成

1、来到我们自己的 Cocos2d-x 项目目录中,新建一个叫做 android-ndk-profiler 的文件夹,将刚刚克隆的 android-ndk-profile 模块的 jni 目录中的所有文件拷贝到我们刚刚建立的文件夹中。

比如我这里

2.Android.mk

打开 proj.android/jin/Android.mk 文件,

#*注意* YOUR_ANDROID_NDK_PROFILER_PATH 是你 cocos2d-x 项目中 android-ndk-profiler 目录的位置

$(call import-add-path,$(YOUR_ANDROID_NDK_PROFILER_PATH))

# 加入头文件
LOCAL_C_INCLUDES += $(YOUR_ANDROID_NDK_PROFILER_PATH) APP_DEBUG := $(strip $(NDK_DEBUG)) # 如果是 Debug 模式,则引入 android-ndk-profiler
ifeq ($(APP_DEBUG),1)
LOCAL_CFLAGS := -pg
LOCAL_STATIC_LIBRARIES += android-ndk-profiler
endif ifeq ($(APP_DEBUG),1)
$(call import-module,YOUR_ANDROID_NDK_PROFILER_PATH)
endif

根据上面配置的路径,这里可以添加一下代码

proj.android/jin/Android.mk

#*注意* YOUR_ANDROID_NDK_PROFILER_PATH 是你 cocos2d-x 项目中 android-ndk-profiler 目录的位置

$(call import-add-path, $(LOCAL_PATH)/../../../cocos2d-x/external/android-ndk-profiler)

# 加入头文件
LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../cocos2d-x/external/android-ndk-profiler LOCAL_CFLAGS := -pg
LOCAL_STATIC_LIBRARIES += android-ndk-profiler $(call import-module, android-ndk-profiler)
c
注意:具体路径根据你自己的项目进行配置,这里不做解释

3.编辑 AppDelegate.cpp 文件

只需要引入一个头文件,添加两个函数调用即可

// 引入头文件
#if (COCOS2D_DEBUG>0 && CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include "prof.h"
#endif bool AppDelegate::applicationDidFinishLaunching()
{
#if (COCOS2D_DEBUG>0 && CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
monstartup("libcocos2dlua.so");
#endif
// 其他已有逻辑代码......
} void AppDelegate::applicationDidEnterBackground()
{
// 其他已有逻辑代码......
#if (COCOS2D_DEBUG>0 && CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
moncleanup();
#endif
}

这里只需要注意两点。

WRITE_EXTERNAL_STORAGE 写的权限

AndroidManifest.xml 因为要生成性能分析报告,所以要赋予你的 Android 程序 WRITE_EXTERNAL_STORAGE 权限,即

1
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

libcocos2dlua.so 这个 so 文件会根据你的 Cocos2d-x 项目的类型不同名字上会有所不同,比如我们是 Lua 项目,所以 NDK 编译生成的 so 文件就叫 libcocos2dlua.so ,具体的文件名请自行到 proj.android/libs/armeabi 目录下查看。

4.编译打debug包

编译失败:

1.找不到 prof.h

可以在 proj.android/jin/Android.mk 上面添加

LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/../../../cocos2d-x/external/android-ndk-profiler \

2.
ucontext_t 不识别。 ucontext_t这个是在 ndk里面

由于我的 android-ndk-r9d没有,所以 换成了 android-ndk-r10e

打包成功之后运行会生成gmon.out

引用别人的原文,解释下原理:

生成 gmon.out 性能分析报告

项目编译完成后生成 apk 文件,将 apk 文件安装到 Android 设备上。通过上一小节我们对 AppDelegate.cpp 文件的修改不难看出,当程序在 Android 设备上运行的时候,调用了 monstartup 函数开始性能分析,当程序退到后台时调用了 moncleanup 函数生成性能分析报告。性能分析报告文件默认存储到 Android 设备的 /sdcard/gmon.out 位置,我们用 adb 工具可以把文件拉到电脑上面。

1
adb pull /sdcard/gmon.out .

当然官方文档里面也提了,如果想要自定义性能分析报告存放的位置,可以在调用 moncleanup 函数前指定要保存的位置。

1
2
setenv("CPUPROFILE", "/data/data/com.example.application/files/gmon.out", 1);
moncleanup();

解读性能分析报告 gmon.out

生成的性能分析告报 gmon.out 是不能直接通过文本编辑器打开来读的,它是个二进制文件,需要专门的工具来生成可读的文本文件。这个工具在 NDK 中已经提供了,以我使用的 android-ndk-r10d 为例:

1
2
3
4
5
cd android-ndk-r10d/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/

./arm-linux-androideabi-gprof \
你的项目路径/proj.android/obj/local/armeabi/libcocos2dlua.so\
你的gmon.out存放路径/gmon.out > gmon.txt

这里只解释一点。

libcocos2dlua.so 细心的读者发现这里使用的 so 文件并不是之前的那个放在 proj.android/libs/armeabi/libcocos2dlua.so 下面的那个 so 文件。这是因为最终随 apk 一起打包的那个 libcocos2dlua.so 文件(也就是 proj.android/libs/armeabi 目录下的)是不包含符号表的,而存放在 proj.android/obj/local/armeabi 目录下的是带符号表的版本。而什么是符号表,这是一个编译链接中的概念,请自行 Google 一下,或者读一读《程序员的自我修养》这本书,再次强烈推荐这本书。

咱们自己的代码

对于生成 的gmon.out分析,命令行:

分析 gmon.out
$ cd /Users/hanyundi/Documents/ZFT_SDK/android/android-ndk-r10e/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin $ ./arm-linux-androideabi-gprof libcocos2dlua.so的位置 gmon.out的位置 > mygmon.txt

mygmon.txt输出到了 arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin下,你可以放到你想放的地方

android-ndk-r10e(这个其他版本也可以。我试了几个)

遇到的问题

一开始使用的魅族手机,生成了gmon.out,但是解读的时候报错,换了一台华为的手机就可以了。

具体的gmon.out分析,可以自行百度。。。共勉之。。。

啰里啰嗦了半天。。。

lua代码分析的,推荐我哥们的一篇文章:

http://www.cnblogs.com/anxin1225/p/6151092.html

Cocos2d-x性能分析-Android版本之Gprof的更多相关文章

  1. APP 性能分析工作台——你的最佳桌面端性能分析助手

    目前 MARS-App 性能分析工作台版本为开发者提供Fastbot桌面版的服务. 旨在帮助开发者们更快.更便捷地开启智能测试之旅,成倍提升稳定性测试的效率. 作者:字节跳动终端技术--王凯 背景 F ...

  2. Android开发之Java集合类性能分析

    对于Android开发者来说深入了解Java的集合类很有必要主要是从Collection和Map接口衍生出来的,目前主要提供了List.Set和 Map这三大类的集合,今天Android吧(ard8. ...

  3. Android绘制优化(一)绘制性能分析

    前言 一个优秀的应用不仅仅是要有吸引人的功能和交互,同时在性能上也有很高的要求.运行Android系统的手机,虽然配置在不断的提升,但仍旧无法和PC相比,无法做到PC那样拥有超大的内存以及高性能的CP ...

  4. [转] Android 性能分析案例

    Android 系统的一个工程师(Romain Guy)针对Falcon Pro  应用,撰写了一个Android性能分析的文章.该文章介绍了如何分析一个应用哪里出现了性能瓶颈,导致该应用使用起来不流 ...

  5. 性能分析工具gprof介绍(转载)

    性能分析工具gprof介绍Ver:1.0 目录1. GPROF介绍 42. 使用步骤 43. 使用举例 43.1 测试环境 43.2 测试代码 43.3 数据分析 53.3.1 flat profil ...

  6. Android APP性能分析方法及工具

    近期读到<Speed up your app>一文.这是一篇关于Android APP性能分析.优化的文章.在这篇文章中,作者介绍他的APP分析优化规则.使用的工具和方法.我觉得值得大家借 ...

  7. Android性能分析之TraceView的使用

    TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它会产 ...

  8. android 性能分析、优化

    .主要介绍了一些分析工具,比如GT.ITest等http://www.jianshu.com/p/8b77d394b2a6 .详细介绍啦android平台常见性能优化工具http://blog.csd ...

  9. 正确使用Android性能分析工具——TraceView

    http://blog.jobbole.com/78995/     首页 最新文章 IT 职场 前端 后端 移动端 数据库 运维 其他技术 - 导航条 - 首页 最新文章 IT 职场 前端 - Ja ...

随机推荐

  1. UI设计学习路线图

    文章转载自「开发者圆桌」一个关于开发者入门.进阶.踩坑的微信公众号 这里整理的UI设计学习路线图包含初中高三个部分,你可以通过百度云盘下载观看对应的视频 链接: http://pan.baidu.co ...

  2. wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法

    wemall doraemon中Android app商城系统工具集合类,包含各种程序中用到的静态方法,可用于其他商城或者系统的编程参考 package cn.zzu.edu.wemall.utils ...

  3. 九度oj题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  4. hog特征及其提取方法图示

    1 什么是hog特征 hog特征是histogram of gradient的缩写.我们观察图像时,信息更多来自目标边沿的突变.我们计算一块区域内的所有像素处的梯度信息,即突变的方向和大小,然后对36 ...

  5. CSS学习笔记汇总

    CSS语法格式:一个css规则,由一个选择器和一个格式声明语句构成    例如:h1{color:red; font-size:14px;} CSS选择器: 1.基本选择器 1)* 号选择器:通配符, ...

  6. Linux搭建FastFDFS文件管理系统搭建,部署及上传材料

    昨天下午花了三四个小时在Linux centos 6 上搭建了一个分布式文件系统.纯粹是搭建来做自己的文件备份.所以把一些自己在其中遇到的一些问题给总结出来,免得更多人走错路. FastDFS 的一些 ...

  7. 自适应滤波——线性预测(LPC)

    作者:桂. 时间:2017-03-26  10:12:07 链接:http://www.cnblogs.com/xingshansi/p/6621914.html 声明:欢迎被转载,不过记得注明出处哦 ...

  8. 实时消息传输协议(RTMP)详解

    一.概念与摘要 RTMP协议从属于应用层,被设计用来在适合的传输协议(如TCP)上复用和打包多媒体传输流(如音频.视频和互动内容).RTMP提供了一套全双工的可靠的多路复用消息服务,类似于TCP协议[ ...

  9. 【笔记】归纳js getcomputedStyle, currentStyle 以及其相关用法

      好吧,鉴于前端则个行业知识宽度广而深,早期看过高程介绍过的获取元素计算后的最终样式(浏览器显示的最终样式)的方法现在也忘得七七八八了 于是百度了一下,看了一下大神张鑫旭的博客,这里写个随笔记录一下 ...

  10. servlet与jsp的区别(转)

    一.基本概念 1.1 Servlet Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面.它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器 ...