我有两个不同的系统,一个是OpenGL 1.4,一个是3.我的程序使用Shaders,它是OpenGL 3的一部分,仅在1.4实现中作为ARB扩展支持.
由于我无法在OpenGL 1.4中使用OpenGL 3功能,有没有一种方法可以支持两种OpenGL版本而无需编写两次相同的OpenGL代码(ARB/EXT和v3)?
我目前正在调试一个多线程应用程序,它运行时没有错误,直到一些函数被调用大约2000次.之后,应用程序停止响应,我可以追溯到_beginthreadex失败并出现内存不足错误.
在ProcessExplorer中检查应用程序时,我可以看到越来越多的线程句柄泄露,并且在发生错误之前虚拟内存不断增长,私有字节保持低位.泄露的线程也调用CoInitialize,从不调用CoUninitialize.
我想知道的是:
我希望我的问题很明确,不会破坏任何问题,这是我的第一个问题,英语不是我的第一语言.:-(
我忘了提一下,一旦线程终止,我关闭_beginthreadex返回的句柄,这会将打开句柄的数量减少一半,但不会影响虚拟内存.另外,在我插入CloseHandle调用之前,ProcessExplorer中显示的每个线程句柄的线程句柄数为2.
编辑
之前没有包括这个,我感到愚蠢,我知道线程退出时活动线程的数量与Visual Studio调试时不会增长.我希望并不是所有泄露的内存都是调用TerminateThread的结果,因为它们被用在一个相当大的库中,我宁愿不修改它.
对于我的问题的com部分,使用!htrace -diff,我发现msxml分配的线程句柄但在函数调用结束后没有释放,它们是否与泄漏有关,或者它们将在以后关闭?
感谢所有这些评论,虽然问题仍然存在,但他们帮助我更好地理解它.
我目前在java中重写了一个旧的Visual Basic应用程序,很大一部分工作涉及用jogl替换Direct3d.
由于我没有处理Direct3d的经验,只有使用Opengl的经验很少,我仍然坚持为api调用寻找合适的替代品.
有没有好的指南/教程或参考?
编辑:
附加信息:
作为开发一个小ScriptEngine的一部分,我反思地调用java方法.脚本引擎的调用为我提供了方法名称和参数数组的对象.要调用该方法,我尝试通过调用Class.getMethod(名称,参数类型)来解决它.
但是,这仅适用于参数的类和Method所期望的类相同的情况.
Object o1 = new Object();
Object out = System.out;
//Works as System.out.println(Object) is defined
Method ms = out.getClass().getMethod("println",o1.getClass());
Object o2 = new Integer(4);
//Does not work as System.out.println(Integer) is not defined
Method mo = out.getClass().getMethod("println",o2.getClass());
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种"简单"的方法来获得正确的方法,如果可能的话,最适合参数类型,或者我必须自己实现.
最贴合的是:
Object o1 = new Integer(1);
Object o2 = new String("");
getMethod(name, o1.getClass())//println(Object)
getMethod(name, o2.getClass())//println(String)
Run Code Online (Sandbox Code Playgroud)
更新:
澄清我需要的东西:脚本引擎是我在空闲时间写的一个小项目,因此我没有必须遵循的严格规则.因此我认为选择从引擎调用的方法与java编译器在编译时仅使用动态类型而不是Object的静态类型选择方法的方式相同.(有或没有自动装箱)
这是我首先希望的Class.getMethod()会解决.但是Class.getMethod()需要与Method声明的参数类型完全相同的类,使用子类将导致没有这样的方法Exception.这可能是有充分理由发生的,但是这个方法对我来说没用,因为我事先并不知道哪种参数类型适合.
另一种方法是调用Class.getMethods()并遍历返回的数组并尝试查找拟合方法.然而,如果我不想采用我遇到的第一个"好"方法,那将会很复杂,所以我希望现有的解决方案至少可以处理:
支持自动装箱也很不错.
如果一个调用无法解析,它可能会抛出一个异常(ma(String,Object),ma(Object,String),args = String,String)
(如果你直到这里,请感谢花时间阅读它: - ))
我有一个第三方dll包含一个具有多个特化的模板类.我在Linux上有自己的专业,试图编译一个Windows DLL然而导致链接器错误.
我试了一下,发现模板头上的dllimport规范可能是原因,删除它会解决我的问题.但是我不想修改或复制标题,因为它可能会随着第三方库的每次更新而中断.
这是一个重现我的问题的最小例子
test.h - dll/so header:
#ifdef _WIN32
#ifdef EXPORT
# define LIB_EXPORT __declspec(dllexport)
#else
# define LIB_EXPORT __declspec(dllimport)
#endif
#else
# define LIB_EXPORT
#endif
template <typename A> class LIB_EXPORT Foobar
{
public:
virtual void helloWorld(){}
virtual ~Foobar(){}
};
Run Code Online (Sandbox Code Playgroud)
test.cpp - dll/so impl:
#define EXPORT
#include "test.h"
template class __declspec(dllexport) Foobar<int>;
Run Code Online (Sandbox Code Playgroud)
main.cpp - 示例程序:
#include "test.h"
//explicit instanciation - does not help
template class __declspec(dllexport) Foobar<char>;
int main(int argc, char** argv)
{
Foobar<char> a;
a.helloWorld();
}
Run Code Online (Sandbox Code Playgroud)
有没有一种干净的方法可以在我的可执行文件中完整地实例化Foobar?
使用的编译器:Visual …