我想读一个矩形区域,或整个屏幕像素.好像按下了屏幕截图按钮.
我怎么做的?
编辑:工作代码:
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) 使用glClear()函数时是否可以不清除整个屏幕?我需要清除屏幕的一部分以节省一些渲染时间,否则我将不得不每帧重绘一半屏幕,即使另一半没有发生任何事情.
当然,这应该像现在的glClear()一样快速(或更快)地完成.
渲染时我应该总是使用这种方法吗?在坏的gfx卡上它会减慢多少?
如果最终结果不会有很多剔除的面孔,那我甚至应该使用这种方法吗?
bool Win64bit = (sizeof(int*) == 8) ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
我需要这个,所以我的应用程序可以正确使用Windows注册表功能(或者我需要?).
我做得对吗?
我尝试使用本教程 http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=45
我在我的visual studio 2008加载它,编译它,它说丢失的文件:"GLES/glplatform.h"所以我谷歌文件...然后它发出遗漏的文件:"KHR/khrplatform.h",所以我谷歌那也是......然后它会扼杀所有可能的,"GLDouble未声明的标识符"等等,即使该教程有#include应该有那些.
我不知道从哪里开始修复这个,有人可以给我代码如何正确使用VBO(绘制一个立方体等),我尝试过的每个代码只是崩溃或不会编译.我找不到有用的东西.
这甚至可能吗?如果我有一天想sprintf(str, "%doodle %d", var);
输出"%doodle 123"而不是"123oodle",我怎么能阻止第一个%d被处理?
我不知道该怎么办......它毫无希望.我已经厌倦了猜测导致崩溃的原因.最近我注意到一些opengl调用在一些gfx卡上随机崩溃程序.所以我现在变得非常偏执,什么可能导致崩溃.这次崩溃的坏处是它只在使用该程序很长时间后崩溃,所以我只能猜出是什么问题.
我无法记住我对程序造成的可能导致崩溃的更改,已经很长时间了.但幸运的是,以前的版本没有崩溃,所以我可以只复制一些代码,浪费10个小时,看看它开始崩溃...我不认为我想这样做.
程序崩溃后,我连续5次处理相同的文件,每次在进程中使用大约200兆字节的内存.在阅读过程中和之后,它会随机崩溃.
我创建了一个"安全"的free()函数,它检查指针是否为非NULL,然后释放内存,然后将指针设置为NULL.这不是应该怎么做的?
我看到了任务管理器的内存使用情况,就在它崩溃之前它开始吃的内存比平常多2倍.每次加载文件时,程序加载速度也会呈指数级增长; 最初的几个负载看起来并没有显得慢得多,但随后它开始迅速加倍负载速度.这应该告诉我有关崩溃的信息?
另外,我是否必须使用clear()手动释放c ++向量?或者它们在使用后自动释放,例如,如果我在函数内部分配向量,那么每次函数结束时它是否会被释放?我没有在向量中存储指针.
-
简而言之:我想学会尽可能快地捕捉该死的虫子,我该怎么做?使用Visual Studio 2008.
好的,上一个问题得到了清楚的回答,但我发现了另一个问题.
如果我这样做:
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转换为字符串?
我有一个结构:
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个成员...)
我听说过"构造"或其他东西,但我想在代码的不同部分将这些值设置为其他值.
这是我用来在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++ ×9
opengl ×5
windows ×3
char ×1
culling ×1
glreadpixels ×1
new-operator ×1
registry ×1
string ×1
windows-xp ×1