自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 基于FBO对纹理texture进行拷贝或拉伸处理

对于简单的纹理复制需求,使用glCopyTexSubImage2D可以实现。不过前段时间碰到一个怪异的现象,glCopyTexSubImage2D()执行耗费了数秒钟才完成,每次如此。折腾了几天也找不着原因。后来换成使用FBO来拷贝就正常。使用FBO还有一个好处就是可以对画面进行拉伸处理。记录如下。使用glCopyTexSubImage2D函数:// ...GLint lastBuffer;glGetIntegerv(GL_READ_BUFFER, &lastBuffer);glRe

2020-12-02 14:11:42 717 1

原创 OpenGL中内存和显存之间的拷贝操作

1. 从内存至显存1.1 对Buffer object的操作,比较简单:glGenBuffers(NumBuffers, Buffers);glBindBuffer(GL_ARRAY_BUFFER, Buffers[ArrayBuffer]);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW...

2020-01-23 14:45:20 4266

原创 EGL Off-Screen rendering using GBM

最近研究EGL的off-screen rendering,特别是使用GBM这块,网上资料很少。综合搜集到的资料,整合了一个小demo。很多注意事项都写在代码注释里面了。EGL Spec的介绍,没有提及如何使用GBM进行off-screen rendering。因为这属于native platform的实现。EGLSurfaces:1. windows: used for onscreen...

2019-09-06 11:45:26 3344 15

原创 三重指针使用demo

#include <stdio.h>#include <stdlib.h>/* * pop_out函数弹出size个(void *)类型的元素保存至数组(void*) arr[]中. * 因为每次弹出的数量不确定,所以数组arr的大小需要动态申请. * (*arr_p)等价于外部的 arr; arr_p 等价于 &arr */void pop_o...

2019-07-12 11:56:12 373

原创 大数组累计求和 - CPU、OpenMP、CUDA三种方法的性能对比

需求:求整数型数组int array[10000001]所有元素之和,统计计算部分的开销验证平台:ThinkPad T450, Ubuntu 16.04方法一:使用CPU暴力计算代码:#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 10000001int64...

2019-05-01 11:46:11 2629

原创 ubuntu x86-64位机器下编译32位汇编的问题

示例代码:# movtest3.s.section .dataoutput: .asciz "The value is %d\n"values: .int 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60.section .text.globl _start_start: nop movl $0, %ediloop: movl ...

2019-03-16 15:44:25 493

原创 Windows进程内存使用分析 --- VMMap工具使用

VMMap下载地址:https://docs.microsoft.com/en-us/sysinternals/downloads/vmmapVMMap名词说明Committed: 进程向OS宣称要使用的内存大小(在虚拟内存进行了分配),基本上都不等于进程实际使用的物理内存大小。一是其中统计了进程所链接的所有动态库的空间,比如标准C库,而实际上OS在内存中只加载一份C库的代码段,所有进程共...

2019-01-12 11:17:22 6011

原创 插入排序

#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;void ShowArr(const int arr[], int len);void Sort(int arr[], int len){ printf("\nBefore sort: "); ShowArr(arr, len); int key, sortedIndex, j;...

2018-11-26 10:14:46 107

原创 Linux下一个进程为什么会被其他进程株连而死

前两天,有同事发现一个奇怪的BUG,简化来说,有两个进程:A和B。当使用kill -9将进程B杀掉后,进程A有时也会退出,但有时不会,概率性出现。问题抛到我这,我之前也没有看过进程A和进程B的实现代码,不清楚他们之间有什么关联。我的解题思路:1. 确认在进程A、B都正常运行的时候,不会有哪个会突然退出?  --- 经确认不存在2. 确认就是在杀掉进程B后,进程A概率性退出?  --...

2018-09-07 21:59:06 391

原创 外部排序 - 基于堆排序(最大堆)+最大赢者树完成 - C语言

传统的排序算法,需要将所有元素加载至内存.当对巨大数量的元素进行排序时,对系统资源要求比较高.这类算法称为内部排序法,比如冒泡排序,插入排序,堆排序.外部排序,则是每次进行部分排序,然后将各组部分排序的结果合并,再次排序得到最终的结果.本文中的程序用最大堆和最大赢者树完成了一个外部排序算法,基本思想如下:1. 将N个元素的大数组拆成每个元素为M的子数组,得到X=(N/M)个子数组;...

2018-07-19 22:24:14 1699

原创 赢者树WinnerTree - C语言

写WinnerTree实在是一件烧脑的事情。。。相关概念如下:赢者树:对于 n名选手,赢者树是一棵包含n个外部节点,n-1个内部节点的完全二叉树。其中每个内部节点记录了相应赛局的赢家。最大赢者树即每次都是值大的胜出;最小赢者树每次都是值小的胜出。赢者树采用数组公式化描述,最核心的是如何根据外部节点的序号计算内部节点的序号,公式如下:内部节点inner_index = (外部节点outer_inde...

2018-07-12 22:30:16 678 1

原创 Linux下如何让普通用户运行特权程序访问受限文件

问题: 如下这个文件,由root账号创建,权限为 rw-r-----,即对普通用户来说,read/write权限都没有.-rw-r-----  1 root   root         0 7月   9 21:22 rootfile在非root账号即普通用户账号下,试图读取该文件会报错:$ cat rootfile cat: rootfile: 权限不够在某些特殊情况下,普通用户也需要读取该文...

2018-07-09 22:01:24 3727

原创 高度优先左高树(HBLT) - C语言

相关概念:左高树(leftist tree)将树中的节点分为两类:外部节点:用于代替树中的空子树;其余节点均叫做内部节点.内部节点就是我们所能看到的树中的每个真实节点,如果某个节点的左子树为空,那它的这个左子树就是外部节点.外部节点的引入,其实主要是为了下面s(x)这个概念的计算,并不具备其它实际意义.s(x)为节点x至它的子树的外部节点的所有路径中最短的那一条.比如根节点30,左子树为20(内部...

2018-07-08 22:25:30 1925

原创 堆排序 - 通过最大堆实现 - C语言

堆排序实际上是利用了完全二叉树的公式化描述特性,将一个数组以最大堆的方式呈现,并逐一删除其根节点。几个概念要理解:假设完全二叉树中一元素的序号为i,1 &lt;= i &lt;= n,则以下关系成立:1. 当i=1时,该元素为二叉树的根。若i&gt;1,则该元素父节点的编号为i/2(int取整);2. 当2i&gt;n时,该元素无左孩子,否则,其左孩子的编号为2i;3. 当2i+1&gt;n时,该...

2018-07-07 17:47:21 1051

原创 二叉树 - 链表实现 - C语言

实现了二叉树的前序遍历,中序遍历,后序遍历,逐层遍历。其中逐层遍历,使用了TreeQueue.h里面定义的队列Queue。因此,程序由两个文件组成,BinaryTree.c和TreeQueue.h。程序输出:$ ./BinaryTree *****Tree***** + * /a b c d**************PreOrder:+ * a b / c d ...

2018-07-03 22:20:36 953

原创 Hashtable - C语言实现

程序要点:1. 原则上,谁malloc谁负责free;2. hash_index的计算:使用key字符串每个字符之和% max_node_index;3. 不允许添加相同的struct node *n,即对应的key=value已经在table中存在则添加失败;4. 允许相同的key,但不同的value.以单向链表的形式存放于table-&gt;nodes[hash_index]中。HashTab...

2018-07-02 22:06:38 1138 2

原创 论malloc()后忘记初始化(memset)的后果

始终牢记:malloc后,一定记得memset,否则,隐藏的BUG折腾死人!下面这段简单的程序,在create_node()函数中,malloc后,忘了memset,结果运行时出现如下错误.还好代码规模不大,gdb跟踪后发现了异常.如果在一个庞大的工程中,忘了memset,问题就不一定好找了$ ./NodeMallocFree key=the first element, value=Alak...

2018-07-02 21:34:31 6887 1

原创 Linux下分析进程segment fault的方法

长时间不用,命令容易忘,记录一下,以备忘.1. 程序在编译时,记得加 -g 选项,以生成带符号表的目标程序.2. 执行:sudo echo "core" &gt; /proc/sys/kernel/core_pattern //需要root权限.进程碰到段错误后,生成名为core的文件,并存放在进程同目录.ulimit -c unlimited3. 段错误发生后,执行:...

2018-06-30 17:05:59 2704

原创 队列 - 采用数组实现 - C语言

根据初始化size参数,动态申请元素空间.#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;#define RET_TRUE 0#define RET_FALSE -1typedef struct Queue Queue;struct Queue { char **da...

2018-06-30 16:53:35 370

原创 在Linux下如何保证只创建一个进程

在Linux下,如果不加限制,同一个程序,可以有多个运行实例,也称之为进程.它们都有一样的名字,执行着一样的代码段.不同的是,它们拥有不同的pid以及进程空间.有时候,希望同一时间只能创建一个进程.下面这段示例代码就加了这样一个限制.核心点:1. 进程在启动时,判断/tmp/my_pid_file是否存在;如果不存在,则将当前进程的pid写入,程序继续运行;2. 如果/tmp/my_pid_fil...

2018-06-26 22:26:50 2223 2

原创 Linux进程的几种死法

Linux进程正常退出,可以通过在main()函数里面return,或调用exit(),或调用abort().除去代码之外,Linux还定义了如下几个signal,进程在收到这些signal后,会执行一些规定的动作再退出.SIGINT:  Ctrl和C的组合键会产生该signal,进程收到后直接退出;SIGQUIT: Ctrl和\的组合键会产生该signal,进程收到后生成核心转储文件,然后退出;...

2018-06-25 21:52:49 472

原创 堆栈 - 采用数组实现 - C语言

#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;#define MAX_STACK_SIZE 10#define STACK_TRUE 0#define STACK_FALSE 1#define STACK_ERROR -1struct stack { char *data[...

2018-06-22 23:40:22 398

原创 Linux内核的双向链表

内核的双向链表,搞清楚以下两点就明白了:1. 把链表节点嵌入到数据结构中,而不是在链表节点中嵌入数据成员。比如,我们一般习惯这么定义链表:struct city { char name[128]; char province[128]; int population; struct city *next; strcut city *prev;};内核里面的用法:struct list...

2018-06-22 22:45:00 183

原创 单向链表-C语言实现

只实现了几个简单的操作。在Linux内核中链表的使用非常多,不过使用方法与本例完全不一样。后续有时间再详述。 ChainNode.c#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#include &lt;string.h&gt;#define MAX_DATA_LEN 128#define CN_TRUE 0#define CN_...

2018-06-20 23:20:54 819

原创 线性表

线性表是一种非常简单的数据结构,采用数组描述,非线程安全。LinearList.c#include &lt;stdio.h&gt;#include &lt;stdlib.h&gt;#define LL_TRUE 0#define LL_FALSE 1#define LL_ERROR -1typedef struct LinearList LinearList;struct ...

2018-06-19 23:50:26 105

原创 二分搜索

/* * 二分搜索:适用于从有序数组中寻找指定元素。提供了两个方法,作为对比,优先方法二。 * */#include &lt;stdio.h&gt;static void print_arr(int arr[], int arr_size){ int i; if(NULL == arr || arr_size &lt;= 0) return; for(i = 0; i ...

2018-06-15 23:03:40 77

原创 冒泡排序的改进

假如输入本身就是有一个有序的数组,或者在经过一轮循环后就已经有序,则之前的冒泡排序和选择排序都做了不少不必要的循环比较。因此,添加一个判断,如果报文在某次循环后已经有效,则停止排序。以BubbleSort.c为例进行修改。BubbleSort_v2.c:/* * 冒泡排序v2:1. 对相邻的元素进行比较,如果左边的元素大于右边的元素,则交换这两个元素. * 2. 如果在某...

2018-06-14 23:15:31 173

原创 冒泡排序

BubbleSort.c/* * 冒泡排序:对相邻的元素进行比较,如果左边的元素大于右边的元素,则交换这两个元素. * 算法复杂度:与选择排序相同,等于O(n^2). * */#include &lt;stdio.h&gt;static void print_arr(int arr[], int arr_size){ int i; if(NULL == arr || arr...

2018-06-14 22:57:10 98

原创 选择排序

作为软件工程科班出身的程序员,数据结构与算法是必修课,可惜自己没有好好学,工作中也用的非常少.决定从今天起,把这门课重头学一遍,里面涉及的数据结构与算法,自己全部写一遍.看看能够坚持多久开篇从经典的排序算法-选择排序开始:/* * 选择排序:首先找出最大的元素,把它移动到a[n-1],然后在剩余下n-1个元素中寻找最大的元素,并把它移动到a[n-2],依次排序. * 算法复杂度:比较的次数是固...

2018-06-14 22:33:50 123

原创 基于生产者-消费者模型的视频播放器 - 续3

在《基于生产者-消费者模型的视频播放器 - 续2》中还存在两个问题:1. 视频播放结束后,窗口不能自动退出,且无法响应鼠标、键盘事件;2. 有时按 空格  暂停不生效,或延时生效。主要原因是在Consumer Thread中,有两个阻塞等待的地方:一个是SDL_WaitEvent(&amp;event),等待按键或REFRESH event;另外一个是dequeue(&amp;frame_q),从...

2018-06-01 21:18:25 193

原创 基于生产者-消费者模型的视频播放器 - 续2

昨天《基于生产者-消费者模型的播放器(基于FFMPEG 4.0和SDL2.0.8,在Ubuntu 14.04下开发验证)》中的程序,存在两个遗留问题,今天都修改好了。之所以新开一篇而不是在原来的基础上编辑,是为了保留这个修改的过程。通过前后对比,可以清楚看到做了哪些修改。MyPlayerV2.c:/* * A simple player with FFMPEG4.0 and SDL2.0.8....

2018-05-31 23:18:02 254

原创 基于生产者-消费者模型的播放器(基于FFMPEG 4.0和SDL2.0.8,在Ubuntu 14.04下开发验证)

程序说明:共三个文件,MyPlayerV2.c: 定义了两个线程,一个解码并将解码后的数据存放至队列;另外一个每40毫秒取一次队列里面的数据并显示。video_frame_queue.h: 定义了一个队列,里面存放解码后的frame数据,并实现了基本的进/出队列操作。Makefile:编译存在的问题:1. 窗口播放几秒后,失去焦点,导致画面变黑白,后续通过SDL Event解决;2. 画面偶尔有闪...

2018-05-31 00:10:45 402

原创 一个纯粹的视频解码程序(基于FFMPEG 4.0,在Ubuntu 14.04下验证)

程序功能:将指定的视频文件,解码为原始YUV数据,只包含视频流。开发环境:Ubuntu 14.04, GCC 4.8.4, FFMPEG 4.0编译方法: 将代码copy命名为SimpleDecoder.c,与Makefile放置于同一目录下,执行 make 即可。运行方法:执行 ./mydecoder 视频路径,比如 ./mydecoder ~/Videos/xx.mp4,解码后的文件保存在xx...

2018-05-27 23:18:05 1260

原创 一个简单的视频播放器(基于FFMPEG4.0+SDL2.0.8,在Ubuntu 14.04下开发验证) - 续2

昨天那个例子,在 Ubuntu 14.04下播放视频时,有个问题,有播放几秒后,画面就变成黑白的了。刚开始怀疑是UV数据丢失,不过在将YUV数据输出到文件,用YUV Player Deluxe播放,画面色彩正常着。今天在主程序中新起了一个SDL Thread,发现画面就好了,奇怪的很。问题虽然已经解决,但原因还没找到。应该是和SDL Window的某些特性相关,视频解码和生成YUV是没有问题的。 ...

2018-05-26 00:21:07 368

原创 一个简单的视频播放器(基于FFMPEG4.0+SDL2.0.8,在Ubuntu 14.04下开发验证)

本程序改造自雷神的示例代码。雷神的原示例代码中,部分解码核心函数在FFMPEG4.0中已经被声明为废弃,在GCC编译时会提示deprecated。所以我根据FFMPEG4.0最新代码说明,进行了小小的改造,供需要的同学参考。我的开发环境:Ubuntu 14.04, GCC 4.8.4, FFMPEG 4.0, SDL 2.0.8.编译方法: 将代码copy命名为MyFirstPlayer.c,与M...

2018-05-24 23:17:40 897

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除