背景回顾:什么是大语言模型(LLM)?

在进入注意力机制的细节之前,我们先了解一下什么是大语言模型(LLM)。简单来说,LLM是一种通过深度学习技术训练的大规模神经网络模型,用于处理和生成自然语言。LLM可以应用于各种任务,如文本生成、机器翻译、问答系统等。

LLM之所以能够如此强大,离不开其庞大的参数量和复杂的架构。编码器(Encoder)和解码器(Decoder)是LLM的两个核心组件,它们分别处理输入数据和生成输出。在此基础上,注意力机制的引入进一步提升了LLM的性能和表达能力。

编码和解码的基础概念

在大型语言模型中,编码器(Encoder)和解码器(Decoder)是两个核心组件,它们分别处理输入数据和生成输出。通常来说,LLM中的编码器和解码器使用Transformer架构,以下是它们的基本概念:

编码器(Encoder)

作用:编码器负责将输入序列(例如,一段文本)转换为一种可以被解码器理解的内部表示形式。它通过多层神经网络处理输入数据,使模型能够捕捉上下文和词与词之间的关系。

应用阶段:输入编码阶段。在这个阶段,注意力机制帮助模型理解输入序列的每个词的重要性,以及它们之间的关系,从而更好地捕捉上下文信息,理解句子的含义。


解码器(Decoder)

作用:解码器从编码器生成的内部表示形式中生成输出序列(例如,翻译后的文本)。解码器在生成每个输出词时,都会参考输入序列和已经生成的部分输出序列。

应用阶段:输出生成阶段。在生成输出时,注意力机制帮助模型重点关注输入序列中的关键部分,从而生成高质量、连贯的输出。

通过理解编码器和解码器的作用,读者可以更好地理解注意力机制在大型语言模型中的关键作用。


注意力机制应用阶段和意义

输入编码阶段(Input Encoding):在这个阶段,注意力机制帮助模型理解输入序列的每个词的重要性,以及它们之间的关系。通过计算每个词的注意力权重,模型能够更好地捕捉上下文信息,理解句子的含义。

中间层(Intermediate Layers):在大语言模型的各个中间层,注意力机制起到了全局信息传递和整合的作用。自注意力机制使得每个词能够“看到”整个输入序列中的其他词,从而更全面地理解上下文。这在处理长序列数据时尤为重要,因为模型需要捕捉远距离词之间的依赖关系。

输出生成阶段(Output Generation):在生成输出时,注意力机制帮助模型重点关注输入序列中的关键部分,从而生成高质量、连贯的输出。这对于机器翻译、文本生成等任务尤为重要。例如,在机器翻译中,模型需要根据源语言句子的不同部分生成目标语言的翻译,而注意力机制正是实现这一点的关键。


各种注意力机制及其优缺点和历史背景

加性注意力(Additive Attention)

加性注意力就像你在写一篇文章时挑选最相关的参考资料。它不仅计算精准,还适用于不同维度的查询和键。但有时候,它会显得有些慢热。它由Bahdanau等人在2014年提出,开启了神经机器翻译的新时代。

乘性注意力(Scaled Dot-Product Attention)

乘性注意力就像你在观看一场激烈的篮球比赛,只关注场上最出色的球员。计算效率超高,但要注意适时地缩放得分,以免陷入梯度消失或爆炸的泥潭。Vaswani等人在2017年将其引入Transformer模型,使其迅速成为主流选择。

自注意力(Self-Attention)

自注意力犹如你在回忆一次难忘的旅行,每个细节都在你脑海中浮现。它能捕捉全局上下文信息,但对内存和计算资源的需求不容小觑。同样由Vaswani等人在2017年提出,自注意力成为了Transformer的核心。

多头注意力(Multi-Head Attention)

多头注意力就像你在组织一场盛大的派对,需要同时关注不同的细节。它增强了模型的表达能力,但计算复杂度也随之上升。同样由Vaswani等人在2017年提出,多头注意力让模型具备了多任务处理的超能力。

Flash Attention

Flash Attention是注意力机制中的超级英雄,它能迅速找到关键信息,且内存利用效率高。虽然实现起来有些复杂,但它依赖底层硬件优化,使得计算速度飞快。这种机制旨在解决传统注意力机制在处理长序列时的性能瓶颈。


嵌入维度的选择

选择嵌入维度就像给模型挑选一副合适的眼镜。它决定了模型能看到多细致的语义信息。嵌入维度越高,模型的表现力越强,但计算负担也会增加。反之,较低的嵌入维度计算更快,但可能无法捕捉复杂的语义关系。这个重要的设计决策需要根据具体任务和数据特点进行权衡和优化。

一个具体的例子:向量化过程
假设我们有一句话:“我和同桌约好了明天在他家玩游戏。”

1. 词嵌入(Word Embedding)
首先,句子中的每个词会被转换为一个固定长度的向量。例如,假设我们选择嵌入维度为4:

"" -> [0.1, 0.2, 0.3, 0.4]
"" -> [0.5, 0.6, 0.7, 0.8]
"同桌" -> [0.9, 1.0, 1.1, 1.2]
"约好" -> [1.3, 1.4, 1.5, 1.6]
"" -> [1.7, 1.8, 1.9, 2.0]
"明天" -> [2.1, 2.2, 2.3, 2.4]
"" -> [2.5, 2.6, 2.7, 2.8]
"他家" -> [2.9, 3.0, 3.1, 3.2]
"" -> [3.3, 3.4, 3.5, 3.6]
"游戏" -> [3.7, 3.8, 3.9, 4.0]

这些向量捕捉了每个词的语义信息。

2. 位置编码(Positional Encoding)
由于句子中的词序很重要,我们需要将位置信息加入向量表示中。假设位置编码向量如下:

位置1 -> [0.01, 0.02, 0.03, 0.04]
位置2 -> [0.05, 0.06, 0.07, 0.08]
...

我们将词嵌入向量和位置编码向量相加,得到新的词向量:

"" -> [0.1+0.01, 0.2+0.02, 0.3+0.03, 0.4+0.04] -> [0.11, 0.22, 0.33, 0.44]
"" -> [0.5+0.05, 0.6+0.06, 0.7+0.07, 0.8+0.08] -> [0.55, 0.66, 0.77, 0.88]
...

3. 多头注意力(Multi-Head Attention)
在多头注意力机制中,我们将向量分为多个子空间(head),并在每个子空间上并行计算注意力。

例如,我们使用三个例如,我们使用三个子空间来演示:
Head 1:计算查询(Query)和键(Key)的点积并缩放,生成注意力权重,然后对值(Value)进行加权求和。
Head 2:重复上述过程,但在另一个子空间中进行。
Head 3:再次重复上述过程。

假设每个子空间计算出的注意力权重如下:

Head 1:
"" -> 0.3, "" -> 0.2, "同桌" -> 0.4, ...

Head 2:
"" -> 0.1, "" -> 0.5, "同桌" -> 0.3, ...

Head 3:
"" -> 0.4, "" -> 0.3, "同桌" -> 0.1, ...

每个子空间的加权求和结果如下:

Head 1:
"" -> [0.11*0.3, 0.22*0.2, 0.33*0.4, 0.44*0.1] -> [0.033, 0.044, 0.132, 0.044]

Head 2:
"" -> [0.11*0.1, 0.22*0.5, 0.33*0.3, 0.44*0.1] -> [0.011, 0.11, 0.099, 0.044]

Head 3:
"" -> [0.11*0.4, 0.22*0.3, 0.33*0.1, 0.44*0.2] -> [0.044, 0.066, 0.033, 0.088]

最后,我们将所有子空间的结果拼接在一起,得到最终的向量表示:

 
"" -> [0.033, 0.044, 0.132, 0.044, 0.011, 0.11, 0.099, 0.044, 0.044, 0.066, 0.033, 0.088]

这种多头注意力机制使得模型能够同时关注输入数据的不同方面,从而增强模型的表达能力。


注意力机制的演变和发展

让我们进一步了解一下注意力机制的发展历史及其创新点:


加性注意力(Additive Attention)

提出时间:2014年
发明者:Bahdanau等人
背景:在神经机器翻译任务中,加性注意力首次被引入,旨在解决传统编码器-解码器模型无法捕捉长序列依赖的问题。
创新点:加性注意力通过计算查询(Query)和键(Key)之间的加性关系来获得权重,从而更加稳定地处理不同维度的数据。

 

乘性注意力(Scaled Dot-Product Attention)

提出时间:2017年
发明者:Vaswani等人
背景:在Transformer模型中,乘性注意力被广泛应用,用于提高计算效率和模型性能。
创新点:乘性注意力通过计算查询和键的点积得分,并进行缩放,以避免梯度消失或爆炸的问题。


自注意力(Self-Attention)

提出时间:2017年
发明者:Vaswani等人
背景:自注意力机制是Transformer模型的核心,能够在全局范围内捕捉输入数据中的上下文信息。
创新点:自注意力允许每个词与输入序列中的其他词进行关联,从而更全面地理解上下文。


多头注意力(Multi-Head Attention)

提出时间:2017年
发明者:Vaswani等人
背景:在Transformer模型中,多头注意力被引入以增强模型的表达能力和多任务处理能力。
创新点:多头注意力通过在多个子空间上并行计算注意力,使模型能够同时关注输入数据的不同方面。


Flash Attention

提出时间:2024年
创新点:Flash Attention通过利用底层硬件优化和分块处理技术,提高了计算速度和内存效率,解决了传统注意力机制在处理长序列时的性能瓶颈。
注意力机制的实际应用
注意力机制在各种自然语言处理任务中发挥了重要作用,以下是几个常见应用:


1. 机器翻译(Machine Translation)

应用场景:将一种语言的文本翻译成另一种语言。
实现方式:通过注意力机制,模型能够根据源语言句子的不同部分生成目标语言的翻译,从而提高翻译质量。


2. 文本生成(Text Generation)

应用场景:生成自然流畅的文本,例如诗歌、小说、对话等。
实现方式:注意力机制帮助模型重点关注输入序列中的关键部分,从而生成高质量、连贯的输出。


3. 语音识别(Speech Recognition)

应用场景:将语音信号转换为文本。
实现方式:通过注意力机制,模型能够在长时间的音频信号中识别出重要的语音特征,从而提高识别准确性。


4. 图像描述(Image Captioning)

应用场景:为图像生成描述性文字。
实现方式:注意力机制帮助模型关注图像中的关键区域,从而生成准确的描述。

 

多头注意力机制在句子向量化中的应用图示

                      +-------------------------+
                      | 输入句子:              |
                      | "我和同桌约好了明天在他家玩游戏"  |
                      +-------------------------+
                                |
                                v
                  +--------------------------------+
                  | 词嵌入(Word Embedding)       |
                  | 每个词转换为固定长度的向量     |
                  +--------------------------------+
                                |
                                v
                  +--------------------------------+
                  | 位置编码(Positional Encoding)|
                  | 加入位置信息的词向量           |
                  +--------------------------------+
                                |
                                v
                  +---------------------------+
                  | 多头注意力(Multi-Head Attention)  |
                  | 多个子空间并行计算注意力    |
                  +---------------------------+
                                |
                                v
                  +--------------------------------------+
                  | 最终向量表示                       |
                  | 每个词的向量结合多个注意力头的结果 |
                  +--------------------------------------+

 

posted @ 2025-03-01 17:33 重庆Debug 阅读(283) 评论(0) 推荐(1) 编辑
摘要: 你有没有想过,为什么AI大神们处理日语时,总是会挠头?其实,这都要从“token”这个神奇的小东西说起。 阅读全文
posted @ 2025-02-20 16:07 重庆Debug 阅读(693) 评论(1) 推荐(5) 编辑
摘要: Yolov8 Yolov10 Detect 物件识别 后处理实现 代码 阅读全文
posted @ 2024-06-07 17:16 重庆Debug 阅读(3274) 评论(1) 推荐(4) 编辑
摘要: blob_vkallocator workspace_vkallocator staging_vkallocator 区别 阅读全文
posted @ 2023-12-25 17:43 重庆Debug 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 将ncnn静态链接vulkan改成动态加载vulkan的形式,用到了KhronosGroup组织下的Vulkan-SDK里面的CPP部分。 阅读全文
posted @ 2023-09-14 15:55 重庆Debug 阅读(223) 评论(0) 推荐(0) 编辑
摘要: NVIDIA Maxine Video Effects SDK 編程指南 NVIDIA Maxine Video Effects支持基于 AI 的视觉效果,这些效果可以输入标准网络摄像头画面数据,同时也可以传入一张图或者来自ffmpeg解码器的帧数据,让使用者可以轻松集成到视频会议和视频特效内容创建管道中;底层深度学习模型使用 NVIDIA® TensorRT™ 通过 NVIDIA AI 进行优化以实现高性能推理,使开发人员能够在实时应用程序中应用多种效果。本文由重庆Debug原创 阅读全文
posted @ 2023-06-13 15:42 重庆Debug 阅读(1175) 评论(2) 推荐(0) 编辑
摘要: 三大显卡厂商(Intel NVIDIA AMD)产品对硬件解码编码支持程度列表 阅读全文
posted @ 2023-06-08 16:40 重庆Debug 阅读(12570) 评论(3) 推荐(1) 编辑
摘要: Vulkan Support Check and Dynamic Loader C++ code sample 阅读全文
posted @ 2023-04-28 12:21 重庆Debug 阅读(292) 评论(0) 推荐(0) 编辑
摘要: 如果设备不支持vulkan,就用swiftshader,否则就加载系统的vulkan的正确姿势,让程序能够智能的在vulkan-1.dll和libvk_swiftshader.dll之间切换 阅读全文
posted @ 2023-03-21 11:45 重庆Debug 阅读(2262) 评论(0) 推荐(0) 编辑
摘要: NCNN 内存分配器 显存分配器 ncnn::Allocator ncnn::VkAllocator 阅读全文
posted @ 2023-03-14 20:49 重庆Debug 阅读(408) 评论(0) 推荐(0) 编辑
摘要: Vulkan的VkImage和OpenGL的Texture2D互转的3种方法 阅读全文
posted @ 2023-02-10 13:36 重庆Debug 阅读(1147) 评论(0) 推荐(0) 编辑
摘要: 用vs2017 qt5.12 静态编译onnxruntime-gpu CUDA cuDNN TensorRT的完整教程 阅读全文
posted @ 2022-12-13 18:56 重庆Debug 阅读(3827) 评论(5) 推荐(4) 编辑
摘要: OpenCV简单实现AR需用到的算法函数介绍。OpenCV内置提供的追踪算法,目标追踪算法、稠密(密集)光流法、稀疏光流法 阅读全文
posted @ 2022-08-08 18:39 重庆Debug 阅读(1136) 评论(0) 推荐(0) 编辑
摘要: OpenCV视频防抖 AIS智能防抖 图形学 阅读全文
posted @ 2022-07-22 16:42 重庆Debug 阅读(5232) 评论(7) 推荐(1) 编辑
摘要: 因为工作上的需求,需要实现一个类似Photoshop里面的钢笔工具, 分析一下它的功能,包括: 1. 有两种点:节点和控制点,节点是构成图形的基本端点,控制点是影响贝塞尔曲线的系数。 2. 创建节点:鼠标左键点击空白区域,即可创建一个方形节点。 3. 删除节点:鼠标左键单击一个已存在的节点,即可将当 阅读全文
posted @ 2022-06-17 11:23 重庆Debug 阅读(679) 评论(2) 推荐(0) 编辑
摘要: 近日网上大家都在热议阿里开除了利用js脚本抢内部月饼的5位员工。 新闻详见:http://business.sohu.com/20160913/n468382014.shtml 新闻后续跟进:http://toutiao.com/i6330260731623113217/ 其实我从技术的角度上来分析 阅读全文
posted @ 2016-09-15 23:26 重庆Debug 阅读(956) 评论(0) 推荐(0) 编辑
摘要: 这周二下班之后我在软件园的草坪下看到一只鸟,它旁边还有三只雏鸟,有两只已经横躺着,有一只已经奄奄一息在抖动翅膀;我走近过去想仔细看,那大鸟立即就飞到我头顶的树枝上,依然警惕的瞩视着我。等我在那只大鸟的目送下离开大约有十米左右,它才重新飞下来救它孩子。不知道是谁那么缺德捣了它窝,也许是老鼠,也许是清洁 阅读全文
posted @ 2016-07-31 15:15 重庆Debug 阅读(394) 评论(0) 推荐(0) 编辑
摘要: 接触背景 因为工作上某项目的需要设计一种分布式处理耗时的运算,每个节点然后将运算结果返回给中心服务器,而最初未了解RPC这部分之前我的设计是在每一个RPC服务器上搭建一个webserver,然后部署运算的service在上面,用json的方式通讯,这样肯定是可以实现的,但是部署极其麻烦又让webse 阅读全文
posted @ 2016-04-09 16:50 重庆Debug 阅读(5988) 评论(3) 推荐(3) 编辑
摘要: 对于开源菜谱的思考近年厨师这行业越来越吃香了,特别是厨师长越来越拽了,甚至和餐馆老板关系弄僵了带着一群徒弟反炒老板的鱿鱼,但是大家都只看到表层现象,为什么没有思考一下烹饪和编程有什么相似之处吗?今天我就是要拿厨师来和程序员做一做比较,剖析一下菜谱和厨艺、厨师这些与之对应的关系。现在我们可以做一个大胆... 阅读全文
posted @ 2015-09-17 23:09 重庆Debug 阅读(444) 评论(3) 推荐(1) 编辑
摘要: 其实在此之前我并不了解WMI相关的知识,最初是因为今晚上不小心从某软件站里下载了某所谓绿色软件,Firefox被挟持首页到360上网导航了,有问题本身并不可怕,重要的是解决过程,因此我按照正常排查问题的顺序:1.首先在Firefox中打开about:config标签页,然后看到browser.sta... 阅读全文
posted @ 2015-09-07 00:34 重庆Debug 阅读(806) 评论(1) 推荐(2) 编辑
摘要: 前一段时间,无意在网上看到了一篇文章感觉找到了同类。文章原文:http://www.guancha.cn/europe/2014_04_15_222159.shtml原来这个世界上还有与我同类的人,只不过他们可能比我更严重。文中有提到英国埃塞克斯大学的研究员也在2007年进行了类似实验。实验结果显示... 阅读全文
posted @ 2015-07-11 22:08 重庆Debug 阅读(576) 评论(0) 推荐(0) 编辑
摘要: 前二天突然发现家里所用的长城宽带的www.12306.cn无法正常显示,点击余票查询或者车票预订均打不开,加载时间非常长,现象好似CSS等资源文件未载入成功(如图所示)更换chrome、firefox、IE均不行,起初我还以为是12306网站被大量刷不到票的黄牛DDOS攻击的结果,后来等待了几天一直... 阅读全文
posted @ 2015-04-26 15:32 重庆Debug 阅读(5574) 评论(0) 推荐(0) 编辑
摘要: 协程的介绍协程(coroutine),意思就是“协作的例程”(co-operative routines),最早由Melvin Conway在1963年提出并实现。跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式多任务系统,而协程实现的多任务系统成为协作式多任务系统。线程... 阅读全文
posted @ 2014-11-12 17:11 重庆Debug 阅读(1424) 评论(0) 推荐(1) 编辑
摘要: 我几年前曾经遇到过这事情,当时在大街上人很少,就在一个医院旁边,一个老人突然倒地抽泣打摆子,有点像羊癫疯,癫痫的症状。 我立即跑到附近30米内的医院,通知里面窗口的人跟他们说明了情况,他说必须要有负责人才会出救,还说谁知道他是不是流浪汉?后来我又一直就站在旁边询问那老人家在那,他抽搐着没法说话... 阅读全文
posted @ 2014-09-14 16:51 重庆Debug 阅读(368) 评论(0) 推荐(1) 编辑
摘要: 其实最初不是为了解决这个问题而来的,是Peter兄给我的提示解决另一个问题却让我误打误撞解决了另外一个问题之后也把这个隐藏了很久的bug找到(之前总是有一些特别短的视频产生不知所措还以为是视频素材本身有问题呢),今天真是收获颇丰啊,对libav的理解更深。 一直以来我的程序架构是让读一帧av_re... 阅读全文
posted @ 2014-09-02 16:42 重庆Debug 阅读(5422) 评论(10) 推荐(1) 编辑
摘要: OpenCV学习之CvMat的用法详解及实例CvMat是OpenCV比较基础的函数。初学者应该掌握并熟练应用。但是我认为计算机专业学习的方法是,不断的总结并且提炼,同时还要做大量的实践,如编码,才能记忆深刻,体会深刻,从而引导自己想更高层次迈进。1.初始化矩阵:方式一、逐点赋值式:CvMat* ma... 阅读全文
posted @ 2014-08-22 13:26 重庆Debug 阅读(15068) 评论(0) 推荐(0) 编辑
摘要: 距离上一次教程又过去了将近一个多月,相信大家已经都将我上节课所说的东西所完全消化掉了。这节课就来点轻松的,说说libav的命令使用吧。注:遇到不懂的或者本文没有提到的可以用例如命令后加 --help full或者man 命令(man avconv)查看全部参数细节,或者进libav.org网站查:h... 阅读全文
posted @ 2014-08-13 17:50 重庆Debug 阅读(2502) 评论(1) 推荐(1) 编辑
摘要: Bezier曲线的原理Bezier曲线是应用于二维图形的曲线。曲线由顶点和控制点组成,通过改变控制点坐标可以改变曲线的形状。一次Bezier曲线公式:一次Bezier曲线是由P0至P1的连续点,描述的一条线段二次Bezier曲线公式:二次Bezier曲线是 P0至P1 的连续点Q0和P1至P2 的连... 阅读全文
posted @ 2014-07-29 14:32 重庆Debug 阅读(18440) 评论(0) 推荐(0) 编辑
摘要: 突然发现又有好久没有写技术blog了,主要原因是最近时间都用来研究libav去了(因为api极类似ffmpeg,虽然出自同一份代码的另外一个分支,因项目选用libav,故下文均用libav代替),其实要从知道这个库的时候已经很久了,早在加入avplayer开源社区的已经略有耳闻,看着他们讨论我却一... 阅读全文
posted @ 2014-07-01 18:11 重庆Debug 阅读(4593) 评论(2) 推荐(0) 编辑
摘要: 最近一段时间在编译Android 的source code的部分工作,网上的许多资料都废话太多,下面是我将其精简出来的版本。(我的编译环境是 ubuntu linux 12.04 64bit)首先需要安装一些依赖环境:(http://source.android.com/source/initializing.html)一、配置环境根据我这种环境需要执行的命令有:$ sudo apt-get install sun-java6-jdk$ sudo apt-get install git gnupg flex bison gperf build-essential \ zip curl lib. 阅读全文
posted @ 2013-12-05 15:41 重庆Debug 阅读(2606) 评论(0) 推荐(0) 编辑
摘要: how to set html format string to clipboard copy clipboard to memory 阅读全文
posted @ 2013-10-19 17:32 重庆Debug 阅读(2137) 评论(0) 推荐(0) 编辑
摘要: 伯乐在线编注:这篇文章综合了两位博主(wallwind和DoEver)对一则故事的感触,这则故事出自张锦喜的一本职场书:《挖一口属于自己的井》。两个和尚的故事两个和尚住在隔壁,所谓隔壁就是隔壁那座山,他们分别住在相邻的两座山上的庙里。两座山之间有一条溪,这两个和尚每天都会在同一时间下山去溪边挑水,久而久之,他们便成为了好朋友。就这样,时间在每天挑水中不知不觉已经过了5年。突然有一天,左边这座山的和尚没有下山挑水,右边那座山的和尚心想:“他大概睡过头了。”便不以为意。哪知道第二天左边这座山的和尚还是没有下山挑水,第三天也一样。过了一个星期还是一样,直到过了一个月,右边那座山的和尚终于忍不住了,他 阅读全文
posted @ 2013-09-10 13:37 重庆Debug 阅读(1301) 评论(1) 推荐(0) 编辑
摘要: 我们知道实现C++和Javascript通讯有下表5种接口: 引擎编写语言API接口C、C++与JavaScript交互(变量、函数、类)vc2005编译静态库的大小示例EXE的大小执行、解析JavaScript的速度Google V8C++C++可以23.1M1.1M最快Firefox3.5以前 SpiderMonkeyCC可以1.3M500K慢Firefox高版本SpiderMonkeyC++C可以15.3M1.7M一般Webkit JavaScriptCoreC++C可以26.2M1.4M一般IE未知COM可以未知100K(没有链接库)一般IE的Trident引擎是非开源的,... 阅读全文
posted @ 2013-09-09 10:06 重庆Debug 阅读(2092) 评论(0) 推荐(0) 编辑
摘要: 本来是一件很简单的事情,就是将View上使用OpenGL画出来的数据生成图片让其实现打印的功能,我们知道MFC提供打印的接口是不支持OpenGL的(至少我不清楚),必须将它转成GDI再画在Print的pDC上。OpenGL一直都有一个函数名字叫:glReadPixels,它能read a block of pixels from the frame buffer,但是谁都没想到它竟然转换成CImage竟然是这样的规则。http://www.opengl.org/sdk/docs/man/xhtml/glReadPixels.xml中说到:Specify the window coordinat 阅读全文
posted @ 2013-08-12 10:03 重庆Debug 阅读(2040) 评论(0) 推荐(0) 编辑
摘要: 在调试公司项目代码的时候,有一个系统设置的功能,里面需要从注册表中去读取数据,因为使用了MFC框架所以,为了简化代码直接使用了CWinAppEx::GetString 、CWinAppEx::SetString、CWinAppEx::GetInt、CWinAppEx::SetInt等等框架内函数,因为使用它之间只需要SetRegistryKey(_T("Application Name"));设置一下就好了,远比自己调用win32 API或者CRegKey类用起来方便多了。发现一个GetString的在实现的时候有一个bug,起初是我在读取一个注册表String时发现,CW 阅读全文
posted @ 2013-08-07 13:41 重庆Debug 阅读(1596) 评论(0) 推荐(0) 编辑
摘要: 因为公司的个项目最近开始写MFC了,又遇到一个坑爹的问题,使用的View视图模式在VS2010中创建的工程,默认就带入了许多的Style,例如Office 2007的许多漂亮样式确实很方便,但是同样也会造成一些字体模糊问题(见下图),后来整了半天才解决,特此做个记录。首先这确定是MS的Bug,http://connect.microsoft.com/VisualStudio/feedback/details/505466/mfc-visual-style-font-size-too-small-to-display-chinese-character-clearly-on-windows-xp 阅读全文
posted @ 2013-07-23 15:28 重庆Debug 阅读(1650) 评论(0) 推荐(0) 编辑
摘要: 因为初次接触OpenGL,图形学也后悔当初在学校没有认真学,隐约记得教授当时讲过图像变形的问题,而且我的bitmap也是2的N次方:16*16的,在网络上找到的大多都是一句话:“视口的纵横比一般和视景体的纵横比相同,若不同则当图像投影到视口时就会变形。”太奇怪了,如果说是因为视口和是视景的比例不同的话,应该也会是图像全部是同样的变形啊,实际上是同一个层级下,不同的icon会不同的扭曲!无语了。。难道这个实现不了就不能让用户放大地图到某一个层级了吗?有没有OpenGL大神能否救救我这个可怜的。。。 阅读全文
posted @ 2013-06-21 17:25 重庆Debug 阅读(1959) 评论(0) 推荐(0) 编辑
摘要: 因为公司的原因需要很多数据处理的功能,某些功能需要在网页上进行操作,因此很多情况不能使用桌面版C#、C++、Air程序来实现,对于javascript这一块我又不想重复造轮子,找了找JQuery又发现很多plugin功能不是我想的功能太符合。终于在某一个机缘下发现了ExtJS这个好框架,首先就被它里面的example所折服,功能看起来比Flex里面的还强大很多,很多功能在Flex中是需要重写的很多控件才能实现的,在ExtJS中都是原生就带了只需要设置一个属性就可以了的。从此我就下定决心所有页面多的需求和功能变态的需求尽量都用ExtJS来尝试。但是实际学起来可没有想象中的那么容易上手哎,全部都是 阅读全文
posted @ 2013-06-16 15:12 重庆Debug 阅读(1408) 评论(0) 推荐(1) 编辑
摘要: 最近公司有个小任务,需要做一个排程并且能有一个页面显示所有用到的服务状态。排程程序我当然是用python在最快之间内就完成了,剩下来的就是显示网页部分,我这个人不甘随便弄一个最基本丑陋的网页凑合着来显示,当然也可以用MVC架构的后台脚本框架来view产生网页,但是我偏不想这样做,原因有几点:1、页面实时更新不方便,整个页面都要刷新,用户体验差。2、布局不方便,不如单独写一个html页面用ajax更能够专心的编写页面。3、对ajax不是很熟练,正好借这个机会锻炼一下。实际开发中我采用了几个库:jquery、jquery-ui、google jsapijquery主要用来控制DOM的,jquery 阅读全文
posted @ 2013-05-30 23:04 重庆Debug 阅读(1161) 评论(0) 推荐(0) 编辑
摘要: 记不住是在哪一篇文章上看到flash player 11之后支持3d,并且是使用显卡来绘制,速度相当可观,我身为"flex铁杆粉丝"的程序员怎么能不尝试一下呢?立马试之。。1、首先从官方网站上下载了http://away3d.com/的swc库文件,并且另外下载了example的zip文件2、创建一个actionscript项目(我吃亏在这里,创建的是Flex项目,查看了很多教程都没有说清楚这个,唉)3、将目录下的/away3d-examples-fp11_4_1_1_Beta/ 所有文件、文件夹拷贝到刚刚创建的actionscript项目中4、然后选中一个as例子程序设置 阅读全文
posted @ 2013-05-17 16:27 重庆Debug 阅读(824) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示