小编Dre*_*all的帖子

VBO何时比"简单"OpenGL原语(glBegin())更快?

经过多年关于顶点缓冲对象(VBO)的讨论,我终于决定尝试它们(我的东西通常不是性能关键,显然......)

我将在下面描述我的实验,但总而言之,我看到"简单"直接模式(glBegin()/ glEnd()),顶点数组(CPU端)和VBO(GPU端)之间无法区分性能渲染模式.我试图理解为什么会这样,并且在什么条件下我可以期待看到VBO明显优于他们原始(双关语)的祖先.

实验细节

对于实验,我生成了一个具有大量点的(静态)3D高斯云.每个点都有与之关联的顶点和颜色信息.然后我在连续的帧中围绕云旋转相机,这是一种"轨道"行为.同样,这些点是静态的,只有眼睛移动(通过gluLookAt()).数据在任何渲染之前生成一次并存储在两个数组中以用于渲染循环.

对于直接渲染,整个数据集在单个glBegin()/ glEnd()块中呈现,其中包含一个循环,每个循环包含glColor3fv()和glVertex3fv().

对于顶点数组和VBO渲染,整个数据集使用单个glDrawArrays()调用进行渲染.

然后,我只需在紧凑的循环中运行一分钟左右,并使用高性能计时器测量平均FPS.

表现结果##

如上所述,我的台式机(XP x64,8GB RAM,512 MB Quadro 1700)和笔记本电脑(XP32,4GB RAM,256 MB Quadro NVS 110)的性能难以区分.然而,它确实按照预期的点数进行了扩展.显然,我也禁用了vsync.

笔记本电脑运行的具体结果(使用GL_POINTS渲染):

在glBegin()/ glEnd():

  • 1K分 - > 603 FPS
  • 10K分 - > 401 FPS
  • 100K分 - > 97 FPS
  • 1M点 - > 14 FPS

顶点阵列(CPU端):

  • 1K分 - > 603 FPS
  • 10K分 - > 402 FPS
  • 100K分 - > 97 FPS
  • 1M点 - > 14 FPS

顶点缓冲对象(GPU端):

  • 1K分 - > 604 FPS
  • 10K分 - > 399 FPS
  • 100K分 - > 95 …

opengl graphics performance vbo vertex-buffer

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

在空表中查找SQLite列名称

对于踢,我正在编写一个"模式文档"工具,用于生成数据库中表和关系的描述.我目前正在填补它与SQLite合作.

我已经设法通过sqlite_master表上的查询提取SQLite数据库中所有表的名称.对于每个表名,我然后触发一个简单的名称

select * from <table name>
Run Code Online (Sandbox Code Playgroud)

查询,然后使用sqlite3_column_count()sqlite3_column_name()API收集列名称,我进一步提供sqlite3_table_column_metadata()以获取其他信息.很简单吧?

问题是它只适用于非空的表.也就是说,sqlite_column_*()API仅sqlite_step()在返回时才有效SQLITE_ROW,而空表不是这种情况.

所以问题是,我如何发现空表的列名?或者,更一般地说,是否有更好的方法在SQLite中获取此类模式信息?

我觉得必须有另一个隐藏的sqlite_xxx表隐藏在包含这些信息的地方,但到目前为止还没有找到它.

database sqlite schema

36
推荐指数
3
解决办法
4万
查看次数

如何从WSAGetLastError()中检索错误字符串?

我正在将一些套接字代码从Linux移植到Windows.

在Linux中,我可以使用strerror()将errno代码转换为人类可读的字符串.

MSDN文档显示返回的每个错误代码的等效字符串WSAGetLastError(),但我没有看到有关如何检索这些字符串的任何信息.会strerror()在这里工作吗?

如何从Winsock中检索人类可读的错误字符串?

c sockets winapi winsock

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

MySQL:如何以编程方式确定外键关系?

类似于这个问题,但对于MySQL ....

如何以编程方式确定MySQL中的外键引用(假设InnoDB)?我几乎可以得到它们:

SHOW TABLE STATUS WHERE Name = 'MyTableName';
Run Code Online (Sandbox Code Playgroud)

...但是,似乎包含一些此信息的注释列被截断,所以我不能依赖它.必须有其他方式......

我很满意C API调用,SQL语句,任何东西 - 我只需要一些能够持续工作的东西.

注意:我还考虑过解析"SHOW CREATE TABLE MyTableName"语句的结果,但我真的希望有更简单的东西.

c mysql sql foreign-keys

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

X11:我如何真正抓住鼠标指针?

我在Xlib中实现了一个水平分割器小部件.当用户点击并拖动分割条时,我试图抓住鼠标(这样用户就可以动态移动分割,从而调整分割条两侧的窗口大小).

XGrabPointer()在接到左键单击后使用,希望所有未来的鼠标移动(拖动)都将转移到拆分器窗口,直到释放左键.

不幸的是,它似乎并没有像那样工作.如果用户拖得太快并且鼠标指针进入分割两侧的一个窗口,则MotionEvent消息将转移到该(子)窗口而不是分割器窗口.

我做错了什么?我的XGrabPointer()电话如下:

::XGrabPointer(mDisplay, window, True,
               ButtonPressMask |
                 ButtonReleaseMask |
                 PointerMotionMask |
                 FocusChangeMask |
                 EnterWindowMask |
                  LeaveWindowMask,
               GrabModeAsync,
               GrabModeAsync,
               RootWindow(mDisplay, DefaultScreen(mDisplay)),
               None,
               CurrentTime);
Run Code Online (Sandbox Code Playgroud)

x11 mouse pointers xlib xgrabpointer

11
推荐指数
1
解决办法
4952
查看次数

数组成员的默认副本分配

我有一个类似于以下的类定义:

class UUID
{
  public:
    // Using implicit copy assignment operator

  private:
    unsigned char buffer[16];
};
Run Code Online (Sandbox Code Playgroud)

我刚刚对我进行了单元测试失败,验证了副本分配是否正常工作.令我惊讶的是,buffer []数组中间的一个字节被错误地复制了.

我的理解是,默认的复制赋值操作符执行成员复制,而数组成员(不是指向数组的成员)则需要执行元素的元素复制.我错了吗?

我在这里的直觉是,我被一个悬挂在指针中间的指针咬了一下.但是,当我将这些物体的矢量复制到另一个矢量时,我可以重复地看到这一点.

有人想告诉我哪里出错了吗?

编辑:

为了扩展这一点,该类不是POD类型 - 它派生自一些抽象基类,因此具有虚拟析构函数.但是,数组是唯一的数据成员,单元测试中的用法是这样的:

const int n = 100;

std::vector<UUID> src, dst;
src.reserve(n);
dst.resize(n);

for (int i = 0; i < n; ++i) {
  UUID id;
  src.push_back(id);
}

for (int i = 0; i < n; ++i) {
  dst[i] = src[i];
}

bool good = true;
for (int i = 0; i < n; ++i) {
  const bool thisGood …
Run Code Online (Sandbox Code Playgroud)

c++ arrays assignment-operator copy-assignment

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

在Linux中从C连接到Matlab引擎

我试图从Linux上的C程序(Matlab r2009a,Ubuntu 9.10)以编程方式调用Matlab引擎.

我有自己的代码(适用于Windows),但是现在我只是想让Matlab"engdemo.c"程序在Linux上运行.我已经设法编译并链接它(在-l<lib>gcc命令行中包含大约15个开关之后),甚至通过一些ldconfig magic解决了所有运行时动态链接.

但是,当程序运行时,我只是得到"无法启动MATLAB引擎"错误消息并且程序结束,没有指示它失败的原因.

有人做过这项工作吗?我忘了做什么?

ps我最初在SuperUser上问过这个,因为我认为它与配置有关,但是我看到其他Matlab引擎相关的?在这里,所以我想我会试一试.

c linux matlab matlab-engine engopen

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

在使用大量内存的过程中,如何在没有内存饥饿的fork()的情况下生成shell?

在嵌入式平台上(没有交换分区),我有一个应用程序,其主进程占用大部分可用的物理内存.问题是我想从我的应用程序中启动一个外部shell脚本,但是使用fork()要求在子进程(最终会将其自身更小的东西)创建之前有足够的内存用于我的原始进程2x .

那么有没有办法从C程序调用shell脚本而不会产生fork()的内存开销?

我已经考虑过一些变通方法,例如有一个辅助较小的进程负责创建shell,或者有一个"观察者"脚本,我通过触摸文件或某些信号发出信号,但我宁愿有更简单的东西.

c unix memory shell fork

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

一般捕获 python DatabaseErrors

我有一个数据库模式,可以在各种不同的数据库引擎中实现(假设我将使用 pyodbc 连接到 MS Access 数据库,或者我将通过内置 sqlite3 模块作为 SQLite 数据库连接到该数据库)简单的例子)。

我想创建一个工厂函数/方法,它根据某些参数返回适当类型的数据库连接,类似于以下内容:

def createConnection(connType, params):
    if connType == 'sqlite':
        return sqlite3.connect(params['filename'])
    elif connType == 'msaccess':
        return pyodbc.connect('DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ={};'.format(params['filename']))
    else:
        # do something else
Run Code Online (Sandbox Code Playgroud)

现在我已经有了一些应该适用于任何连接类型的查询代码(因为无论底层数据库引擎如何,架构都是相同的),但可能会抛出一个我需要捕获的异常:

db = createDatabase(params['dbType'], params)

cursor = db.cursor()

try:
    cursor.execute('SELECT A, B, C FROM TABLE')
    for row in cursor:
        print('{},{},{}'.format(row.A, row.B, row.C))

except DatabaseError as err:
    # Do something...
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是每个 DB API 2.0 实现中的 DatabaseError 类不共享公共基类(除了过于通用的 Exception 之外),因此我不知道如何一般地捕获这些异常。显然我可以做如下的事情:

try:
    # as before
except sqlite3.DatabaseError as …
Run Code Online (Sandbox Code Playgroud)

python exception python-db-api

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

返回一个迭代器

我如何返回迭代器表单函数:

我滔滔不绝地说:...

template<class S,class T> class Database {
public:
.
..
 map<S,Node<T>*> m_map::iterator Find (S keyToFind);
.
..
....


private:
.
..
 map<S,Node<T>*> m_map;
..
.
};

.
..
template<class S,class T>
map<S,Node<T>*> m_map::iterator Find (S keyToFind) {
 map<S,Node<T>*>::iterator itMap;
 itMap = m_map.find(KeyToUpDate);
 return itMap;
}
..
.
Run Code Online (Sandbox Code Playgroud)

有很多错误,因为:错误1错误C2653:'m_map':不是类或命名空间名称错误2错误C2146:语法错误:缺少';' 在标识符"查找"之前错误3错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-错误5错误C2653:'m_map':不是类或命名空间名称错误7错误C2133:'iterator':未知大小.. ...

我不明白是什么问题..

c++ iterator

0
推荐指数
1
解决办法
1191
查看次数