gpt4 book ai didi

java - 在 Java/OpenGL 下激活 nVIDIA Optimus?

转载 作者:行者123 更新时间:2023-11-29 08:45:57 25 4
gpt4 key购买 nike

我知道它已经问了好几次都没有明确的答案,我已经向 nVIDIA 提交了一个错误。但是,我仍在寻找比在 Prism-D3D 引擎中启动 JavaFX 更好的解决方法(它立即允许通过 nVIDIA 创建后续的 OpenGL 上下文)。

环境:

  • nVIDIA 860m,驱动程序 337.88、340.43、340.66(四核驱动程序)
  • Java 8u11(也测试了 x86/x64 和 Java 7)

测试失败:

  • nVIDIA 简介
  • NvOptimusEnablement(用 C 语言编写的自定义启动器)
  • 首先调用 OpenCL(用 C 编写的自定义启动器)
  • 首先调用 Cuda(JCuda,它实际上显示 nVIDIA 名称,但 OpenGL 不受影响)

失败的 API:

解决方法:

  • JavaFX8 D3D 管道。 D3D 初始化工作后创建的所有 GLContext。

我将问题确定为一个非常简单的示例,调用 realtech-vr OpenGL Extension Viewer (用 .NET 编写)。里面有一个本地“infogl.dll”,它读取 GL 信息并显然在 oevClientInitialize 之后立即激活 Optimus。

奇怪的是,调用 infogl.dll 的最简单的控制台程序可以工作:

    Win32.oevSetDriverVersion("10.18.10.3621", 2176);
Win32.oevClientLoadDatabase(File.ReadAllText("C:\\Program Files (x86)\\realtech VR\\OpenGL Extensions Viewer 4.1\\extensions.xml"));
Win32.oevClientInitialize();
for (var i = 0; i <= 9; i++)
{
var tree = Marshal.PtrToStringAnsi(Win32.oevClientGetCapsAndExtTree(i));
Console.WriteLine(tree.Split('\n').First(ln => ln.Contains("text_id=\"357\"")));
}
Console.ReadLine();

但是 JNA 在 Java 中编写的完全相同的代码不会:

    infogl.INSTANCE.oevSetDriverVersion("10.18.10.3621", 2176);
String extXml = null;
try {
extXml = new String(
Files.readAllBytes(Paths.get("C:\\Program Files (x86)\\realtech VR\\OpenGL Extensions Viewer 4.1\\extensions.xml")),
"UTF-8");
} catch (IOException e) {
throw new RuntimeException(e);
}
infogl.INSTANCE.oevClientLoadDatabase(extXml);
infogl.INSTANCE.oevClientInitialize();
for (int i = 0; i <= 9; i++)
{
String tree = infogl.INSTANCE.oevClientGetCapsAndExtTree(i);
System.out.println(Arrays.asList(tree.split("\\n")).first(ln -> ln.contains("text_id=\"357\"")));
}

而且它与可执行文件名称“java”无关 - 我试过了。

JavaFX D3D 解决方案不合适,因为它在 AMD Radeon 芯片上将 OpenGL FPS 降低了一半 - 我认为这在 nVIDIA 芯片上一定同样糟糕,这就是我寻求让它与 ES2 管道一起工作的原因。

最佳答案

从 .NET 启动 JVM 显然可行(通过 jni4net)。它在 JavaFX 最终确定结束时在 nvoglv64.dll 中崩溃。

using net.sf.jni4net;
using net.sf.jni4net.utils;
...

public static void Main(string[] args)
{
InitializeOpenGL();
var setup = new BridgeSetup();
setup.AddClassPath(@"C:\Program Files\Java\jdk1.8.0_11\demo\javafx_samples\Modena.jar");
setup.AddJVMOption("-Dprism.order=es2");
setup.AddJVMOption("-Dprism.verbose=true");
var env = Bridge.CreateJVM(setup);
java.lang.System.@out.println("Greetings from C# to Java world!");
Console.WriteLine("Initializing...");
var klass = env.FindClass("modena/Modena");
Console.WriteLine("Finding main()...");
var mainMethodId = klass.getMethods().First(m => m.getName().Equals("main")).GetMethodId();
Console.WriteLine("Calling main()...");
env.CallStaticVoidMethod(klass, mainMethodId, Convertor.ParArrayStrongC2JString(env, new string[0]));
Console.WriteLine("Ended, press enter");
Console.ReadLine();
}

protected static void InitializeOpenGL()
{
Win32.oevSetDriverVersion("10.18.10.3621", 2176);
Win32.oevClientLoadDatabase(File.ReadAllText("C:\\Program Files (x86)\\realtech VR\\OpenGL Extensions Viewer 4.1\\extensions.xml"));
Win32.oevClientInitialize();
for (var i = 0; i <= 9; i++)
{
var tree = Marshal.PtrToStringAnsi(Win32.oevClientGetCapsAndExtTree(i));
Console.WriteLine(tree.Split('\n').First(ln => ln.Contains("text_id=\"357\"")));
}
// Optimus should be activated by now!
}

我还没有找到在 .NET 下激活 Optimus 的真正原因......但是很可能相同代码的 C/C++ 不起作用,因为它正是 Java 版本所做的(JNI 调用)

PS:我刚刚验证了“OpenTK”(OpenGL 的 .NET 包装器)也无法激活 Optimus。我完全糊涂了......

关于java - 在 Java/OpenGL 下激活 nVIDIA Optimus?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25367851/

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