Android-Java SDK方法调用与NDK函数调用

时间:2012-12-13 04:52:44

标签: java android performance android-ndk

问题

当游戏使用大量函数调用时,将NDK用于游戏开发是否更好?至少可能在1000-10000的范围内......

情况

我正在编写一个游戏,我打算在Android上使用基于组件的设计的高级结构运行远离God Object anti-patern我怎么可能用游戏代码撞墙,因为我一直在阅读和听到关于你怎么永远不要让一个obj被删除哪个很好,但这使得我听到的更多功能调用也会占用你的表现。请参阅:Google I/O 2009 - Writing Real-Time Games for Android

测试

protected static void voidFun(Integer i){
    if(i == 4) Log.d(TAG, "This should be impossible.");
}

public static void test(){
    stressTestMillis(1000);
    stressTestMillis(10000);
    stressTestMillis(100000);
}

protected static void stressTestMillis(int loops) {
    long beforeBefore = System.currentTimeMillis();
    long before = beforeBefore;
    for(int i = 0; i < loops; i++){
        //Just measuring raw loop time not function call time.
    }
    long rawLoop = System.currentTimeMillis() - before;
    Integer test = 0;
    before = System.currentTimeMillis();
    for(int i = 0; i < loops; i++){
        voidFun(test);
    }
    long loop = System.currentTimeMillis() - before;
    long total = System.currentTimeMillis() - beforeBefore;
    Log.d("Stress Test", "Loops:"+loops+" Loop:"+loop+" Loop Tare:"+rawLoop+" function Total:"+(loop-rawLoop)+" Total:"+total);
}

结果

运行Test()

的结果
12-12 18:30:22.623: D/Stress Test(15863): Loops:1000 Loop:14 Loop Tare:1 function Total:13 Total:15
12-12 18:30:22.703: D/Stress Test(15863): Loops:10000 Loop:80 Loop Tare:4 function Total:76 Total:84
12-12 18:30:23.513: D/Stress Test(15863): Loops:100000 Loop:783 Loop Tare:26 function Total:757 Total:809

关注

这让我非常担心,因为基于组件的设计+ AI(行为树)本身就是大量的函数调用然后抛入物理学,你看了很多方法调用,很多时间10000已经超出范围。 ..

根据我的计算1000ms/30fps=33.333ms每个10000个函数调用76ms时钟,我已经超出预算并降至1000ms/76ms=13fps

奖励积分

对于奖励积分,我过度看了一些能让我继续沿着这条设计路径继续使用java的东西吗?

1 个答案:

答案 0 :(得分:1)

  1. 老实说,我怀疑一个简单的循环或一个简单的片段可以指导你并帮助你决定什么技术是最好的
  2. 根据Android运行时设计/体系结构,使用Java编程或使用NDK进行编程实际上是相同的,这意味着对于JVMmain()函数,每个函数都有1个线程默认情况下分配,两者都是“沙盒”,无法直接访问资源;因此,如果您打算使用NDK并且您认为使用C / C ++,您将获得对硬件的低访问权限,就像在其他硬件/机器人解决方案上发生的那样,您错了。您甚至可以为您的应用程序获得基本相同的生命周期,使用C / C ++,您可以使用更少的API。
  3. 决定是关于可重复使用的代码并将现有代码移植到Android,速度增益不应该是列表中的第一件事,并且很可能通过良好地使用该语言来完成,因为使用C / C这样的语言C ++你没有垃圾收集器或任何形式的自动内存管理,你可以更精确地设置和指导你的资源,当然你可以做一些事情并不意味着你的程序会神奇地超越你基于Java的等效应用程序。
  4. 在行业中,C ++是王者,所以如果你想在iOS,Blackberry,Windows 8等之间分享你的代码库,NDK可以成为你进入Android世界的入口点,这真是你应该为什么要这样做的原因程序与NDK,而不是表现,但重新使用现有的组件。
  5. 很多人只是忘记了JNI只是两种方式都可以工作,你可以从C ++调用Java方法,反之亦然,如果你用NDK编程并创建一个只有C ++的应用程序,也称为本机活动,那么JVM线程将永远分配,你总是默认为你的apk有2个线程。
  6. 在Java中比使用C / C ++更容易做的事情,例如,尝试在Java中创建按钮和触摸事件的虚拟接口,之后尝试仅对NDK执行相同操作。
  7. Android显然是面向大量使用Java语言来创建更容易的沙箱,我认为最终这是一个必要的恶魔,你可能最终会使用JNI以及Java线程和C / C ++线程。