小编Pet*_*ete的帖子

OpenGL闪烁/损坏,窗口调整大小并且DWM处于活动状态

我有一个wxWidgets应用程序,它有许多子opengl窗口.我正在使用自己的GL画布类,而不是wx类.Windows共享他们的OpenGL上下文.我不认为它是wxwidgets的事实在这里真的很重要.

opengl窗口是窗口的子窗口,它们是彼此的兄弟,包含在选项卡控件中.MDI样式界面的种类,但它不是MDI窗口..每个窗口都可以单独调整大小.除非启用Aero且DWM处于活动状态,否则一切都很可爱.

调整任何窗口(甚至不是opengl窗口)的大小会导致所有opengl窗口偶尔闪烁,其中包含一个陈旧的后备存储视图,其中包含屏幕上那个非opengl的垃圾.这仅在启用Aero时发生.

我很确定这是DWM实际上没有在其绘图表面后备存储上的opengl内容,并且窗口没有在正确的时刻重新绘制.

我已经尝试了很多东西来解决这个问题,我确实有一个解决方案,但它不是很好,并且需要将带有glReadPixels的帧缓冲区读入DIB,然后在我的onPaint例程中将其渲染到绘制DC.这种解决方法仅在DWM处于活动状态时才启用,但我根本不必这样做,因为它会稍微损害性能(但在功能强大的系统上也不会太糟糕 - 场景是相对简单的3d图形).也不推荐混合使用GDI和opengl,但这种方法令人惊讶.我现在可以忍受它,但我宁愿不必.如果我想截取子窗口的截图,我仍然需要在WM_PRINT中执行此操作,我没有看到解决方法.

有谁知道更好的解决方案吗?

在有人要求之前我肯定会做以下事情:

  • Window类有CS_OWNDC
  • WM_ERASEBACKGROUND不执行任何操作并返回TRUE.
  • 启用双缓冲.
  • Windows具有WS_CLIPSIBLINGS和WS_CLIPCHILDREN窗口样式.
  • 在我的resize事件处理程序中,我立即重新绘制窗口.

我试过了:

  • 在像素格式描述符中设置PFD_SUPPORT_COMPOSITION.
  • 不在paint处理程序中使用wxPaintDC而是调用:: ValidateRect(hwnd,NULL).
  • 处理WM_NCPAINT并排除客户区
  • 通过DWM API禁用NC涂料
  • 在paint事件中排除客户区
  • 在缓冲区交换之前和之后调用glFlush和/或glFinish.
  • 在每个油漆事件中使窗口无效(作为测试!) - 仍然闪烁!
  • 不使用共享GL上下文.
  • 禁用双缓冲.
  • 写入GL_FRONT_AND_BACK

禁用DWM不是一种选择.

据我所知,如果你在OpenGL上使用Direct3D,这甚至是一个问题,虽然我没有测试过它,因为它代表了很多工作.

c++ windows opengl direct3d dwm

25
推荐指数
1
解决办法
2608
查看次数

路径笔划算法(转换为三角形/四边形)或其他建议

有没有人知道一个很好的算法,用于将矢量路径转换为由三角形/四边形面组成的描边路径?理想情况下使用圆形连接.

基本上我正在尝试绘制一条粗路径,其颜色基于随路径距离而变化的值.我想通过将路径上的距离作为1d纹理坐标进行转换,将路径转换为三角形/四边形并对其进行纹理映射,然后可以使用该坐标检索三角形角落处的颜色并进行插值.任何其他关于如何做这个看起来不会很糟糕并且可以消除锯齿的建议将不胜感激.

我目前正在使用AGG进行渲染,但我可以使用替代方案,前提是它没有太多依赖项.我想用于渲染的后端并不重要.虽然AGG可以描边路径,但VertexSource接口不允许除x/y坐标之外的其他顶点信息.另外,在使用普通的conv_stroke时,将我的颜色映射到光栅化器中看起来并不可行.

c++ geometry pathgeometry

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

CMBlockBufferCreate内存管理

我有一些代码创建CMBlockBuffers然后创建一个CMSampleBuffer并将其传递给AVAssetWriterInput.

这里有关于内存管理的优惠吗?根据Apple文档,您在名称中使用"创建"的任何内容都应与CFRelease一起发布.

但是,如果我使用CFRelease,那么我的应用程序将以对象0xblahblah的'malloc:*错误中止:未释放指针被释放.

CMBlockBufferRef tmp_bbuf = NULL;
CMBlockBufferRef bbuf = NULL;
CMSampleBufferRef sbuf = NULL;
status = CMBlockBufferCreateWithMemoryBlock(
                                            kCFAllocatorDefault, 
                                            samples, 
                                            buflen, 
                                            kCFAllocatorDefault, 
                                            NULL, 
                                            0, 
                                            buflen, 
                                            0, 
                                            &tmp_bbuf);

if (status != noErr || !tmp_bbuf) {
    NSLog(@"CMBlockBufferCreateWithMemoryBlock error");
    return -1;
}
// Copy the buffer so that we get a copy of the samples in memory.
// CMBlockBufferCreateWithMemoryBlock does not actually copy the data!
// 
status = CMBlockBufferCreateContiguous(kCFAllocatorDefault, tmp_bbuf, kCFAllocatorDefault, NULL, 0, buflen, kCMBlockBufferAlwaysCopyDataFlag, &bbuf);
//CFRelease(tmp_bbuf); // causes …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c avfoundation core-media

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

存储来自10000s节点的遥测数据

我需要存储每隔几分钟从10000多个节点(可能会增加)中生成的遥测数据,每个节点都通过Internet将数据提供给服务器进行记录。我还需要从Web应用程序查询此数据。

我在确定最佳存储解决方案时遇到了麻烦。

每个节点都有一个唯一的ID,并且每个变量包都有一个时间戳。(可能需要由服务器生成)。

遥测数据在同一数据包中具有所有变量,因此从概念上讲,它可以轻松地存储在单个数据库表中,每个变量都有一列。序列号+时间戳作为密钥就足够了。每个遥测包的大小为64个字节,包括设备ID和时间戳。大约每年100Gb +。

我希望能够查询数据以获取跨时间范围的变量,并且还存储该数据的汇总报告,以便可以绘制图形。

现在,如何最好地处理呢?我对使用MySQL非常熟悉,因此我倾向于这样做。如果我要使用MySQL,是否对每个设备ID都有一个单独的表有意义?-这会使查询更快吗?还是会有10000个表成为问题?

我认为不需要一口气从所有设备查询变量,但是可能需要。还是我应该将其全部粘贴在一个表中,如果它变得很大,请使用MySQL集群吗?

还是有更好的解决方案?我一直在寻找一些非关系数据库,但看不到任何完全符合要求或看起来很成熟的东西。例如,MongoDB每行将有很多大小开销,与MySQL相比,我不知道在很大的时间范围内查询单个变量的值会多么有效。MySQL已经存在了一段时间并且功能强大。

我也希望复制数据和备份数据变得容易。

任何想法或任何人做了类似的事情都将不胜感激!

mysql database web-services telemetry

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

将视频+生成的音频写入AVAssetWriterInput,音频卡顿

我正在从 iOS 上的 Unity 应用程序生成视频。我正在使用 iVidCap,它使用 AVFoundation 来执行此操作。那一侧一切正常。本质上,视频是通过使用纹理渲染目标并将帧传递给 Obj-C 插件来渲染的。

现在我需要向视频添加音频。音频将是在特定时间发生的声音效果,也可能是一些背景声音。所使用的文件实际上是 Unity 应用程序内部的资产。我可以将它们写入手机存储,然后生成 AVComposition,但我的计划是避免这种情况并将音频合成在浮点格式缓冲区中(从音频剪辑获取音频采用浮点格式)。稍后我可能会做一些动态音频效果。

几个小时后,我设法录制音频并与视频一起播放......但它很卡顿。

目前,我只是在视频的每帧持续时间内生成一个方波并将其写入 AVAssetWriterInput。稍后,我将生成我真正想要的音频。

如果我生成大量样本,我就不会出现卡顿的情况。如果我把它写成块(我更喜欢分配一个巨大的数组),那么音频块似乎会互相剪辑:

毛刺

我似乎无法弄清楚这是为什么。我很确定我得到的音频缓冲区的时间戳是正确的,但也许我整个部分都做错了。或者我是否需要一些标志来使视频与音频同步?我看不出这是问题所在,因为将音频数据提取到 wav 后,我可以在波形编辑器中看到问题。

编写音频的相关代码:

- (id)init {
    self = [super init];
    
    if (self) {
        // [snip]
        
        rateDenominator = 44100;
        rateMultiplier = rateDenominator / frameRate;
        
        sample_position_ = 0;
        audio_fmt_desc_ = nil;
        int nchannels = 2;
        AudioStreamBasicDescription audioFormat;
        bzero(&audioFormat, sizeof(audioFormat));
        audioFormat.mSampleRate = 44100;
        audioFormat.mFormatID   = kAudioFormatLinearPCM;
        audioFormat.mFramesPerPacket = 1;
        audioFormat.mChannelsPerFrame = nchannels;
        int bytes_per_sample = sizeof(float);
        audioFormat.mFormatFlags = kAudioFormatFlagIsFloat | kAudioFormatFlagIsAlignedHigh;
        audioFormat.mBitsPerChannel = bytes_per_sample …
Run Code Online (Sandbox Code Playgroud)

iphone objective-c avfoundation ios avassetwriter

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