小编use*_*709的帖子

使用JNI,或不使用JNI(Android性能)

我刚刚在我正在开发的Android游戏中添加了一些计算代价昂贵的代码.有问题的代码是碰撞检测例程的集合,它们经常被调用(游戏循环的每次迭代)并且正在进行大量的计算.我觉得我的碰撞检测实现相当发达,而且我可以用Java编写它.

我一直在使用Traceview来分析代码,这个新的碰撞检测代码在某种程度上让我的游戏逻辑的持续时间翻了一番.这显然是一个令人担忧的问题,因为对于某些设备而言,这种性能打击可能会使我的游戏从可玩的状态变为无法玩的状态.

我一直在考虑不同的方法来优化这些代码,我想知道如果将代码移动到C++并使用JNI访问它,我是否会获得一些显着的性能节省?

以上问题是我主要关心的问题和我的问题.我已经确定以下两个原因是使用JNI的其他积极结果.但是,仅仅说服我将代码移植到C++是不够的.

  • 这将使代码更清晰.由于大多数碰撞检测都是某种向量数学,因此能够使用重载运算符而不是在Java中使用更冗长的向量类更为清晰.

  • 内存管理会更简单.你说比较简单吗?好吧,这是一款游戏,因此垃圾收集器运行不受欢迎,因为如果GC不断中断清理,GC最终可能会破坏游戏的性能.在CI中不必担心垃圾收集器,所以我可以避免使用临时静态变量在Java中做的所有丑陋的事情,并且只依赖于C++的旧旧堆栈内存

这问题可能是啰嗦,我想我已经涵盖了所有的观点.鉴于此信息,是否值得将我的代码从Java移植到C++并使用JNI访问它(出于提高性能的原因)?此外,有没有办法衡量或估计潜在的性能增益?

编辑:

所以我做到了.结果?从TraceView的角度来看,它的碰撞检测程序速度提高了6倍.

虽然到达那里并不容易.除了必须进行JNI舞蹈之外,我还必须进行一些我没想到的优化.主要是,使用直接分配的浮点缓冲区将数据从Java传递到本机.我最初的尝试只是使用一个float数组来保存有问题的数据,因为从Java到C++的转换更自然,但这真的很慢.直接缓冲完全侧向性能问题与java和本机之间的数组复制,并留下了6倍的凹凸.

另外,我只使用了Eigen数学库,而不是滚动我自己的矢量类.我不确定这会对性能有多大的影响,但至少,它为我节省了开发自己(效率较低)的矢量类的时间.

另一个经验教训是过度记录对性能不利(jic并不明显).

java-native-interface android collision-detection

11
推荐指数
1
解决办法
5641
查看次数

无法在设备上调试Android c ++应用程序(Visual Studio 2015)

在VS15中使用适用于C++的Android工具,我无法使调试器正常工作...... VS能够在测试设备上安装应用程序而不会出现问题,但调试不起作用.

Unable to start debugging. Non-debuggable application installed on the target device. Required file '/data/data/com.AndroidTest/lib/gdbserver' could not be found on the device. Please reinstall the debuggable version.
Run Code Online (Sandbox Code Playgroud)

我检查了apk; 它确实有gdbserver.

我正在使用的设备是运行Android 5.0.2的LG G 7.0(V400).该项目的目标是API级别19,但我也尝试过针对API级别21,但问题仍然存在.

有任何想法吗?

android-ndk visual-studio-2015

5
推荐指数
1
解决办法
719
查看次数

Subversion和Symfony 2

我的团队即将使用Symfony2框架开始一个Web项目.我们将使用SVN进行版本控制(这是不可协商的,对不起git粉丝).我试图概念化我们如何能够修改代码以及顺利部署到我们的实时服务器.

这是我们正在使用的一般系统:

  • SVN服务器
  • 部署服务器
  • 每个团队成员都应该在自己的机器上进行本地开发

我希望我们的系统如何工作:

  • 开发人员将网站代码签出到本地计算机
  • 通过Eclipse IDE开发
  • 在其计算机上调试,测试和启动站点的本地副本(连接到部署服务器以访问DB)
  • 检查SVN仓库的变化
  • 引导开发人员将更新的代码部署到实时服务器

这看起来像是一个很好的工作流程吗?唯一令人尴尬的部分是它需要每个开发人员将W/LAMP堆栈部署到他们的本地机器上.但是,这仍然是可行的.

此外,他们的任何特定于Symfony/SVN的工具或命令是否会使这个工作流程更容易实现?

svn symfony

2
推荐指数
1
解决办法
791
查看次数

mysql_insert_id无效

对于模糊标题的道歉,这是我的问题:

我的代码的目标是在具有自动增量字段的表中插入新行.插入后,我想获得刚刚生成的自动增量字段的值.

这是我的表格定义:

CREATE TABLE `EventComments` (
  `CommentID` int(11) NOT NULL AUTO_INCREMENT,
  `EventID` int(11) NOT NULL,
  `OwnerID` int(11) NOT NULL,
  `Comment` varchar(512) NOT NULL,
  `DateTime` datetime NOT NULL,
  PRIMARY KEY (`CommentID`)
) ENGINE=MyISAM AUTO_INCREMENT=68 DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)

我正在尝试获取CommentID字段的值.

所以,这是发出插入查询然后尝试获取CommentID值的php代码.

<?php
session_start();
ob_start();
include_once 'lib/functions.php';

if(isset($_SESSION['uid'])) {
    $eventID = $_GET['evid'];
    $ownerID = $_SESSION['uid'];
    $comment = $_GET['comment'];
    $comment = trim($comment);
    $dateTime = date('Y-m-d H:i:s');

    $db_connection = database_connect();

    if($eventID != null && !empty($comment)) {
        $query = "INSERT INTO meetup.EventComments (EventID, OwnerID, Comment,     DateTime) 
        VALUES …
Run Code Online (Sandbox Code Playgroud)

php mysql

1
推荐指数
1
解决办法
3288
查看次数

将vector <Foo>转换为vector <double>并找到最小值

我有一个vector<Foo>和一些函数double toDouble(const Foo& foo),我想在向量中的所有Foos上运行toDouble函数后找到最小的double值.

使用for循环解决这个问题很容易,但出于好奇,有没有一种方法可以使用标准库算法来实现这一点?

一个想法是用来std::transform转换vector<Foo>为a vector<double> 然后std::min_element用来找到最小的double值,但这需要填充一个新的临时向量...是否有更直接的解决方案?

c++ vector std c++11

0
推荐指数
1
解决办法
64
查看次数