小编Ash*_*ain的帖子

什么是内存碎片?

我听说在C++动态内存分配的上下文中使用了几次"内存碎片"这个术语.我发现了一些关于如何处理内存碎片的问题,但找不到直接处理它本身的问题.所以:

  • 什么是内存碎片?
  • 如何判断内存碎片是否对我的应用程序有问题?什么样的计划最容易受到影响?
  • 处理内存碎片的常用方法有哪些?

也:

  • 我听说使用动态分配可以增加内存碎片.这是真的?在C++的上下文中,我理解所有标准容器(std :: string,std :: vector等)都使用动态内存分配.如果在整个程序中使用它们(特别是std :: string),内存碎片更可能是一个问题吗?
  • 如何在STL繁重的应用程序中处理内存碎片?

c++ memory heap fragmentation

190
推荐指数
7
解决办法
7万
查看次数

Cordova iOS 9上的WKWebView状态?

iOS 8引入了WKWebView,这是iOS的现代化Web视图,具有更多功能,特别是Javascript代码的JIT编译,可显着提高性能.

但是iOS 8上的WKWebView存在一些错误,这些错误阻止了Cordova默认使用它.AFAIK有插件可以使用它,但他们都说"beta","不完整"等.另外据我所知,iOS 9修复了阻止Cordova在iOS 8中默认为WKWebView的错误.

那么在iOS 9上的Cordova中WKWebView的状态是什么?我似乎无法找到任何有关此信息.Cordova默认在iOS 9上使用WKWebView吗?如果不是为什么不能,并且可以通过另一种方式正式启用?

html5 ios cordova hybrid-mobile-app wkwebview

45
推荐指数
1
解决办法
1万
查看次数

在javascript中的对象集

我想在Javascript中有一组对象.也就是说,只包含唯一对象的数据结构.

通常建议使用属性,例如myset["key"] = true.但是,我需要将键作为对象.我已经读过Javascript将属性名称转换为字符串,所以我想我不能使用myset[myobject] = true.

我可以使用数组,但我需要比O(n)性能更好的东西来添加,查找和删除项目.

它需要能够通过引用分开对象,因此给出:

var a = {};
var b = {};
Run Code Online (Sandbox Code Playgroud)

那么这两个ab应该能够被添加,因为它们是独立的对象.

基本上,我正在使用类似C++的东西std::set,它可以存储Javascript对象.有任何想法吗?

javascript object set data-structures

39
推荐指数
5
解决办法
4万
查看次数

iOS 6 Web Audio API上没有声音

我很高兴看到iOS 6支持Web Audio API,因为我们制作HTML5游戏.但是,我无法让iOS 6使用Web Audio API播放任何声音,其中的示例在桌面Chrome中运行良好.

这是一款带有触摸控件和通过Web Audio API播放音频的HTML5游戏(如果存在 - 如果不存在,它将回退到HTML5音频):

http://www.scirra.com/labs/sbios6b/

编辑:@Srikumar提出了一些解决方法.我在下面的版本中应用它们.它仍然无法正常工作!

http://www.scirra.com/labs/sbios6f/

桌面Chrome上的一切都很好,但iOS 6根本没有声音.我无法调试它,因为我只进行Windows开发,iOS 6用远程Web检查器取代了调试模式,这显然在Safari for Windows上不可用.使用一些警报,我确实发现它正确识别Web Audio API,使用它,检测不到Vorbis支持,因此回退到AAC音频,解码缓冲区然后播放它,并且没有错误,但我什么都没听到.当然,我尝试将音量调高到最大值:)

应该没有编解码器问题,因为iOS 6可以很好地播放AAC - 您可以浏览.m4a中的一个游戏,并且直接从Safari访问它.

在iOS 6上查看Web Audio API示例:http://chromium.googlecode.com/svn/trunk/samples/audio/samples.html - 其中一些有效,有些则无效.例如,Chrome Audio Visualizer可以正常工作,但Javascript Drone却没有.

iOS 6和桌面Chrome上的Web Audio之间必然存在一些微妙的不兼容性.我错过了什么?

javascript html5 mobile-safari ios6 web-audio-api

39
推荐指数
3
解决办法
2万
查看次数

堆栈为什么不向上增长(为安全起见)?

这与"为什么堆栈通常会向下生长?"这个问题有关.,但从安全的角度来看更多.我通常指的是x86.

当缓冲区通常在内存中向上写入时,堆栈会向下增长,这让我觉得很奇怪.例如,典型的C++字符串的结尾位于比开头更高的内存地址.

这意味着如果存在缓冲区溢出,则会进一步覆盖调用堆栈,我理解这是一种安全风险,因为它可以更改返回地址和本地变量内容.

如果堆栈在内存中向上增长,那么缓冲区溢出会不会简单地运行到内存中?这会提高安全性吗?如果是这样,为什么还没有这样做?那么x64,那些堆栈是否会增长,如果不是,为什么不呢?

architecture security cpu x86 stack

28
推荐指数
1
解决办法
8232
查看次数

21
推荐指数
2
解决办法
8002
查看次数

PhoneGap插件:将JSON数据传输到本机的最快方法

我一直在开发一个PhoneGap插件来启用WebGL,用于将HTML5游戏发布到移动设备.它叫做WebGLGap.但是,PhoneGap调用插件代码的方式(通过exec)通常涉及将所有参数字符串化为JSON,然后再次在另一端解析它.根据这个问题,即使在PhoneGap 2.2中也没有改变,PhoneGap 2.2被宣传为拥有更快的桥梁.对于像WebGL这样的东西,这绝对是站不住脚的,即使对于简单的演示也会导致性能下降(<10 FPS).这是因为在许多情况下,特别是2D游戏,每个帧必须传输一大块JSON数据,表示要运行的所有WebGL命令.这包括所有顶点数据 - 想象每一帧的巨大字符串"0.959455,0.959595,0.588575,0.585858 ......"等.

显然,字符串化和解析是一个不必要且低效的步骤,但我很难找到一种方法将JSON数据从JS传递给本机,这避免了这一点.理想情况下,这应该适用于Android和iOS,但我很高兴现在坚持使用仅限Android的解决方案.有没有人对最有效的方法有任何想法?

javascript android phonegap-plugins cordova

21
推荐指数
2
解决办法
4915
查看次数

HTML5中的Kinect

Kinect for Windows 刚刚于2月1日发布.

有没有什么好方法可以让它与HTML5游戏一起使用?甚至可能以某种方式使用即将推出的GamePad API ......?在这里寻找想法,特别是对于浏览网页的用户而言,只需要最少的额外安装费用.

javascript browser html5 kinect gamepad-api

20
推荐指数
3
解决办法
9383
查看次数

线程同步101

以前我写过一些非常简单的多线程代码,而且我一直都知道在任何时候都可以在我正在做的事情中间进行上下文切换,所以我总是通过以下方式保护访问共享变量一个CCriticalSection类,它进入构造的关键部分并使其破坏.我知道这是相当激进的,我进入和离开关键部分非常频繁,有时非常惊人(例如,当我可以将CCriticalSection置于更严格的代码块中时,在函数的开头)但我的代码没有崩溃并且运行得足够快.

在工作中,我的多线程代码需要更紧密,只需要在最低级别锁定/同步.

在工作中我试图调试一些多线程代码,我遇到了这个:

EnterCriticalSection(&m_Crit4);
m_bSomeVariable = true;
LeaveCriticalSection(&m_Crit4);
Run Code Online (Sandbox Code Playgroud)

现在,m_bSomeVariable是Win32 BOOL(非易失性),据我所知,它被定义为一个int,并且在x86上读取和写入这些值是一条指令,并且因为上下文切换发生在指令边界上,所以没有必要用于将此操作与关键部分同步.

我在网上做了一些更多的研究,看看这个操作是否不需要同步,我想出了两个场景:

  1. CPU实现无序执行或第二个线程在不同的内核上运行,更新后的值不会写入RAM以供其他内核查看; 和
  2. int不是4字节对齐的.

我相信使用"volatile"关键字可以解决数字1.在VS2005及更高版本中,C++编译器使用内存屏障围绕对此变量的访问,确保在使用变量之前始终将变量完全写入/读取到主系统内存.

2号我无法验证,我不知道为什么字节对齐会产生影响.我不知道x86指令集,但是mov需要给出一个4字节对齐的地址吗?如果不是,您需要使用指令组合吗?这会引入问题.

所以...

问题1:使用"volatile"关键字(隐含使用内存屏障并暗示编译器不优化此代码)可以避免程序员在读取/读取x86/x64变量之间同步4字节/ 8字节的需要写操作?

问题2:是否明确要求变量为4字节/ 8字节对齐?

我做了一些深入研究我们的代码和类中定义的变量:

class CExample
{

private:

    CRITICAL_SECTION m_Crit1; // Protects variable a
    CRITICAL_SECTION m_Crit2; // Protects variable b
    CRITICAL_SECTION m_Crit3; // Protects variable c
    CRITICAL_SECTION m_Crit4; // Protects variable d

    // ...

};
Run Code Online (Sandbox Code Playgroud)

现在,对我来说这似乎过分了.我认为关键部分在一个进程之间同步线程,所以如果你有一个,你可以输入它,并且该进程中没有其他线程可以执行.对于要保护的每个变量,不需要关键部分,如果您处于关键部分,那么没有其他任何内容可以打断您.

我认为唯一可以从关键部分外部更改变量的是,如果进程与另一个进程共享一个内存页面(你可以这样做吗?),另一个进程开始更改值.互斥体在这里也有帮助,命名互斥体是跨进程共享的,还是只有同名的进程共享?

问题3:我对关键部分的分析是否正确,是否应该重写此代码以使用互斥锁?我看过其他同步对象(信号量和自旋锁),它们更适合这里吗?

问题4:关键部分/互斥体/信号量/自旋锁哪里最适合?也就是说,它们应该应用于哪个同步问题.选择一个而不是另一个会有很大的性能损失吗?

虽然我们正在研究它,但我读到自旋锁不应该用在单核多线程环境中,只能用于多核多线程环境.所以,问题5:这是错的,或者如果不是,为什么是对的?

在此先感谢任何回复:)

c++ multithreading mutex volatile memory-barriers

18
推荐指数
4
解决办法
2289
查看次数

std :: inserter with set - insert to begin()或end()?

我有一些看起来像这样的代码:

std::set<int> s1, s2, out;

// ... s1 and s2 are populated ...

std::set_intersection(s1.begin(), s1.end(),
                      s2.begin(), s2.end(),
                      std::inserter(out, out.end()));
Run Code Online (Sandbox Code Playgroud)

如果插入到集合中的值紧跟在作为"提示"给出的迭代器之后,我已经读过插入可以在分摊的常量时间内完成.这在运行集合交集时显然是有益的,特别是因为写入的所有内容out已经按排序顺序排列.

我如何保证这种最佳性能?在创建时std::inserter,out是空的,out.begin() == out.end()所以我看不出它是否有任何区别,无论我指定out.begin()还是out.end()作为提示.但是,如果在插入每个元素时解释这一点begin(),那么我似乎不会获得最佳的算法性能.这可以做得更好吗?

c++ iterator stl insert set

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