gpt4 book ai didi

java - Android-Java SDK 方法调用 vs NDK 函数调用

转载 作者:行者123 更新时间:2023-11-30 03:52:59 26 4
gpt4 key购买 nike

问题

当游戏将使用大量函数调用时,使用 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.333ms10000 函数调用的时钟频率为 76ms,那么我已经超出了预算并下降到 1000ms/76ms=13fps

奖励积分

为了加分,我是否仔细研究了一些可以让我在继续使用 Java 的同时沿着这条设计路径继续前进的东西?

最佳答案

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

关于java - Android-Java SDK 方法调用 vs NDK 函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13853179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com