- 博客(41)
- 资源 (2)
- 收藏
- 关注
原创 opengl动态修改vbo数据
创建一个vbo缓存,并传入顶点属性。由于修改的频率不高,所以使用GL_STATIC_DRAW。在项目中需要动态修改物体颜色,但在修改颜色时,有串色的bug,在此记录一下。但出现了一种奇怪的现象,其他物体会短暂地变成这个新颜色,然后恢复正常。当使用vao时,不需要管vao,直接绑定需要修改数据的id即可。当需要修改颜色时,新数据为newData,使用如下方法直接修改。后没有了这个bug。
2023-10-16 17:30:16 437
原创 openglES多纹理
绘制阴影时,在一个片元着色器中需要2个纹理。一张普通纹理,一张深度纹理。但glBindTexture只能绑定一张纹理,该怎么办呢?这时就需要设置纹理单元,一个单元对应一个纹理。但要注意,设置对应的uniform变量的值。
2023-10-13 15:47:55 133
原创 eigen笔记
Eigen::VectorXf::LinSpaced可以同时赋值行或列,但是直接赋值给矩阵后,就是变成1列了。需要使用reshaped()resize会在保持内存顺序不变的情况下,变换行列。矩阵组成矩阵,按先排满行,再排满列。两个动态类型可以直接赋值。
2023-06-20 16:30:29 243
原创 std::sort使用const iterator引发的编译错误
no matching function for call to 'swap'
2022-02-11 17:16:39 1563
原创 segfault信息分析
segfault at 0 ip 00007f038f8e15b6 sp 00007ffcab34e670 error 4 in libread.so[7f038f8e1000+1000]
2022-01-26 19:30:55 4358
原创 线程安全与锁使用-注意事项
增加注释增加与线程安全相关的注释在示例1,函数描述中说明了线程安全。同时说明了该函数存在的风险。_renderMutex是递归锁anchorP->SetInfoWindowImageData会回调AnchorLayer中的持_renderMutex的成员函数(反回调)子调用addAnchorPoint中持有_renderMutex锁示例1 /** * @brief:导致使用[递归锁],反回调,thread-safe * @para
2022-01-21 16:47:00 3345
原创 c语言 宏定义嵌套
c语言中的宏定义是支持嵌套的,如下两个代码,无论宏定义的先后顺序,都是可以的。#define b_print a_print#define a_print cout << "a" << endlint main(){ b_print; return 0;}#define a_print cout << "a" << endl#define b_print a_printint main(){ b_print; return 0;
2022-01-05 17:53:08 3863
原创 qt QFile.rename失败
QFile中的rename在下面情况下会rename失败文件被打开新文件名在目录下已存在新文件名没有写全路径假设C:\Users\95163\Desktop目录下有icmp.pcap, icmp1.pcap两个文件,则执行结果如下 QFile f("C:\\Users\\95163\\Desktop\\icmp.pcap"); f.open(QFile::Append); //失败,文件已被打开 f.rename("C:\\Users\\95163\\Desktop\\icmp2.pcap"
2021-03-22 19:36:56 4159
原创 boost.asio异步调用使用智能指针
boost.asio中的异步async_*函数需要传入回调函数参数,如果回调函数使用lamda表达式,在’capture’列表中传入智能指针,智能指针会生效吗?在async_connect调用之前,我们创建一个shared_ptr对象,并以值传入的形式放到lamda的’caputer’列表中,最后发现shared_ptr在async_connect的异步回调函数完成后析构了其管理的对象,可见其是生效的。其实最好还是用uinque_ptr,但lamda中不支持move捕获。测试代码如下:class L
2021-02-20 08:50:49 529
原创 go语言由string构造[]byte的坑
由string转为[]byte后的len为内容长度,但cap并不是,这在构造缓冲区时要多加注意。func main(){str:=“hello”strBytes:=[]byte(str)fmt.Println(“len=”,len(strBytes),",cap=",cap(strBytes))}
2021-02-19 11:47:30 258
原创 boost.asio的async_write_some存在的坑
boost.asio的async_write_some看起来很方便,但使用起来很复杂,主要有两个方面:async_write_some经常与io_context不在同一线程,async_write_some同一时刻只能由一个线程调用,需要加锁,同时需要与io_context所在线程的其他异步方法同步,如关闭sock的时机。当对方一直不读取缓冲区,就会造成本方的socket发送缓冲区爆满,此种情况需要怎样处理?第一种情况就需要根据业务情况加各种锁了。现在只讨论当对方一直不读缓冲区的情况。测试如下s
2021-02-19 11:39:10 4518 1
原创 boost.asio中socket异步关闭流程
boost.asio中的socket异步方法,需要检测std::error_code来关闭连接,那如何正常关闭tcp连接呢。下面的模拟测试中:1.server端在读取client端发送的第一个1024字节流后,关闭连接。2.client端在另一个线程发送第一个1024字节流后,sleep1秒,再发送第二个1024字节流。结果:1.server端在关闭socket后,其异步方法会检测到错误。2.client端的第二次发送也会检测到错误。所以通过正常的错误处理,两端可以及时地关闭tcp连接。可以得
2021-02-19 11:14:46 2862
原创 boost.asio的异步回调函数是否在同一线程中执行
boost.asio中有async_read_some,async_accept,async_write_some,async_connect这几个函数,那么他们的回调函数都在同一线程吗?如果io_context在单线程运行,那么是的,测试如下。class LIBTEST_BOOST_DLL TcpServer{public: typedef boost::asio::ip::tcp::socket tcp_socket_t; typedef boost::asio::ip::tcp::acc
2021-02-19 09:36:21 774
原创 c/c++动态指定sprintf字符串的宽度
sprintf函数可用*号指定字符串的长度 int width = 8; char *buf = new char[width+1]; sprintf(buf, "%0*d", width, 1); cout << buf << endl; delete buf;输出结果:00000001
2021-02-19 08:50:43 1561
原创 scalar deleting destructor(unsigned int)
在使用vs调试时,析构函数执行时在’scalar deleting destructor’的位置报错,怀疑是指针被delete了多次,但最后发现是”被释放的内存存在越界问题“,比较难发现。问题简要如下class MemCorrupt {public: typedef std::unique_ptr<char[]> char_ptr_t; MemCorrupt() { ptr_ = char_ptr_t(new char[8]); sprintf(ptr_.get(),"%08d"
2021-02-19 08:45:36 3604
原创 c++ chrono 获取以ms为单位的时间戳
c++中的chrono可以获得epoch时间戳,即获得从1971.1.1零时开始的时间戳。核心就是用chrono::system_clock::now(),获取当前的时间,再进行如下转换#include <iostream>#include <chrono>using namespace std;int main(){ auto ms = chrono::duration_cast<chrono::milliseconds>(chrono::system
2021-01-27 16:32:47 5023
原创 c++中int32,int64等类型的最大最小值
c++中的头文件中 包含了各数字类型的极限值,使用起来挺方便的。#include <iostream>#include <limits>using namespace std;template<typename T>static void _PrintLimit(const char *desc, const T &num) { cout << desc << "=" << num << "\t";}
2021-01-27 15:25:18 20186
原创 c/c++ uin32相乘赋值给uint64的变量精度丢失
有一个uint32_t的整数1611660692,将其乘1000后,发现得到的数值为1047956000,而不是1611660692000。过程如下uint32_t a = 1611660692;uint64_t b = a * 1000;这种情况下,得到b的值为1047956000。右边先将结果转换为uint32_t的,再将uint32_t转换为uint64_t的,所以造成精度丢失。如果像下边这么写就没问题了uint32_t a = 1611660692;uint64_t b = stati
2021-01-27 10:02:26 1458
原创 c++ boost 加载文件到字符串
c++标准中没有一个api可以加载文件到string类型,网上都说的是先用ostringstream中转下,今发现了boost中有一个这样的api,用着挺好用,注意捕捉异常。#include<boost/filesystem.hpp>#include<iostream>using namespace std;string strRet;string path="/root/hello.txt";try { boost::filesystem::load_string
2021-01-26 14:05:24 629
Kiwi_SyslogGen.zip
2020-06-14
mibBrowser.rar
2020-06-05
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人