我在其他帖子中读到,这似乎是组合哈希值的最佳方式.有人可以打破这一点,并解释为什么这是最好的方法吗?
template <class T>
inline void hash_combine(std::size_t& seed, const T& v)
{
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
Run Code Online (Sandbox Code Playgroud)
编辑:另一个问题只是要求神奇的数字,但我想知道整个功能,而不仅仅是这一部分.
在我们基于游戏引擎cocos2d-x的Android游戏应用程序中,大部分代码都是用C++编写的,自Android 11以来,我们遇到了一个非常奇怪且关键的问题:
当本地库加载时,onLoadNativeLibraries现在突然需要 60 多秒。在 Android 11 之前,一切正常,加载时间为 0.2-3 秒。现在,当您启动游戏时,您会看到 60 秒以上的灰屏。
我们已经知道JNI_OnLoad60 秒停顿结束后会直接调用。
这是该函数的代码onLoadNativeLibraries
:
protected void onLoadNativeLibraries()
{
try
{
ApplicationInfo ai = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
Bundle bundle = ai.metaData;
String libName = bundle.getString("android.app.lib_name");
System.loadLibrary(libName); // line of 60 seconds stall
}
catch (Exception e)
{
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我们已经尝试过时间分析,但没有成功。只是它在该功能上花费了大量时间。此外,通过调试暂停不会导致任何进一步的线索。本机调试器不会在代码的 C++ 端显示任何内容。
有谁知道为什么会发生这种情况,或者我们可以尝试解决什么问题?任何帮助将不胜感激:)
我们的游戏引擎Cocos2d-x在其自己的非Java-UI线程上本机运行在android上.我们需要在Android UI线程上通过JNI从C++调用某些Java函数.
为了调用JNI-Functions,我们从这里使用JNIHelper.h/cpp: https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/platform/android/jni/JniHelper.h https: //github.com/cocos2d/cocos2d-x/blob/v3/cocos/platform/android/jni/JniHelper.cpp
例如这个C++代码:
Cocos2d-x
理想情况下,我们希望所有这些调用都发生在Android UI线程上,并将std :: function作为参数传递,一旦函数调用完成,就会再次使用Cocos2d-x-thread上的返回值调用该参数.
调用函数的理想方式:
auto retVal = JniHelper::callStaticStringMethod("org/utils/Facebook",
"getFacebookTokenString");
Run Code Online (Sandbox Code Playgroud)
但是也有很多没有任何返回值的调用,所以对于那些在java线程上调用它们应该更容易.
我正在使用带有 NDK-Build 的 Android Studio,它不显示单个 C++ 文件,因此我无法调试。它只显示一个 cpp-Folder 并在 ethe 文件夹中显示一些静态库,我无法进一步介入。我记得曾经可以进入这些库(它们像文件夹一样打开)并查看单个 cpp 文件。
这是我的 build.gradle 文件:
import java.util.regex.Pattern
import com.android.build.OutputFile
import org.apache.tools.ant.taskdefs.condition.Os
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
task('increaseVersionCode') << {
def buildFile = file("build.gradle")
def pattern = Pattern.compile("versionCode\\s+(\\d+)")
def manifestText = buildFile.getText()
def matcher = pattern.matcher(manifestText)
matcher.find()
def versionCode = Integer.parseInt(matcher.group(1))
def manifestContent = matcher.replaceAll("versionCode " + ++versionCode + "")
buildFile.write(manifestContent)
}
// DO NOT change the build.gradle on debug builds any longer, since this will lead to debugging …Run Code Online (Sandbox Code Playgroud) 对于编辑JavaScript或TypeScript总是始终在顶部看到当前函数名称(例如Xcode这样做)非常有用。有时,当编辑一个长函数(或使控制台遮挡屏幕的较大部分)时,能够验证我实际上是否在正确的函数中/知道我目前在哪个函数中将非常有用。 。
那可能吗?
我有以下功能,我想在使用 printf 时发出警告:
void LoggingManager::log(int32_t logLevel, const char *p_str, ...)
{
va_list args;
va_start(args, p_str);
vsnprintf(s_LogginManagerBuffer, LOGGING_MANAGER_BUFFER_SIZE - 1, p_str, args);
va_end(args);
internalLog(s_LogginManagerBuffer);
}
Run Code Online (Sandbox Code Playgroud)
如果我忘记为格式字符串中的一个标记添加参数,我想以某种方式发出警告。警告太多(或错误的论点)也会很棒。由于忘记了日志记录功能中的参数,我最近遇到了一些崩溃。
如果不可能这样做,我怎么能重写我的函数,有警告但功能相同?
Firebase Invites似乎附带了一个用于在iOS和Android上创建引荐链接的UI.由于我们正在制作游戏,我们希望使用自己的UI(至少可选择跳过显示标准系统UI).
是否有可能以编程方式将引用链接复制到剪贴板而不显示Invite UI?
android ios firebase firebase-invites firebase-dynamic-links