小编jos*_*efx的帖子

我如何支持不同的OpenGL版本?

我有两个不同的系统,一个是OpenGL 1.4,一个是3.我的程序使用Shaders,它是OpenGL 3的一部分,仅在1.4实现中作为ARB扩展支持.

由于我无法在OpenGL 1.4中使用OpenGL 3功能,有没有一种方法可以支持两种OpenGL版本而无需编写两次相同的OpenGL代码(ARB/EXT和v3)?

opengl

10
推荐指数
2
解决办法
5242
查看次数

_beginthreadex内存不足

我目前正在调试一个多线程应用程序,它运行时没有错误,直到一些函数被调用大约2000次.之后,应用程序停止响应,我可以追溯到_beginthreadex失败并出现内存不足错误.

在ProcessExplorer中检查应用程序时,我可以看到越来越多的线程句柄泄露,并且在发生错误之前虚拟内存不断增长,私有字节保持低位.泄露的线程也调用CoInitialize,从不调用CoUninitialize.

我想知道的是:

  • 虚拟内存代表什么?
  • 虚拟内存是否与泄漏的线程句柄相关?
  • COM或MSXML6(由线程调用)是否复制线程句柄以及如何关闭它们?

我希望我的问题很明确,不会破坏任何问题,这是我的第一个问题,英语不是我的第一语言.:-(

我忘了提一下,一旦线程终止,我关闭_beginthreadex返回的句柄,这会将打开句柄的数量减少一半,但不会影响虚拟内存.另外,在我插入CloseHandle调用之前,ProcessExplorer中显示的每个线程句柄的线程句柄数为2.

编辑

之前没有包括这个,我感到愚蠢,我知道线程退出时活动线程的数量与Visual Studio调试时不会增长.我希望并不是所有泄露的内存都是调用TerminateThread的结果,因为它们被用在一个相当大的库中,我宁愿不修改它.

对于我的问题的com部分,使用!htrace -diff,我发现msxml分配的线程句柄但在函数调用结束后没有释放,它们是否与泄漏有关,或者它们将在以后关闭?

感谢所有这些评论,虽然问题仍然存在,但他们帮助我更好地理解它.

c++ windows com multithreading handle

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

从Direct3d到OpenGL

我目前在java中重写了一个旧的Visual Basic应用程序,很大一部分工作涉及用jogl替换Direct3d.
由于我没有处理Direct3d的经验,只有使用Opengl的经验很少,我仍然坚持为api调用寻找合适的替代品.

有没有好的指南/教程或参考?

编辑:
附加信息:

  • Direct3D版本8

opengl direct3d

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

调用最接近的拟合方法

作为开发一个小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()并遍历返回的数组并尝试查找拟合方法.然而,如果我不想采用我遇到的第一个"好"方法,那将会很复杂,所以我希望现有的解决方案至少可以处理:

  • 最接近:如果arg.getClass()==子类和方法m(超类),则m(子类)然后调用m(子类)
  • 变量参数:System.out.printf(String,String ...)

支持自动装箱也很不错.
如果一个调用无法解析,它可能会抛出一个异常(ma(String,Object),ma(Object,String),args = String,String)
(如果你直到这里,请感谢花时间阅读它: - ))

java reflection dynamic-languages

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

不同dll中的C++模板特化会产生链接器错误

我有一个第三方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 …

c++ dll templates dllimport visual-studio-2010

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