小编Ash*_*ain的帖子

在抛出异常时破坏弦乐临时演员

请考虑以下代码:

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*?

c++ destructor exception temporary

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

将PNG纹理加载到OpenGL

我正在开发一款游戏,我的所有图片都使用洋红色作为透明/魔幻色彩.它们都是32位,洋红色只是为了方便.无论如何,如果有人可以建议我应该使用什么库加载我的图像(我需要以GL_RGBA格式加载它们,内部和纹理特定),我将不胜感激.

opengl png textures 32-bit

5
推荐指数
3
解决办法
7792
查看次数

MFC - 显示模态对话框时的暗淡主窗口

我有一个相当标准的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答案的解决方案,但是我开始获得赏金以防万一有人可以改进它 - 尤其是顺利淡入/淡出.

c++ user-interface mfc modal-dialog visual-studio-2010

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

由const:std :: map :: find()const过载走投无路

请考虑以下代码段:

#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 …

c++ stl const-correctness map

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

在 WebGL 中切换着色器程序

我有一个现有的 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)

javascript shader glsl webgl

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

glUseProgram后丢失/重置的状态是什么?

这与WebGL中的Switch shader程序有关,但我现在想重新提出这个问题,我对这个问题以及我想问的内容有了更清楚的认识.

我正在尝试在不同的着色器程序之间切换,但在同一渲染中切换着色器程序时,我似乎无法正确渲染.我认为在打电话后有状态丢失或重置glUseProgram().

通话结束后丢失或重置的状态是什么?换句话说,我需要再次绑定glUseProgram()什么?

graphics shader opengl-es glsl

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

在Chrome 18中检测SwiftShader WebGL渲染器

我有一个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_s3tcGL_ARB_texture_compression出现的广泛支持在桌面上的卡.此外,该表似乎只列出了相当旧的型号,因此我可能会猜测所有现代桌面图形卡都会支持WEBKIT_WEBGL_compressed_textures...因此我对SwiftShader的检测标准是:

  • Windows操作系统
  • 谷歌Chrome浏览器
  • WebGL的情况下也不会支持WEBKIT_WEBGL_compressed_textures
  • 结果:回退到Canvas 2D

当然,如果SwiftShader将来添加压缩纹理支持,这又会再次破坏.但我无法通过软件渲染器看到压缩纹理的优势!此外,如果有许多不支持的实际工作视频卡,它仍然会得到很多误报WEBKIT_WEBGL_compressed_textures!

有没有更好的方法来检测SwiftShader?

javascript performance google-chrome webgl

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

代理和目标对象之间的平等

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).这最终会产生与使用两者rawSomethingdefendedSomething跨代码库相同的效果.

然后问题出现在代理引用不等于其原始引用的事实上,因为rawSomething !== defendedSomething.例如,allObjects.includes(defendedSomething)如果包含,则返回false rawSomething,因为includes会进行严格===检查.

有没有一种很好的方法可以解决这个问题,而无需对代码进行太多更改?

javascript proxies ecmascript-6

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

线程本地存储可以伪造/黑客攻击吗?

我发现自己有点夸张.

我有一个大型应用程序,它有谷歌的V8 JavaScript引擎.在UI线程上对V8引擎进行了一些调用.为了对每个人推荐的用户友好,一些长操作在一个单独的线程上运行,而不会挂起UI线程.但是,这些长时间运行的操作也会调用V8 javascript引擎.所以多线程调用V8.

事实是,V8似乎使用线程本地存储.这似乎使我的应用程序随机爆炸.这绝对属于"这可能到现在为止如何运作?" 错误.

在没有重新设计我的应用程序的情况下,我提出了一个丑陋,丑陋可怕的超级黑客攻击:我可以让V8认为它在不同的线程上运行吗?

换句话说,我第一次打电话给V8时,我记下了这个主题.然后,对于V8的所有其他调用,我以某种方式欺骗线程,因此线程本地存储/其他任何线程依赖的工作.

可以吗?它会起作用吗?我甚至认为这样一个骗人的黑客是愚蠢的吗?

c++ winapi multithreading v8 visual-studio-2010

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

如何清除WebGL中的矩形区域?

WebGL有一种clear清除整个表面的方法.清除表面特定矩形的最佳方法是什么?例如,我想将从(50,50)开始的100x100像素盒设置为全零(ARGB 0,0,0,0).我现在能想到的就是用一个写入零的着色器着色器绘制四边形.有没有更简单的方法?

javascript html5 canvas webgl

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