小编Chr*_*s_F的帖子

使用vsync(OpenGL)时100%的CPU利用率

这是一个非常简单的测试程序.禁用vsync时,该程序以100FPS运行,几乎占用CPU的0%.当我启用vsync时,我得到60FPS和25%(4核系统上一个核心的100%)CPU利用率.这是使用Nvidia GPU.在线搜索引导我建议禁用Nvidia控制面板内的"多线程优化".这确实会降低CPU利用率,但只会降低10%.此外,如果我在SwapBuffers之后删除了睡眠调用,即使禁用了多线程优化,我也会再次获得25%的利用率.任何人都可以对此有所了解吗?难道我做错了什么?Nvidia的OpenGL实现是否无可救药地存在缺陷?

#include <GLFW/glfw3.h>
#include <thread>
#include <cstdlib>
#include <cstdio>

int main(int argc, char *argv[])
{
    if(!glfwInit())
        exit(EXIT_FAILURE);

    glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);

    GLFWwindow* window = glfwCreateWindow(800, 600, "OpenGL Vsync Test", nullptr, nullptr);

    if(!window)
    {
        glfwTerminate();
        exit(EXIT_FAILURE);
    }

    glfwMakeContextCurrent(window);

#ifdef USE_VSYNC
    glfwSwapInterval(1);
#else
    glfwSwapInterval(0);
#endif

    glClearColor(1.0f, 0.0f, 0.0f, 1.0f);

    double lastTime = glfwGetTime();
    double nbFrames = 0;

    while(!glfwWindowShouldClose(window))
    {
        double currentTime = glfwGetTime();
        nbFrames++;
        if (currentTime - lastTime >= 1.0)
        {
            char cbuffer[50];
            snprintf(cbuffer, sizeof(cbuffer), "OpenGL Vsync Test [%.1f fps, %.3f ms]", nbFrames, …
Run Code Online (Sandbox Code Playgroud)

c++ opengl driver nvidia vsync

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

Clang真的很聪明吗?

如果我使用Clang 3.3编译以下代码,-O3 -fno-vectorize即使删除了注释行,也会得到相同的汇编输出.代码类型将所有可能的32位整数置于浮点数并计算[0,1]范围内的值.Clang的优化器实际上是否足够聪明,以致当被处理为浮点数时0xFFFFFFFF不在[0,1]的范围内,所以忽略fn完全的第二次调用?删除第二个调用时,GCC会生成不同的代码.

#include <limits>
#include <cstring>
#include <cstdint>

template <class TO, class FROM>
inline TO punning_cast(const FROM &input)
{
    TO out;
    std::memcpy(&out, &input, sizeof(TO));
    return out;
}

int main()
{
    uint32_t count = 0;

    auto fn = [&count] (uint32_t x) {
        float f = punning_cast<float>(x);
        if (f >= 0.0f && f <= 1.0f)
            count++;
    };

    for(uint32_t i = 0; i < std::numeric_limits<uint32_t>::max(); ++i)
    {
        fn(i);
    }
    fn(std::numeric_limits<uint32_t>::max()); //removing this changes nothing

    return count;
}
Run Code Online (Sandbox Code Playgroud)

见这里: …

c++ llvm clang compiler-optimization c++11

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

为什么std :: endl会生成这个神秘的错误消息?

如果我尝试编译以下代码,我得到以下编译器错误(请参阅代码.)如果std::endl删除它编译没有错误.

#include <iostream>
#include <sstream>
#include <utility>

namespace detail
{
    template <class T>
    void print(std::ostream& stream, const T& item)
    {
        stream << item;
    }

    template <class Head, class... Tail>
    void print(std::ostream& stream, const Head& head, Tail&&... tail)
    {
        detail::print(stream, head);
        detail::print(stream, std::forward<Tail>(tail)...);
    }
}

template <class... Args>
void print(std::ostream& stream, Args&&... args)
//note: candidate function not viable: requires 3 arguments, but 4 were provided
{
    std::stringstream ss;
    detail::print(ss, std::forward<Args>(args)...);
    stream << ss.rdbuf();
}

int main()
{
    print(std::cout, "The …
Run Code Online (Sandbox Code Playgroud)

c++ iostream compiler-errors variadic-templates c++11

8
推荐指数
2
解决办法
1080
查看次数

Go编译器是否有窗口设置选项?

我正在使用Go(6g)编译GTK应用程序,我想知道是否有编译器/链接器选项使其成为Windows可执行文件而不是控制台可执行文件.MinGW有一个-mwindows选项,目前我不得不用十六进制编辑器手动改变PE头,这很烦人.

windows gtk console go

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

我可以在cgo中使用c ++吗?

是否可以在cgo中混合一些C++代码?

我试过这个:

package main
/* 
    #include <iostream>

    extern "C" void test(const char* str)
    {
        std::cout << str;
    }
*/
// #cgo CFLAGS: -x c++
// #cgo LDFLAGS: -lstdc++
import "C"

func main() {
    C.test(C.CString("Testing!!!"))
}
Run Code Online (Sandbox Code Playgroud)

但我得到这些错误:

error: 'char* CString(_GoString_)' cannot appear in a constant-exp
error: 'void test(const char*)' cannot appear in a constant-expres
error: invalid conversion from 'char* (*)(_GoString_)' to 'long long int' [-fpermissive]
error: invalid conversion from 'void (*)(const char*)' to 'long long int' [-fpermissive]
Run Code Online (Sandbox Code Playgroud)

我正在使用go1.0.2和MinGW-w64 4.7.1

c++ go cgo

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

如何在:: before伪元素之后得到缩进?

我有一个表,我想使用带有计数器的CSS :: before伪元素将行号添加到td每行的第一行.我的问题是,如果第一个td包装第二行从数字开始,我希望它开始与它上面的文本内联.这可以用CSS完成吗?

例:

我想要完成的图像示例.

编辑

https://jsfiddle.net/3yL19zde/

HTML:

<table>
  <tr>
    <td>Some really long text that wraps to a second line...</td>
    <td>Some other column</td>
    <td>A third column</td>
  </tr>
  <tr>
    <td>Some really long text that wraps to a second line...</td>
    <td>Some other column</td>
    <td>A third column</td>
  </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

CSS:

table {
    width: 480px;
}

table td {
  vertical-align: text-top;
}

table tr {
    counter-increment: rowNumber;
}

table tr td:first-child::before {
    content: counter(rowNumber);
    min-width: 1em;
    margin-right: 0.5em;
    font-weight: bold;
}
Run Code Online (Sandbox Code Playgroud)

html css css3

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

如何使用模板参数编写外部构造函数?

可以说我有以下结构.我该如何为此编写外联构造函数?

template <typename T>
struct foo
{
    template <typename Bar>
    foo(int n, Bar bar);
};
Run Code Online (Sandbox Code Playgroud)

c++ templates constructor c++11

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

constexpr中使用strcmp的编译器差异

以下在GCC中编译,但在Clang中不编译:

#include <cstring>

constexpr int test = strcmp("test", "test");
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,GCC如何以不同的方式处理strcmp才能做到这一点?是strcmp是某种内置类型,还是标准库具有包含constexpr的非标准strcmp定义?

c++ gcc clang constexpr c++11

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

DOMParser与模板和innerHTML相比的优势

我正在寻找处理HTML或XHTML(XML序列化)标记并将其插入网页DOM(可能是text / html或application / xhtml + xml)的最佳方法。不想使用jQuery之类的库,而是只在乎与最新版本的Chrome的兼容性。

我看到两种可能的解决方案。

  • 模板和innerHTML:

    let temp = document.createElement('template');
    temp.innerHTML = markuptext;
    document.body.appendChild(temp.content);
    
    Run Code Online (Sandbox Code Playgroud)
  • DOMParser:

    let parser = new DOMParser();
    let doc = parser.parseFromString('<div xmlns="http://www.w3.org/1999/xhtml">' + markuptext + '</div>', 'application/xhtml+xml');
    let frag = document.createDocumentFragment(), childNode;
    while (childNode = doc.documentElement.firstChild) {
        frag.appendChild(childNode);
    }
    document.body.appendChild(frag);
    
    Run Code Online (Sandbox Code Playgroud)

我希望有人能指出这两种方法的优点/缺点。

假设使用Template&innerHTML,Chrome会根据页面的内容类型选择解析为HTML / XML,并且可能无法更改它。看起来Template&innerHTML允许像a <tr><td></td></tr>之外的片段,<tbody>而不管它是解析为HTML还是XML。的DOMParser允许这个太多,但只有当它被解析为XML。

html javascript xml dom google-chrome

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

如何在 WebGL2 中实现伽玛校正工作流程?

我在将 sRGB 纹理与 WebGL2 结合使用时遇到问题。我正在尝试加载纹理并将其显示为全屏四边形,但图像显示不正确(太暗。)

纹理加载代码如下。

const texture0 = await (() => {
    const image = new Image()
    const promise = new Promise(resolve => image.onload = () => {
        const texture = gl.createTexture()
        gl.bindTexture(gl.TEXTURE_2D, texture)
        gl.texStorage2D(gl.TEXTURE_2D, 1, gl.SRGB8_ALPHA8, 256, 256)
        gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, 256, 256, gl.RGBA, gl.UNSIGNED_BYTE, image) 
        resolve(texture)
    })
    image.src = "./images/texture.png"
    return promise
})()
Run Code Online (Sandbox Code Playgroud)

我想这可能与帧缓冲区的编码有关,但我没有看到与glEnable(GL_FRAMEBUFFER_SRGB)WebGL 中的等效项。

webgl2

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