请考虑以下代码:
std::string my_error_string = "Some error message";
// ...
throw std::runtime_error(std::string("Error: ") + my_error_string);
Run Code Online (Sandbox Code Playgroud)
传递给runtime_error的字符串是字符串返回的临时字符串operator+.假设此异常的处理方式如下:
catch (const std::runtime_error& e)
{
std::cout << e.what() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
字符串的临时返回何时被operator+销毁?语言规范有什么可说的吗?另外,假设runtime_error接受了一个const char*参数,并抛出如下:
// Suppose runtime_error has the constructor runtime_error(const char* message)
throw std::runtime_error((std::string("Error: ") + my_error_string).c_str());
Run Code Online (Sandbox Code Playgroud)
现在什么时候运算符+返回的临时字符串被销毁?它会在catch块尝试打印之前被销毁,这就是为什么runtime_error接受std :: string而不是const char*?
我正在开发一款游戏,我的所有图片都使用洋红色作为透明/魔幻色彩.它们都是32位,洋红色只是为了方便.无论如何,如果有人可以建议我应该使用什么库加载我的图像(我需要以GL_RGBA格式加载它们,内部和纹理特定),我将不胜感激.
我有一个相当标准的MFC应用程序,它包含一个主窗口,偶尔会显示模态对话框.众所周知,在关闭模式对话框之前无法完成任何操作.
因此,一个不错的UI功能是"调暗"对话框后面的主窗口的其余部分,直观地表明在完成模态对话框之前不能使用它.一些Web应用程序和java/mac应用程序执行此操作,但我从未在传统的C++/MFC应用程序中看到它.我想尝试一下,即使这个平台很不寻常.
如何才能做到这一点?我在应用程序中有几个模态对话框,在此模式中使用:
// pMainFrame is available as a pointer to the CWnd of the main window
CMyDialog dialog;
dialog.DoModal(); // invoke modal dialog; returns after dialog closed
Run Code Online (Sandbox Code Playgroud)
是否有一种简单的方法可以在任何DoModal()之前使窗口变暗并在之后恢复?我正在使用Visual Studio 2010,以防更新的MFC具有任何可能有用的功能.
编辑:我已经发布了一个基于oystein答案的解决方案,但是我开始获得赏金以防万一有人可以改进它 - 尤其是顺利淡入/淡出.
请考虑以下代码段:
#include <map>
class C {
public:
C() {}
const int& f(const int& x) const
{
// Error: cannot cast const int* to int* const
return myMap.find(&x)->second;
// With a const_cast works:
//return myMap.find(const_cast<int* const>(&x))->second;
}
std::map<int*, int> myMap;
};
int _tmain(int argc, _TCHAR* argv[])
{
int x = 0;
C c;
c.f(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误f()是由于map的const重载引起find()的const KeyType&.因为地图的关键类型是int*,所以转入int* const. f()采用一个const int&参数,这是正确的,因为从不修改参数.
不幸的是,最终会尝试将a转换const int*为a int* const …
我有一个现有的 WebGL 渲染器(代码太多,无法共享),它曾经非常简单:它只有一个顶点着色器、一个片段着色器和一个具有两者的着色器程序。它用于渲染四边形。
我正在尝试扩展它以拥有第二个着色器程序,用于渲染点精灵。它有自己的顶点属性数组,以及第二个顶点着色器、片段着色器和着色器程序。
我似乎无法在两者之间正确切换:我不断出现显示故障、随机消失的对象等。这是我必须在它们之间切换的两个功能。知道我错过了什么吗?
GLWrapProto.switchQuadProgram = function ()
{
var gl = this.gl;
gl.useProgram(this.shaderProgramPoint);
gl.disableVertexAttribArray(this.locAPosPoint);
gl.useProgram(this.shaderProgram);
gl.enableVertexAttribArray(this.locAPos);
gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);
gl.vertexAttribPointer(this.locAPos, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(this.locATex);
gl.bindBuffer(gl.ARRAY_BUFFER, this.texcoordBuffer);
gl.vertexAttribPointer(this.locATex, 2, gl.FLOAT, false, 0, 0);
};
GLWrapProto.switchPointProgram = function ()
{
var gl = this.gl;
gl.useProgram(this.shaderProgram);
gl.disableVertexAttribArray(this.locAPos);
gl.disableVertexAttribArray(this.locATex);
gl.useProgram(this.shaderProgramPoint);
gl.enableVertexAttribArray(this.locAPosPoint);
gl.bindBuffer(gl.ARRAY_BUFFER, this.pointBuffer);
gl.vertexAttribPointer(this.locAPosPoint, 4, gl.FLOAT, false, 0, 0);
};
Run Code Online (Sandbox Code Playgroud) 这与WebGL中的Switch shader程序有关,但我现在想重新提出这个问题,我对这个问题以及我想问的内容有了更清楚的认识.
我正在尝试在不同的着色器程序之间切换,但在同一渲染中切换着色器程序时,我似乎无法正确渲染.我认为在打电话后有状态丢失或重置glUseProgram().
通话结束后丢失或重置的状态是什么?换句话说,我需要再次绑定glUseProgram()什么?
我有一个2D HTML5游戏引擎(www.scirra.com),并且真的想要检测WebGL是否将使用Chrome 18的'Swiftshader'软件渲染器进行渲染.如果是这样,我们更倾向于回归到普通的画布2D上下文,就像在其他浏览器中一样.那里的人群中有低CPU的低端机器,在软件渲染时将游戏变成幻灯片,我认为在很多情况下2D画布会加速硬件.但是,在Chrome中WebGL上下文创建永远不会失败,并且没有明显的方法来检测SwiftShader.
我试过的事情:
// Always returns "WebKit WebGL" regardless of SwiftShader
gl.getParameter(gl.RENDERER)
// Always returns "WebKit" regardless of SwiftShader
gl.getParameter(gl.VENDOR)
Run Code Online (Sandbox Code Playgroud)
我可以尝试考虑最大纹理大小或其他MAX_*属性之类的东西,但是我怎么知道它们在机器之间不会因为SwiftShader而有所不同?而且我认为SwiftShader的目的是模仿常见的硬件,使用这种方法可能仍然会产生很多误报.
我不想写一个启动性能测试,因为:
我不想在Chrome上禁用WebGL,因为硬件加速的WebGL性能可以超过canvas 2D的两倍!如果我们这样做,每个人都会失败.
我不想添加游戏内开关或用户设置,因为有多少用户关心它?如果游戏很慢,他们就会退出,很可能不会搜索解决方案."这场比赛很糟糕,我会去别的地方." 我认为只有少数用户会费心阅读"顺便说一下,如果这个游戏很慢,请尝试将此设置更改为'画布2D'......"
我目前最好的猜测是使用gl.getSupportedExtensions().我发现SwiftShader报告了以下扩展:
OES_texture_float,OES_standard_derivatives,WEBKIT_WEBGL_lose_context
Run Code Online (Sandbox Code Playgroud)
...但真正的硬件加速上下文报告:
OES_texture_float,OES_standard_derivatives,WEBKIT_WEBGL_lose_context,WEBKIT_WEBGL_compressed_textures
Run Code Online (Sandbox Code Playgroud)
注意添加WEBKIT_WEBGL_compressed_textures.一些快速研究表明,这可能会或可能不会得到广泛支持.见这种支持台 -都GL_EXT_texture_compression_s3tc和GL_ARB_texture_compression出现的广泛支持在桌面上的卡.此外,该表似乎只列出了相当旧的型号,因此我可能会猜测所有现代桌面图形卡都会支持WEBKIT_WEBGL_compressed_textures...因此我对SwiftShader的检测标准是:
WEBKIT_WEBGL_compressed_textures当然,如果SwiftShader将来添加压缩纹理支持,这又会再次破坏.但我无法通过软件渲染器看到压缩纹理的优势!此外,如果有许多不支持的实际工作视频卡,它仍然会得到很多误报WEBKIT_WEBGL_compressed_textures!
有没有更好的方法来检测SwiftShader?
Javascript的新代理功能提供了一些有趣的调试功能.例如get,如果您访问未定义的属性,则可以通过将其置于具有处理程序的代理服务器来"保护"对象.这有助于捕捉拼写错误和其他类型的错误.
这可以使用这样的东西:
class Something {
constructor()
{
this.foo = "bar";
allObjects.push(this);
}
};
function defend(o)
{
return new Proxy(o, DebugCheckHandler);
};
let rawSomething = new Something();
let defendedSomething = defend(rawSomething);
Run Code Online (Sandbox Code Playgroud)
代码可以勤勉地编写,只处理defendedSomething.但是在此示例中,Something构造函数传递this到其他位置(to allObjects).这最终会产生与使用两者rawSomething和defendedSomething跨代码库相同的效果.
然后问题出现在代理引用不等于其原始引用的事实上,因为rawSomething !== defendedSomething.例如,allObjects.includes(defendedSomething)如果包含,则返回false rawSomething,因为includes会进行严格===检查.
有没有一种很好的方法可以解决这个问题,而无需对代码进行太多更改?
我发现自己有点夸张.
我有一个大型应用程序,它有谷歌的V8 JavaScript引擎.在UI线程上对V8引擎进行了一些调用.为了对每个人推荐的用户友好,一些长操作在一个单独的线程上运行,而不会挂起UI线程.但是,这些长时间运行的操作也会调用V8 javascript引擎.所以多线程调用V8.
事实是,V8似乎使用线程本地存储.这似乎使我的应用程序随机爆炸.这绝对属于"这可能到现在为止如何运作?" 错误.
在没有重新设计我的应用程序的情况下,我提出了一个丑陋,丑陋可怕的超级黑客攻击:我可以让V8认为它在不同的线程上运行吗?
换句话说,我第一次打电话给V8时,我记下了这个主题.然后,对于V8的所有其他调用,我以某种方式欺骗线程,因此线程本地存储/其他任何线程依赖的工作.
可以吗?它会起作用吗?我甚至认为这样一个骗人的黑客是愚蠢的吗?
WebGL有一种clear清除整个表面的方法.清除表面特定矩形的最佳方法是什么?例如,我想将从(50,50)开始的100x100像素盒设置为全零(ARGB 0,0,0,0).我现在能想到的就是用一个写入零的着色器着色器绘制四边形.有没有更简单的方法?
c++ ×4
javascript ×4
webgl ×3
glsl ×2
shader ×2
32-bit ×1
canvas ×1
destructor ×1
ecmascript-6 ×1
exception ×1
graphics ×1
html5 ×1
map ×1
mfc ×1
modal-dialog ×1
opengl ×1
opengl-es ×1
performance ×1
png ×1
proxies ×1
stl ×1
temporary ×1
textures ×1
v8 ×1
winapi ×1