1

问题

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

情况

我正在编写一个游戏,我打算使用基于组件的设计在具有高级结构的 android 上运行,从而摆脱上帝对象反模式,因为我一直在阅读和听说你是如何使用游戏代码的永远不应该让一个 obj 被删除,这很好,但是我听说这会产生更多的函数调用,这也会影响你的表现。请参阅:Google I/O 2009 - 为 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 的同时继续沿着这条设计路径的东西?

4

1 回答 1

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