经过多年关于顶点缓冲对象(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():
顶点阵列(CPU端):
顶点缓冲对象(GPU端):
对于踢,我正在编写一个"模式文档"工具,用于生成数据库中表和关系的描述.我目前正在填补它与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表隐藏在包含这些信息的地方,但到目前为止还没有找到它.
我正在将一些套接字代码从Linux移植到Windows.
在Linux中,我可以使用strerror()将errno代码转换为人类可读的字符串.
MSDN文档显示返回的每个错误代码的等效字符串WSAGetLastError(),但我没有看到有关如何检索这些字符串的任何信息.会strerror()在这里工作吗?
如何从Winsock中检索人类可读的错误字符串?
类似于这个问题,但对于MySQL ....
如何以编程方式确定MySQL中的外键引用(假设InnoDB)?我几乎可以得到它们:
SHOW TABLE STATUS WHERE Name = 'MyTableName';
Run Code Online (Sandbox Code Playgroud)
...但是,似乎包含一些此信息的注释列被截断,所以我不能依赖它.必须有其他方式......
我很满意C API调用,SQL语句,任何东西 - 我只需要一些能够持续工作的东西.
注意:我还考虑过解析"SHOW CREATE TABLE MyTableName"语句的结果,但我真的希望有更简单的东西.
我在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) 我有一个类似于以下的类定义:
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) 我试图从Linux上的C程序(Matlab r2009a,Ubuntu 9.10)以编程方式调用Matlab引擎.
我有自己的代码(适用于Windows),但是现在我只是想让Matlab"engdemo.c"程序在Linux上运行.我已经设法编译并链接它(在-l<lib>gcc命令行中包含大约15个开关之后),甚至通过一些ldconfig magic解决了所有运行时动态链接.
但是,当程序运行时,我只是得到"无法启动MATLAB引擎"错误消息并且程序结束,没有指示它失败的原因.
有人做过这项工作吗?我忘了做什么?
ps我最初在SuperUser上问过这个,因为我认为它与配置有关,但是我看到其他Matlab引擎相关的?在这里,所以我想我会试一试.
在嵌入式平台上(没有交换分区),我有一个应用程序,其主进程占用大部分可用的物理内存.问题是我想从我的应用程序中启动一个外部shell脚本,但是使用fork()要求在子进程(最终会将其自身更小的东西)创建之前有足够的内存用于我的原始进程2x .
那么有没有办法从C程序调用shell脚本而不会产生fork()的内存开销?
我已经考虑过一些变通方法,例如有一个辅助较小的进程负责创建shell,或者有一个"观察者"脚本,我通过触摸文件或某些信号发出信号,但我宁愿有更简单的东西.
我有一个数据库模式,可以在各种不同的数据库引擎中实现(假设我将使用 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) 我如何返回迭代器表单函数:
我滔滔不绝地说:...
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 ×4
c++ ×2
arrays ×1
database ×1
engopen ×1
exception ×1
foreign-keys ×1
fork ×1
graphics ×1
iterator ×1
linux ×1
matlab ×1
memory ×1
mouse ×1
mysql ×1
opengl ×1
performance ×1
pointers ×1
python ×1
schema ×1
shell ×1
sockets ×1
sql ×1
sqlite ×1
unix ×1
vbo ×1
winapi ×1
winsock ×1
x11 ×1
xgrabpointer ×1
xlib ×1