小编Kai*_*aan的帖子

Lambda捕获shared_ptr成员

我有一个类OpenGLRenderer具有类成员mMemoryAllocator这是一个std::shared_ptr<MemoryAllocator>.我将内存分配器保留在shared_ptr中的原因是因为即使shared_ptr<Texture>返回的下面的内容超过了它的创建者OpenGLRenderer,MemoryAllocator如果我按值捕获它,实例仍然有效,因为它会增加引用计数:

std::shared_ptr<Texture> OpenGLRenderer::CreateTexture(TextureType textureType, const std::vector<uint8_t>& textureData, uint32_t textureWidth, uint32_t textureHeight, TextureFormat textureFormat)
{
    return std::shared_ptr<Texture>(mMemoryAllocator->AllocateObject<Texture>(
                                    textureData, textureWidth, textureHeight,
                                    textureFormat, textureType, mLogger), 
                                    [=](Texture* texture) { 
                                        mMemoryAllocator
                                         ->DeallocateObject<Texture>(texture); 
                                    });
}
Run Code Online (Sandbox Code Playgroud)

......但是,它不起作用.如果OpenGLRenderer超出范围之前std::shared_ptr<Texture>,std::shared_ptr<MemoryAllocator>则会变得损坏,因此lambda表达式变得疯狂.我做错了什么?

c++ lambda memory-management smart-pointers c++11

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

无法在VS2013中运行GPU性能和诊断

我正在使用带有补丁4的Visual Studio 2013.

当我尝试运行GPU性能分析的"性能和诊断"测试时,启动器会立即失败并显示以下输出:

Profiling of 'Graphics Frame Capture' started.
Graphics Frame Capture has exited.
Profiling of 'Graphics Frame Capture' stopped.
Diagnostics session failed to start.

Failed to enable system trace session.
Run Code Online (Sandbox Code Playgroud)

请注意,我可以在同一项目中运行内置图形调试器而不会出现问题.

是什么给了什么?`

如果重要的话,我正在运行Windows 7专业版.

c++ gpu visual-studio visual-studio-2013

8
推荐指数
0
解决办法
909
查看次数

循环不消耗太多CPU周期而没有睡眠()?

我正在做一个VoIP程序,它不断检查录音缓冲区中是否有任何内容(FMOD库,只要函数getRecordPosition> 0,然后缓冲区中就有数据).

所以这将是:

while (true) {
    if(getRecordPosition>0) {
     process data....
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这会导致非常高的CPU使用率.一个版本是使用sleep()但是如果可能的话我宁愿不使用它.例如,win32消息处理及其事件驱动的循环不会消耗很多cpu周期,这是我试图模仿的东西.同时我理解函数getRecordPosition()必须经常调用以查看返回值是否高于0.

我是否坚持做一段时间(真实)循环和睡眠()一段时间以保持低CPU使用率?

我用Google搜索并完成了一些查找,但大多数使用sleep()或某些POSIX与mutex同步返回.(我正在做一个c ++ win32应用程序)

干杯

---编辑:忘记提及我没有访问fmod source corde:/ ---

c++ winapi multithreading synchronization cpu-usage

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

UDP打孔

关于使用UDP打孔,我有一些问题.基于维基http://en.wikipedia.org/wiki/UDP_hole_punching

1)要在双方(NAT后面的客户端,非NAT服务器)之间建立UDP会话,客户端只需向服务器发送数据包,然后允许会话两种方式(发送和接收) )通过防火墙?这意味着客户端也可以从服务器接收.

2)UDP Hole punching:两个客户端首先连接到服务器,然后服务器将客户端端口/ IP连接到其他客户端,因此客户端在这些端口上相互发送数据包.这是否正确?

3)如果#2为真,为什么防火墙允许从另一个IP接收数据而不是在该端口上进行连接时使用的数据?听起来像一个很容易被过滤的大安全漏洞?我知道源IP欺骗会欺骗它,但是这个?

先谢谢你,约翰

c++ networking winapi firewall udp

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

从sockaddr_storage中检索ip和端口

我有一个sockaddr_storage包含远程主机的ipv4地址和端口.我之前没有见过这些struct,我不知道如何把它转换成struct我可以直接检索IP地址和端口号的地方.我试过谷歌搜索struct但没有找到任何东西.有关如何做到这一点的任何建议?

谢谢

c sockets winsock

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

Android - 本机套接字在首次尝试时不会删除3G睡眠模式

我有一个非常讨厌的问题.发生的事情是我有一个使用本机套接字通过TCP发送数据的应用程序.当我第一次启动我的应用程序并通过套接字发送数据时,没有任何东西通过.但是,如果我然后退出该过程并重新启动然后再次发送,则可以正常工作.如果我在睡眠模式后第一次启动我的应用程序之前打开浏览器或其他东西也一样.

在调用本机代码之前,如何强制"3G"退出睡眠模式?

编辑:我已经尝试过使用PowerManager.

sockets android native android-ndk 3g

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

iOS - 另一个线程需要将reloadData发送到mainthread

我有一个单独的线程创建一个UIView对象,将其插入UITableView的数据源,然后在UITableView上调用reloadData.但是,由于它是一个单独的线程,它不能直接调用reloadData,它需要让mainthread执行它...但是你怎么告诉mainthread这样做呢?

谢谢

multithreading uitableview uiview reloaddata ios

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

C++ - 重载operator new并提供其他参数

我知道你可以超载操作员new.执行此操作时,size_t默认情况下会为方法发送一个参数.但是,是否可以将size_t参数 - 以及其他用户提供的参数 - 发送到重载的new运算符方法?

例如

int a = 5;
Monkey* monk = new Monkey(a);
Run Code Online (Sandbox Code Playgroud)

因为我想覆盖这样的新运算符

void* Monkey::operator new(size_t size, int a)
{

...

}
Run Code Online (Sandbox Code Playgroud)

谢谢

编辑:这是我想要完成的事情:

我在应用程序的开头(内存池)分配了一大块虚拟内存.继承我的基类的所有对象都将继承其重载的new运算符.我想有时在重载new中传递一个参数的原因是告诉我的内存管理器我是否要使用内存池,或者我是否想用malloc分配它.

c++ memory-management operator-overloading placement-new

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

emplace_back和VC++的挫败感

我正在使用Visual Studio 2012,尝试使用默认编译器和Nov CTP编译器,下面显示了我的问题:

struct doesCompile
{
    int mA, mB, mC, mD, mE;

    doesCompile(int a, int b, int c, int d, int e) : mA(a), mB(b), mC(c), mD(d), mE(e)
    { 
    }
};

struct doesNotCompile
{
    int mA, mB, mC, mD, mE, mF;

    doesNotCompile(int a, int b, int c, int d, int e, int f) : mA(a), mB(b), mC(c), mD(d), mE(e), mF(f)
    { 
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<doesCompile> goodVec;
    goodVec.emplace_back(1, 2, 3, 4, 5);

    std::vector<doesNotCompile> badVec;
    badVec.emplace_back(1, …
Run Code Online (Sandbox Code Playgroud)

c++ stl vector visual-c++ c++11

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

OpenGL glGeneratemipmap和Framebuffers

我正在快速生成mipmap,并使用以下代码阅读此内容:http://www.g-truc.net/post-0256.html

//Create the mipmapped texture
glGenTextures(1, &ColorbufferName);
glBindTexture(ColorbufferName);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 512, 512, 0, GL_UNSIGNED_BYTE, NULL);
glGenerateMipmap(GL_TEXTURE_2D); // /!\ Allocate the mipmaps /!\
...
//Create the framebuffer object and attach the mipmapped texture
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ColorbufferName, 0);
...
//Commands to actually draw something
render();
...
//Generate the mipmaps of ColorbufferName
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, ColorbufferName);
glGenerateMipmap(GL_TEXTURE_2D);
Run Code Online (Sandbox Code Playgroud)

我的问题:

  1. 为什么glGenerateMipmap在渲染到纹理的情况下需要调用两次?
  2. 是否必须每帧都这样调用?

如果我例如导入漫反射2d纹理,我只需要在将其加载到OpenGL之后调用一次,如下所示:

    GLCALL(glGenTextures(1, &mTexture));
    GLCALL(glBindTexture(GL_TEXTURE_2D, mTexture));

    GLint format = (colorFormat == ColorFormat::COLOR_FORMAT_RGB ? GL_RGB : …
Run Code Online (Sandbox Code Playgroud)

c++ opengl mipmaps

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