小编max*_*yne的帖子

如何在Visual Studio中为我的应用程序分配所有可用内存?

我想在我的基于Windows的软件中渲染4百万个三角形,该软件是用Visual Studio C++ 2010(在发布模式下构建)编写的.当我渲染3.9百万个三角形时,软件消耗的总RAM内存为400MB.但是当我尝试渲染4百万个三角形(仅多100K)时,系统会给我一个错误.

For Example:
Point *P = new (std::nothrow) Point[nb_triangles]; //==> "(std::nothrow)" is for catching the run time memory allocation error. (Point is X, Y, Z floats)
If(P == NULL)
   message("System can't allocate this much memory.");  // System gives me this error. It means the system can't reserve huge memory for this operation.
Run Code Online (Sandbox Code Playgroud)

我必须为顶点,面法线,顶点法线等分配内存.

其实我没有得到的是,我有8 GB RAM内存,(但在32位XP窗口= 3.2GB内存),软件只保留400MB,可用内存超过1 GB,但当我尝试只渲染100K三角形,它给了我一个错误.为什么它给我一个错误?因为它还有超过1 GB的可用RAM内存?

无论如何要解决这个问题,如何为我的应用程序分配所有可用内存?由于这个问题,我必须在软件中限制只是为了渲染3.9亿个三角形而且它并不好.

还有一个问题在于,c ++"new"运算符用于内存分配给我错误,c"malloc"运算符怎么样?可以"malloc"解决这个问题,这两者之间有什么不同?

请指导我.谢谢.

更新#1:

我已经尝试了很多,修改代码,删除内存泄漏等,但我不能分配超过4百万的内存.它不可能将我的整个代码更改为"向量".我不能改成"向量",我现在必须用"新"来坚持我自己的数据结构.以下是我想要分配以呈现1个对象的指针.

P = new points[10000000]; // points is the class with 3 floats …
Run Code Online (Sandbox Code Playgroud)

c c++ visual-studio-2010 visual-studio

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

如何检测开放网格3d模型的边界顶点?

有两种表面网格模型,闭合网格像球体或立方体,第二种是开放网格模型,这意味着模型的表面不是闭环.它从一个像空心管道的地方开放.Sp我想要的是我想检测开放网格模型的边界顶点.闭环网格中没有边界,但在开放网格中,我们必须检测边界顶点以进行一些平滑,细分等操作.请建议我如何选择/检测边界顶点?这样做的最佳方式是什么?通过比较三角形的边缘?给我一些想法?

谢谢.

math graphics geometry vertex computational-geometry

6
推荐指数
2
解决办法
8174
查看次数

创建一个快速Sin()函数来改善fps?快速sin()函数?

我实时渲染500x500点.我必须使用atan()和sin()函数计算点的位置.通过使用atan()和sin(),我获得24 fps(每秒帧数).

float thetaC = atan(value);
float h = (value) / (sin(thetaC)));
Run Code Online (Sandbox Code Playgroud)

如果我不使用sin(),我得到52 fps.

如果我不使用atan()我是30 fps.

所以,最大的问题是sin().我怎样才能使用Fast Sin版本.我可以为此创建一个查找表吗?我没有任何特定的值来创建LUT.在这种情况下我该怎么办?

PS:我也尝试过快速的ASM功能,但没有任何区别.

谢谢.

c c++ math performance trigonometry

5
推荐指数
2
解决办法
3267
查看次数

如何将三角形缠绕为 3D 网格模型的逆时针方向?

首先让我澄清一下..我不是在问 2D 网格,要确定 2D 网格的缠绕顺序,使用法向 z 方向非常容易。

其次,我不要求任何优化算法,我不担心时间或速度,我只想用我的网格来做。

当我使用贪婪投影三角剖分算法对 3D 对象进行三角剖分时,会发生此问题。检查所附图片。

如果我使用“计算有符号面积”或“三角形的 AB 和 BC 向量的交叉产生”对该模型应用 2D 方法,它只能求解 2D 网格,但 3D 网格又如何呢?

首先我们需要检查哪些三角形在 3D 网格中缠绕方向错误,然后我们只考虑这些三角形,那么问题是,我们如何检查哪些三角形在 3D 中缠绕方向错误?我们不能只用 2D 方法来做我已经测试过但没有成功。

例如,对于球体,我们不能对球体应用 2D 方法。那么有没有办法解决这个问题呢?

谢谢。

在此输入图像描述 在此输入图像描述

更新#1:

下面是检查哪条边具有相同缠绕的算法。效果不太好,我不知道为什么。理论上它应该纠正所有三角形,但它没有纠正。例如,在附图中检查球体的情况下。有问题。

void GLReversedEdge(int i, int j, GLFace *temp)
{
    //i'th triangle
    int V1 = temp[i].v1;
    int V2 = temp[i].v2;
    int V3 = temp[i].v3;

    //i'th triangle edges
    int E1[] ={V1, V2};
    int E2[] ={V2, V3};
    int E3[] ={V3, V1};

    //adjacent triangle
    int jV1 = temp[j].v1;
    int jV2 …
Run Code Online (Sandbox Code Playgroud)

algorithm mesh triangulation normals computational-geometry

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

在OpenGL中Bug的球体UV坐标?

我在我的球体上有错误的纹理贴图.这个问题众所周知,但解决方案很少见.

这是我为球体生成UV的代码.

T =三角形,Nv =顶点法线.

for (int i=0; i<nbF; i++)
{
    float tx1 = atan2(Nv[T[i].v1].x, Nv[T[i].v1].z) / (2.0f*M_PI) + 0.5f;
    float ty1 = asinf(Nv[T[i].v1].y) / M_PI + 0.5f;

    float tx2 = atan2(Nv[T[i].v2].x, Nv[T[i].v2].z) / (2.0f*M_PI) + 0.5f;
    float ty2 = asinf(Nv[T[i].v2].y) / M_PI + 0.5f;

    float tx3 = atan2(Nv[T[i].v3].x, Nv[T[i].v3].z) / (2.0f*M_PI) + 0.5f;
    float ty3 = asinf(Nv[T[i].v3].y) / M_PI + 0.5f;

    float n = 0.75f;

    if(tx2 < n && tx1 > n)
        tx2 += 1.0;
    else if(tx2 > n …
Run Code Online (Sandbox Code Playgroud)

opengl geometry texture-mapping coordinates uv-mapping

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

什么是CAD中的C2表面,C2是什么意思?

C2表面/网格是CAD/OpenGL中众所周知的表面.但我只是想知道什么是C2意味着什么?

C意味着什么?

2意味着什么?

C2 =首字母缩略词???????

opengl graphics mesh cad surface

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

在 OpenGL 中使用鼠标拾取在 3D 空间中拖动 3D 点的最佳方法?

通过鼠标拾取拖动 3D 点的最佳方法是什么?问题不在于拾取,而在于在 3D 空间中拖动。

我想有两种方法,一种是使用 gluUnProject 获取世界视图坐标并平移 3D 点。这种情况下的问题是,它仅在具有深度值的表面上(使用 glReadPixels),如果鼠标离开表面,它会根据 gluUnProject 的 winZ 组件给出最大或最小深度值。而且在某些情况下它不起作用。

第二种方法是使用 GL_MODELVIEW_MATRIX 沿 XY、XZ、YZ 平面拖动。但这种情况下的问题是,我们如何知道我们是在 XY、XZ 还是 YZ 平面上?我们如何知道轨迹球的前视图在 XY 平面内,如果我们想在侧平面而不是前平面上拖动怎么办?

那么,有没有什么方法可以为我提供准确的 2D 到 3D 坐标,以便我可以轻松地在各个方向上拖动 3D 点,而无需考虑平面情况?一定有办法的,我见过3D软件,他们有完美的拖动功能。

c++ opengl 3d drag-and-drop mouse-picking

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

大量内存的分配会产生错误吗?为什么?

我已经申请了高分辨率图像.

当我想分配大量内存时,系统会说"应用程序已经请求运行时以不寻常的方式终止它".但我想要的是,分配的指针必须返回0或NULL,我可以显示我的消息.它不返回零/ NULL为什么?任何的想法?我检查了调试,然后继续到MessageBox,它给出了这个错误.该怎么做才能显示我的信息?

有没有办法检查用户是否要分配足够大的内存而不是计算机PC容量?

谢谢.

ImageW = 2000;
ImageH = 2000;
point *Img = NULL;
Img = new point[ImageW*ImageH];
if(Img== NULL)
{   
MessageBox(0, "Your computer memory is too small.", "Error", MB_ICONERROR | MB_OK);
return; 
}
Run Code Online (Sandbox Code Playgroud)

c c++ visual-c++

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

停止直接执行主应用程序并从第二个应用程序执行它?

我想要的是使用我的小型LicenseExe应用程序启动我的主应用程序.

LicenseExe将检查该系统是否已注册.

如果系统未注册,则应退出LicenseExe.如果系统已注册,则LicenseExe将调用ShellExecute或执行主应用程序exe的任何方法.

这很容易我能做到这一点.

我想要的是,我的主应用程序永远不能通过直接双击其exe文件来执行.它仅由LicenseExe应用程序执行.可能吗?

这是使我的应用程序获得许可的一种技巧.所以,请指导我.如何直接停止执行我的主应用程序并使其依赖于我的小型LicenseExe应用程序.

主应用程序只能从LicenseExe应用程序启动,而不是通过双击而不是通过命令行启动.

我在Windows 7平台下使用C++ Visual Studio 2010.

c++

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

清除std :: vector数组的最佳方法是什么?

哪种方法更好更快,为什么?

for (unsigned int i=0; i<meshes.size(); i++)
{
    meshes.erase(meshes.begin() + i);
    if(meshes[i]) delete meshes[i];
}
Run Code Online (Sandbox Code Playgroud)

还是这一个......

for (auto it = meshes.begin(); it != meshes.end(); ++it)
    delete *it;
meshes.clear();
Run Code Online (Sandbox Code Playgroud)

visual-c++ c++11 c++14

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

如何在3D中计算任意形状的中心?

我想知道在3D中找到任意形状中心的准确方法.在图中,我已经解释了3个案例.

  1. 在第一种情况下,我们如何计算任意点的中心?一个想法是所有点的总和除以总点数.这是唯一的方法,它是否准确?

  2. 第二是如何计算3D中不规则任意形状的近似中心?这是1的相同情况吗?

  3. 我们如何计算由任意顶点组成的弯曲/弯曲管的中心线?对于这个问题,我们必须先解决两个案例吗?

在此输入图像描述

c++ opengl math 3d computational-geometry

-3
推荐指数
1
解决办法
1153
查看次数