opengl如何在MFC中设置双缓冲

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opengl如何在MFC中设置双缓冲相关的知识,希望对你有一定的参考价值。

如题,如何在MFC中设置OpenGL的双缓冲,实现动画。

有设置过的麻烦说细点哦。

谢谢了。
二楼的,如何进行重载?麻烦给我写一下代码。伪码也OK 啊,很急啊!

参考技术A 查一下OpenGL函数库, 有一个函数可以直接设置,我是不记得了! 参考技术B 重载的OnPaint函数,最后加一句SwapBuffers(dc.m_hDC)本回答被提问者采纳

如何在 C 中设置双精度数据类型变量的精度? [复制]

【中文标题】如何在 C 中设置双精度数据类型变量的精度? [复制]【英文标题】:How to set precision for double data type variables in C? [duplicate] 【发布时间】:2012-07-05 23:55:42 【问题描述】:

可能重复:Most effective way for float and double comparison

在我的程序中,一些双精度变量采用1.00000001 形式的值。使用1 对这些变量进行相等性检查显然失败了。

我想知道如何降低 c 中双精度类型变量的精度,以便整数相等。

【问题讨论】:

如果值为1.5,预期的行为会是什么? ***.com/questions/17333/… @J.N.对于1.5,相等应该返回false。让我们说,小数点后五位后的任何内容都应该被忽略。 为什么是小数点后五位?这样做有两个问题。首先,一个略低于 1.00001 的数字和一个略高于 1.00001 的数字将被报告为不等价,即使您可能需要其他方式(因为它们的不同仅是因为舍入误差,而不是因为使用数学精确度计算时的实际差异)。其次,你应该有一个基础来设置考虑数字相等的阈值。您应该知道在比较的值中会产生多少错误,以及您的决定可以容忍多少错误。 【参考方案1】:

您几乎不应该检查浮点值是否完全相等,特别是当它们来自计算时。您应该检查与比较值的差值的绝对值是否小于某个 epsilon。 double 的“精度”由内部数字表示形式给出,您无法更改它。 如何准确地选择 epsilon 可能很困难,对此答案有一些评论讨论,阅读它,但您最终会得到基于 epsilon 的实用平等。

【讨论】:

双变量是由线性程序返回的,因此我不能没有相等性检查。 @Lucas 链接的问题建议这样做时要非常小心。 @stressed_geek 您只需将 if 从 == 更改为 abs(a-x) 这个建议在很多方面都是错误的,abs(a-x) < epsilon 仅适用于接近零的数字(ax),否则是相对的 epsilon 或 ulps。有时您必须使用 == 比较双打 @unkulunkulu 我同意,但你最好说出原因;)【参考方案2】:

没有便携的方式,不。

使用 GNU C 库,您可以使用 this API 更改舍入模式。

但总的来说,最好用代码来表达,这样你的期望就变得清晰可移植:

#define EQUALITY_EPSILON 1e-3  /* Or whatever. */

if(fabs(x - y) <= EQUALITY_EPSILON)


【讨论】:

【参考方案3】:

您应该避免在浮点比较中检查相等性。相反,使用精度值epsilon,如下所示:

if (fabs(a - b) < epsilon)

    // treat a and b as equal

epsilon 的选择可能很复杂,但我的知识并没有那么远。

在 Google 上搜索“每个程序员都应该了解的浮点运算知识”。这是一篇涵盖所有这些内容的知名文章。

【讨论】:

这绝对不是正确的代码。 abs 是整数绝对值函数。浮点值 a-b 将被转换为整数(通过截断),其绝对值将与 epsilon 进行比较。任何小于 1 的 a-b 值都将报告为小于 epsilon,无论 epsilon 有多小(只要它是正数)。正确使用的函数是 fabs。 糟糕,我已经习惯了 C++ 的重载。已在编辑中修复。【参考方案4】:

“降低双精度型变量的精度”没有多大意义。您可能应该考虑而不是使用诸如 ceilfloorround 之类的函数以您可以很好地控制的方式从您的双精度数中生成一个整数,然后在比较中使用该整数。

【讨论】:

【参考方案5】:

在 C99 中

#include <stdio.h>
#include <math.h>

int main()
    double d = 1.00000001;
    int i = (int)round(d);

    printf("%d\n", i);

    return 0;

【讨论】:

以上是关于opengl如何在MFC中设置双缓冲的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL单缓冲与双缓冲的区别(追加10分)

MFC双缓冲绘图实例

opengl 单缓冲与双缓冲

使用 `setAttribute` 在 Raphael 中设置双边框

OpenGL中实现双缓冲技术

在 MFC CPaintDC 中进行双缓冲后闪烁不会减少