小编New*_*bie的帖子

如何读取屏幕像素?

我想读一个矩形区域,或整个屏幕像素.好像按下了屏幕截图按钮.

我怎么做的?

编辑:工作代码:

void CaptureScreen(char *filename)
{
    int nScreenWidth = GetSystemMetrics(SM_CXSCREEN);
    int nScreenHeight = GetSystemMetrics(SM_CYSCREEN);
    HWND hDesktopWnd = GetDesktopWindow();
    HDC hDesktopDC = GetDC(hDesktopWnd);
    HDC hCaptureDC = CreateCompatibleDC(hDesktopDC);
    HBITMAP hCaptureBitmap = CreateCompatibleBitmap(hDesktopDC, nScreenWidth, nScreenHeight);
    SelectObject(hCaptureDC, hCaptureBitmap); 

    BitBlt(hCaptureDC, 0, 0, nScreenWidth, nScreenHeight, hDesktopDC, 0,0, SRCCOPY|CAPTUREBLT); 

    BITMAPINFO bmi = {0}; 
    bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); 
    bmi.bmiHeader.biWidth = nScreenWidth; 
    bmi.bmiHeader.biHeight = nScreenHeight; 
    bmi.bmiHeader.biPlanes = 1; 
    bmi.bmiHeader.biBitCount = 32; 
    bmi.bmiHeader.biCompression = BI_RGB; 

    RGBQUAD *pPixels = new RGBQUAD[nScreenWidth * nScreenHeight]; 

    GetDIBits(
        hCaptureDC, 
        hCaptureBitmap, 
        0,  
        nScreenHeight,  
        pPixels, 
        &bmi,  
        DIB_RGB_COLORS …
Run Code Online (Sandbox Code Playgroud)

c++ windows screen-capture

14
推荐指数
2
解决办法
2万
查看次数

OpenGL:如何只清除屏幕的一部分?

使用glClear()函数时是否可以不清除整个屏幕?我需要清除屏幕的一部分以节省一些渲染时间,否则我将不得不每帧重绘一半屏幕,即使另一半没有发生任何事情.

当然,这应该像现在的glClear()一样快速(或更快)地完成.

c++ opengl

12
推荐指数
2
解决办法
6116
查看次数

我应该总是使用GL_CULL_FACE吗?

渲染时我应该总是使用这种方法吗?在坏的gfx卡上它会减慢多少?

如果最终结果不会有很多剔除的面孔,那我甚至应该使用这种方法吗?

opengl culling

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

运行时是否正确检查Windows是否为64位?(C++)

bool Win64bit = (sizeof(int*) == 8) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

我需要这个,所以我的应用程序可以正确使用Windows注册表功能(或者我需要?).

我做得对吗?

c++ registry

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

如何让VBO工作

我尝试使用本教程 http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45

我在我的visual studio 2008加载它,编译它,它说丢失的文件:"GLES/glplatform.h"所以我谷歌文件...然后它发出遗漏的文件:"KHR/khrplatform.h",所以我谷歌那也是......然后它会扼杀所有可能的,"GLDouble未声明的标识符"等等,即使该教程有#include应该有那些.

我不知道从哪里开始修复这个,有人可以给我代码如何正确使用VBO(绘制一个立方体等),我尝试过的每个代码只是崩溃或不会编译.我找不到有用的东西.

c++ windows opengl visual-studio-2008

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

如何逃避sprintf()%标记,以便它们不被识别为变量?

这甚至可能吗?如果我有一天想sprintf(str, "%doodle %d", var);输出"%doodle 123"而不是"123oodle",我怎么能阻止第一个%d被处理?

c++ windows

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

如何正确调试并查找崩溃原因?

我不知道该怎么办......它毫无希望.我已经厌倦了猜测导致崩溃的原因.最近我注意到一些opengl调用在一些gfx卡上随机崩溃程序.所以我现在变得非常偏执,什么可能导致崩溃.这次崩溃的坏处是它只在使用该程序很长时间后崩溃,所以我只能猜出是什么问题.

我无法记住我对程序造成的可能导致崩溃的更改,已经很长时间了.但幸运的是,以前的版本没有崩溃,所以我可以只复制一些代码,浪费10个小时,看看它开始崩溃...我不认为我想这样做.

程序崩溃后,我连续5次处理相同的文件,每次在进程中使用大约200兆字节的内存.在阅读过程中和之后,它会随机崩溃.

我创建了一个"安全"的free()函数,它检查指针是否为非NULL,然后释放内存,然后将指针设置为NULL.这不是应该怎么做的?

我看到了任务管理器的内存使用情况,就在它崩溃之前它开始吃的内存比平常多2倍.每次加载文件时,程序加载速度也会呈指数级增长; 最初的几个负载看起来并没有显得慢得多,但随后它开始迅速加倍负载速度.这应该告诉我有关崩溃的信息?

另外,我是否必须使用clear()手动释放c ++向量?或者它们在使用后自动释放,例如,如果我在函数内部分配向量,那么每次函数结束时它是否会被释放?我没有在向量中存储指针.

-

简而言之:我想学会尽可能快地捕捉该死的虫子,我该怎么做?使用Visual Studio 2008.

c++ opengl windows-xp visual-studio-2008

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

C++ new&delete和string&functions

好的,上一个问题得到了清楚的回答,但我发现了另一个问题.

如果我这样做:

char *test(int ran){ 
    char *ret = new char[ran]; 
    // process... 
    return ret; 
} 
Run Code Online (Sandbox Code Playgroud)

然后运行它:

for(int i = 0; i < 100000000; i++){ 
   string str = test(rand()%10000000+10000000); 
   // process... 

   // no need to delete str anymore? string destructor does it for me here?
} 
Run Code Online (Sandbox Code Playgroud)

所以在将char*转换为字符串之后,我不必再担心删除了吗?

编辑:作为回答,我必须delete[]每次new[]调用,但在我的情况下,由于指针丢失,它不可能,所以问题是:如何正确地将char转换为字符串?

c++ string char new-operator delete-operator

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

如何将所有struct成员设置为相同的值?

我有一个结构:

struct something {
    int a, b, c, d;
};
Run Code Online (Sandbox Code Playgroud)

是否有一些简单的方法可以将所有a,b,c,d设置为某个值,而无需单独键入它们:

something var = {-1,-1,-1,-1};
Run Code Online (Sandbox Code Playgroud)

还有太多重复(假设结构有30个成员...)

我听说过"构造"或其他东西,但我想在代码的不同部分将这些值设置为其他值.

c++

6
推荐指数
3
解决办法
7632
查看次数

glReadPixels()真的很慢,更好的解决方案从鼠标位置获取OpenGL坐标?

这是我用来在3d场景中获取鼠标位置的代码:

void GetOGLPos(int x, int y, GLdouble &pX, GLdouble &pY, GLdouble &pZ){
 GLint viewport[4];
 GLdouble modelview[16];
 GLdouble projection[16];
 GLfloat winX, winY, winZ;

 glGetDoublev(GL_MODELVIEW_MATRIX, modelview);
 glGetDoublev(GL_PROJECTION_MATRIX, projection);
 glGetIntegerv(GL_VIEWPORT, viewport);

 winX = (float)x;
 winY = (float)viewport[3]-(float)y;
 glReadPixels(x, (int)winY, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &winZ);

 gluUnProject(winX, winY, winZ, modelview, projection, viewport, &pX, &pY, &pZ);
}
Run Code Online (Sandbox Code Playgroud)

但我注意到一件坏事...每帧1-2次调用该函数会使CPU占用率达到100%,3次或更多次调用200%CPU占用率(我有4个核心,1-2个呼叫= 25%,3个或更多呼叫) = 50%,我认为它不能高于50%...)

有没有其他方法可以有效地做到这一点?我每帧使用4次调用该函数,所以我知道应该为场景渲染哪些区域(我从每个屏幕角落拍摄).

另外我用它来知道我用鼠标指向哪个地方,所以我需要实时,但我想使用更少的CPU,因为即使只有1次调用也会使单核系统的使用率达到100%.

编辑

我已经尝试过glPushName()方法,但它的速度更慢,在我的GPU中比在CPU中更慢.当我在程序中不使用单个glReadPixels()调用时,我的CPU使用率仅为0-1%.奇怪的是,我的CPU使用率很高,但它不会使程序滞后,就像你预期的那样100%使用...当我的程序打开时,只有当我使用其他程序时才出现问题,那么使用它们会有些滞后.

c++ opengl glreadpixels

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