初始化巴西渲染器器- - - - - - -...

您所在的位置: &
使用Rave实现数据可视化
使用Rave实现数据可视化
数据可视化技术是大数据时代数据分析的重要环节,良好的数据可视化实现可以让用户高效的发现数据中的商业价值并带来更好的用户体验。采用良好的数据可视化引擎是数据可视化成功实现的关键,由 IBM 开发的 Rave 是一种优秀的数据可视化引擎。读者可以通过本文了解 Rave 的实现背景及架构,重点介绍 Rave 的图形表示语言与编程接口。
数据可视化是大数据时代的重要技术,被认为是大数据实现的&最后一里&,良好的数据可视化实现可以让用户在海量的业务数据中高效的发现商业价值。数据可视化引擎为数据可视化的实现提供了图形的展示与交互功能,目前业界有很多成熟的数据可视化引擎,如 Dojo charting、Google Viz 等。
Rave,即 Rapidly Adaptive Visualization Engine 是由 IBM 在 Grammar of Graphics 项目的基础上开发的通用数据可视化引擎,可以在多种平台上实现任意的图形表示以及交互功能。Rave 目前已经应用在 IBM 的 Cognos、SPSS、Tivoli 等产品上,被证明可以很好地满足用户多样化的商业及科学研究可视化需求。
本文主要介绍 Rave 的特性,图形描述语言以及编程接口,&读者通过本文可以了解如何使用 Rave 实现数据可视化以及使用 Rave 的优势。
为什么选择 Rave
实现数据可视化是十分复杂的问题,可视化的需求来自科学研究、金融、零售、社会学等诸多领域,不同的业务需求催生了复杂的图形表示,而传统可视化引擎的图形类型是固定的,不能够按照用户需要快速灵活的增加新图形。另外,数据可视化的结果需要展现在不同的平台上,包括桌面客户端、Web 页面以及不同的移动平台。而传统的可视化引擎往往只支持一种或少数几种平台,不能满足使用户通过多种设备访问数据分析结果的需求。
Rave 能够很好的解决上述问题,为用户提供强大而灵活的数据展示能力。
Rave 没有提供任何内置的图形类型,而是提供了一种基于 JSON 语法的图形表示语言,通过定义一系列可组合的特性集来描述所需的图形。例如,饼图的描述可以分解为切片定义、切片堆积、外观和标签定义这几个部分的集合。由表示语言描述的图形定义(Specification)文件称为 vizJSON 文件。JSON 技术为 vizJSON 提供了极大的灵活性:JSON 是 JavaScript 的原生格式,可以通过 JavaScript 代码直接操作;JSON 是基于文本的数据交换格式,方便用户编辑。用户通过编写 vizJSON 文件就可以设计出满足需求的图形,而不再限制于已经设计好的图形库。Rave 理论上可以支持无限种类的图形。
Rave 通过一套特殊的代码生成机制实现跨平台的数据可视化。Rave 引擎的核心代码基于 Java,但是通过代码生成机制可以在构建时将通用的 Java 代码转换成 JavaScript 代码,Object-C 代码以及 Android 平台上的 Java 代码,继而生成可以在 PC 桌面、Web 浏览器以及移动设备 (iOS 或 Android) 等不同环境下运行的图形引擎版本。VizJSON 经过 Rave 引擎生成可以渲染成最终图形的场景树(Scene Tree):在Web浏览器中,场景树需要 Dojo 的 GFX 库进行渲染,而 PC 桌面或移动环境则由 Rave 自身的 Renderer 程序处理。因此,vizJSON 是平台中立的,同一个vizJSON可以在不同的环境下生成一致的图形。Rave 的基本架构如下图所示:
图 1. Rave 架构图
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="图 1. Rave 架构图" src="/wyfs02/M00/2A/CD/wKioL1OFkEHi1V85AABJOrRUAKs592.jpg" width="544" style="margin: 0 padding: 0 border: 0 outline: 0 font-size: 13 vertical-align: font-family: Arial, sans- line-height: 15.563" />
Rave 提供了不同平台使用的版本和相应的编程接口(API),包括适用于 Web 应用的 JavaScript API,适用于 iOS 设备的 Object-C API 以及适用于 Android 设备的 Java API,满足用户在不同环境下使用 Rave 的需求。本文以下将主要分析如何在 Web 应用中使用 Rave 实现数据可视化。
如何在 Web 应用中使用 Rave
Rave 提供了在 Web 浏览器中使用的发行版本以及相应的 JavaScript 编程接口,使用户可以在 Web 应用中使用 Rave 进行数据的可视化展示和交互。用户可以从 IBM 官方网站上下载 Rave 的&,其代码压缩版本仅 680KB, 十分适合 Web 应用加载。Rave 需要依赖 Dojo 的 GFX 库实现跨浏览器的图形渲染,图形操作以及图形交互,所以在 Rave 的 Web 发行版中包含两个子目录:dojo 和 rave。dojo 子目录包含当前 rave 支持的 Dojo 版本(目前是 Dojo1.80)。Rave 子目录包括三个部分:实现核心功能的 main.js 文件,提供国际化支持的 nls 子目录以及提供 vizJSON 模式(schema)文件的 resources 子目录。
Rave 的代码组织基于 Dojo 的 AMD ( 异步模块定义 ) 机制,实现为一系列封装良好的模块,不同模块代码通过构建(build)工具连接并压缩成为一个单独的 js 文件(即 main.js,AMD 称其为层 layer),减少了加载 Rave 时的请求数目。此外,AMD 机制保证了 Rave 各模块的异步加载,仅加载所需的模块以及其依赖模块,不需要的模块则不会被加载,减少了 Rave 的加载时间。用户在自己的 Web 应用中可以通过 Dojo 的 require 接口加载 Rave 的 main.js 文件以及应用所需要的各模块。另外,由于 Rave 依赖 Dojo,所以用户程序需要首先加载 Dojo 库文件。
在 Web 浏览器环境下,Rave 可以指定使用不同的渲染器进行图形渲染,包括 canvas、 SVG、Silverlight 以及 VML 等,不同的渲染器与支持的浏览器类型及版本的对应关系如下:
表 1. 渲染器与浏览器的对应关系表
浏览器版本
FF17 ESR, Chrome24
IE9, IE10, Chrome24, FF17 ESR,
Safari 6.x
Silverlight
在加载 Dojo 和 Rave 时,用户需要设置 Dojo 的 data-Dojo-config 配置对象,通过其 gfxRenderer 属性指定 Rave 使用渲染器的优先顺序,保证 vizJSON 描述的图形可以被不同的浏览器所渲染,配置示例如下:
清单 1. 渲染器配置示例
&&type=&text/javascript&&src=&../js/Dojo/Dojo/Dojo.js&&data-Dojo-config=&async:true,&paths:{'com':'../../rave/com',&&&&&'resources':'../../rave/resources'},gfxRenderer:&'canvas,svg,silverlight'&&&&
加载和配置 Rave 之后,用户就可以在 Web 应用中使用 Rave 提供的所有功能实现数据可视化。以下将简要介绍如何使用 Rave 的 JavaScript API 以及如何通过 vizJSON 设计可视化图形。
如何使用 Rave 的 JavaScript API
Rave 的 JavaScript API 提供了 Dojo 控件(widget)VisControl,作为用户的 Web 应用程序调用 Rave 的核心接口。VisControl 是使用 Rave 实现数据可视化的首要对象,使用 Rave 的任何功能之前都必须首先创建 VisControl 对象,然后由 VisControl 对象调用其他对象协作完成可视化图形的渲染和交互。VisControl 对象提供了大量可供用户程序调用的方法,主要方法示例如下:
表 2 . visControl 对象方法列表
setSpecification
渲染由 vizJSON 定义的图形
setSpecificationFromJson
从流中读取 vizJSON 并渲染
setSpecificationFromUrl
从 URL 中读取 vizJSON 并渲染
setSpecificationValidation
验证 vizJSON 模式的正确性
initRenderer
返回 Dojo.Deferred 对象,确保控件可以开始渲染
getInteractivity
返回 interactivity 对象,获取图形的信息
setBaseURI
设置字符串作为访问外部资源的根路径
根据 bounds 对象调整图形的大小
使用 VisControl 对象创建可视化图形十分便捷,首先需要创建 VisControl 对象的实例:VisControl 本身实现为一个 Dojo 控件,可以通过 Dojo 的 require 接口加载 VisControl 并实例化,代码示例如下:
清单 2. 创建 visControl 对象示例
&&type=&text/javascript&&//使用嵌套的&requires调用并确保首先加载需要的&main.js&&&&&&require([&rave/main&],&function()&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&require([&com/ibm/init/ready&,&&com/ibm/vis/widget/VisControl&],&function(ready,&VisControl)&{&&&&&&&&//使用&ready方法可以保证&rave可以被正确的加载&&&&&ready(function()&{&&&&&&&&&&&&&&&&&&&&&&&var&widget&=&new&VisControl();&&&&&&&&&&&&&&&&&&&});&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&});&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&});&&&
然后通过 Dojo 的 data-Dojo-type 属性将 VisControl 控件附加给 HTML 页面的元素(如 div),并设置初始大小。
清单 3. 页面元素添加 visControl 控件示例
&data-Dojo-type=&com.ibm.vis.widget.VisControl&&&&&&&&id=&visControl&&style=&width:&600&height:&800&&
最后,创建图形定义的 vizJSON 文件,并将其作为参数传给 VisControl 对象的 setSpecification 方法。setSpecification 方法可以根据 vizJSON 将图形渲染到页面的指定区域:
清单 4. 使用 visControl 对象创建图形示例
&//使用&dijit/registry对象获取&VisControl&&var&visControl&=&registry.byId(&visControl&);&&visControl.initRenderer().then(function(widget)&{&//iniRenderer方法初始化渲染器并等待&widget开始渲染&&//&visControl&根据&vizJSON&绘制图形到&widget&所在区域&&&&&visControl.setSpecification(vizJSON);&&});&
在 VisControl 基础上,Rave 的 JavaScript API 提供了很多对象用以实现更复杂的功能:Interactivity 和 Graph interactivity 对象可以获取和修改图形的属性信息,添加交互行为;RaveEvent 和 RaveListener 对象可以向图形添加事件和相应的监听器;Effect 对象可以改变图形的显示效果;PanZoom 对象可以实现图形在移动设备上的放大缩小功能;Tooltips 对象可以向图形添加描述信息。关于 JavaScript API 的更多信息,读者可以参考 Rave 官方网站上的在线文档。
如何使用 vizJSON 设计图形
使用 Rave 设计可视化图形的核心是 vizJSON,而 vizJSON 通过基于 JSON 语法的图形描述语言,将图形的构成抽象成为可组合的 JSON 属性集合。用户通过编写 vizJSON 文件,精心组织这些属性设计出符合自己分析需求的可视化图形。vizJSON 的主要属性及描述如下:
表 3. vizJSON 属性列表
定义版本信息
description
定义描述信息
localization
定义本地化属性
定义图形的数据
定义图形的结构
定义图形使用的外部资源
定义图形的大小
定义图形的显示风格
vizJSON 中最关键的属性是 data 和 grammar:
data 属性定义一张二维数据表,其中包含了图形需要的所有数据。data 属性有两个主要的 section:域(fields)定义了数据表的元数据,列(rows)定义了实际的数据项。Data 属性还可以通过 Data Provider 对象导入其他文件中的数据(如 CSV、Excel),作为图形的数据源。
grammar 属性定义图形的结构。Grammar 属性有两个主要的 section:elements 和 coordinates。
Elements 定义了组成图形的元素集合,包括元素的类型、位置、外观以及属性信息。Elements 支持的基本元素类型包括点(point)、区间(interval)、线(line)、多边形(polygon)、区域(area)以及角(edge),复杂的图形由这些简单图形元素组合而成。
Coordinates 通过基本的维度(dimensions)和变换(transformations)信息规定了绘制所有图形元素的空间: dimensions 通过轴(axis)和度量(scale)值定义绘图空间的输出维度;transformations 定义图形的变换方法,包括极化(polar)、堆积(stack)、群集(cluster)等,基本图形通过变换可以组成更复杂的图形。
下面例子演示了如何利用 vizJSON 定义柱状图:
图 2. vizJSON 定义的柱状图
498)this.width=498;' onmousewheel = 'javascript:return big(this)' alt="图 2. vizJSON 定义的柱状图" src="/wyfs02/M02/2A/CD/wKioL1OFkEGR9zAtAACq7Lph27A814.jpg" width="752" style="margin: 0 padding: 0 border: 0 outline: 0 font-size: 13 vertical-align: font-family: Arial, sans- line-height: 15.563" />
关于 vizJSON 的更多信息,读者可以参考 Rave 官方网站上&
您可以通过本文了解 IBM 的数据可视化引擎 Rave。本文简述了 Rave 的应用背景,架构以及使用 Rave 实现数据可视化的优势。通过示例阐述了如何在您的 Web 应用中使用 Rave,包括如何加载 Rave,如何使用 API 操作图形以及如何利用 vizJSON 设计满足需要的图形。Rave 作为一款优秀的数据可视化引擎,可以为您轻松地实现跨平台的复杂数据可视化设计。【责任编辑: TEL:(010)】
关于的更多文章
数据可视化是数据分析师进行决策支持的重要手段。在大数据时代,
数据库产品
数据库综合
数据库新闻
维基百科将切换到另外一款开源数据库MariaDB
讲师: 8人学习过讲师: 0人学习过讲师: 3人学习过
PM2.5肆虐着中华大地,令每个中国人呼吸困难。大数据
金融大数据将给中国银行带来极大的转变。它将让银行从
MariaDB是一个向后兼容、替代MySQL的数据库服务器。它
本书从计算机网络安全的概念入手,分析了单机节点、单一网络、互联网络和开放互联网络的基本安全问题,并对计算机网络安全体系架
51CTO旗下网站客户端专题图图层基类。
{} 鼠标在图层中的像素位置。
{Array()} 用户数据,矢量要素。
{Boolean} 该图层是否是基础图层,默认值为 false。可以在构造函数中是通过 options 设置。
构造函数。
抽象方法,可实例化子类必须实现此方法。
销毁图层,释放资源。
在专题图的要素数组 features 里面遍历每一个 feature,当 feature[property] === value 时, 返回此 feature(并且只返回第一个)。
通过给定一个 id,返回对应的矢量要素。
通过给定一个属性的 key 值和 value 值,返回所有匹配的要素数组。
添加专题要素事件监听。
重绘该图层,成功则返回true,否则返回 false。
清除当前图层所有的矢量要素。
从专题图中删除 feature。这个函数删除所有传递进来的矢量要素。 参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature, 如果无法确定 feature 数组,则可以调用 removeAllFeatures 来删除所有feature。 如果要删除的 feature 数组中的元素特别多,推荐使用 removeAllFeatures, 删除所有feature后再重新添加。这样效率会更高。
设置图层的不透明度,取值[0-1]之间。
向专题图层添加额外的高亮显示图形,仅提供添加方法,伴随专题要素(图形)高亮消失自动清除此高亮显示图形。
移除专题要素事件监听 。
Properties
isBaseLayer
{Boolean} 该图层是否是基础图层,默认值为 false。可以在构造函数中是通过 options 设置。
{Array()} 用户数据,矢量要素。
currentMousePosition
{} 鼠标在图层中的像素位置。
Constructor
SuperMap.Layer.Theme
构造函数。
{String} 此图层的图层名。
{Object} 此类与父类提供的属性。
{} 专题图。
destroy: function()
销毁图层,释放资源。
addFeatures
addFeatures: function(
抽象方法,可实例化子类必须实现此方法。
向专题图图层中添加数据 , 专题图仅接收 SuperMap.Feature.Vector 类型数据, feature 将储存于 features 属性中,其存储形式为数组。
{Array()} 需要添加的数据。
removeFeatures
removeFeatures: function(
从专题图中删除 feature。这个函数删除所有传递进来的矢量要素。 参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature, 如果无法确定 feature 数组,则可以调用 removeAllFeatures 来删除所有feature。 如果要删除的 feature 数组中的元素特别多,推荐使用 removeAllFeatures, 删除所有feature后再重新添加。这样效率会更高。
{Array()} 要删除feature的数组。
removeAllFeatures
removeAllFeatures: function()
清除当前图层所有的矢量要素。
getFeatureBy
getFeatureBy: function(
在专题图的要素数组 features 里面遍历每一个 feature,当 feature[property] === value 时, 返回此 feature(并且只返回第一个)。
{String} feature 的某个属性名称。
{String} property 所对应的值。
{} 第一个匹配属性和值的矢量要素。
getFeatureById
getFeatureById: function(
通过给定一个 id,返回对应的矢量要素。
{String} 矢量要素的属性 id。
{} 对应id的 feature,如果不存在则返回 null。
getFeaturesByAttribute
getFeaturesByAttribute: function(
通过给定一个属性的 key 值和 value 值,返回所有匹配的要素数组。
{String} 属性的 key。
{Mixed} 属性对应的 value 值。
Array() 一个匹配的 feature 数组。
setOpacity
setOpacity: function(
设置图层的不透明度,取值[0-1]之间。
{Float} 图层的不透明度,取值范围:[0-1]。
redraw: function()
重绘该图层,成功则返回true,否则返回 false。
{Boolean} 重绘该图层是否成功。
on: function(
添加专题要素事件监听。
支持的事件包括: click、mousedown、mousemove、mouseout、mouseover、mouseup。
{String} 事件名称。
{Function} 事件回调函数。
un: function(
移除专题要素事件监听 。
{String} 事件名称。
{Function} 事件回调函数。
SuperMap.Layer.Theme.addHoverShape
SuperMap.Layer.Theme.addHoverShape = function(
shapeParameters
向专题图层添加额外的高亮显示图形,仅提供添加方法,伴随专题要素(图形)高亮消失自动清除此高亮显示图形。
{} 添加高亮显示文本的目标专题图层,
子类对象,必设参数。
shapeParameters
{} 图形参数对象,决定高亮显示图形,
子类对象,必设参数。 注意:通过本方法添加的图形是高亮图形,所以在指定图形样式时应使用 shapeParameters.highlightStyle,不是 shapeParameters.style。
JavaScript Mapping Library
矢量要素类。该类具有 Geometry 属性存放几何信息, attributes 属性存放非几何信息,另外还包含了 style 属性,用来定义矢量要素的样式, 其中,默认的样式在 SuperMap.Feature.Vector.style 类中定义,如果没有特别的指定将使用默认的样式,
此类用x,y坐标描绘屏幕坐标(像素点)。
destroy: function()
销毁图层,释放资源。
addFeatures: function(
抽象方法,可实例化子类必须实现此方法。
removeFeatures: function(
从专题图中删除 feature。这个函数删除所有传递进来的矢量要素。 参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature, 如果无法确定 feature 数组,则可以调用 removeAllFeatures 来删除所有feature。 如果要删除的 feature 数组中的元素特别多,推荐使用 removeAllFeatures, 删除所有feature后再重新添加。这样效率会更高。
removeAllFeatures: function()
清除当前图层所有的矢量要素。
getFeatureBy: function(
在专题图的要素数组 features 里面遍历每一个 feature,当 feature[property] === value 时, 返回此 feature(并且只返回第一个)。
getFeatureById: function(
通过给定一个 id,返回对应的矢量要素。
getFeaturesByAttribute: function(
通过给定一个属性的 key 值和 value 值,返回所有匹配的要素数组。
setOpacity: function(
设置图层的不透明度,取值[0-1]之间。
redraw: function()
重绘该图层,成功则返回true,否则返回 false。
on: function(
添加专题要素事件监听。
un: function(
移除专题要素事件监听 。
SuperMap.Layer.Theme.addHoverShape = function(
shapeParameters
向专题图层添加额外的高亮显示图形,仅提供添加方法,伴随专题要素(图形)高亮消失自动清除此高亮显示图形。
构造函数。
图形参数基类,此类不可实例化1 void RegisterWinDowClass(HINSTANCE hInstance,std::string className,WNDPROC proc)
WNDCLASS wndC
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hbrBackground = (HBRUSH)::GetStockObject(GRAY_BRUSH);
wndClass.hCursor = ::LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon = ::LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hI
wndClass.lpfnWndProc =
wndClass.lpszClassName = className.c_str();
wndClass.lpszMenuName = NULL;
wndClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC | CS_DBLCLKS;
::RegisterClass(&wndClass);
1 bool InitGlewLib(HINSTANCE hInstance)
RegisterWinDowClass(hInstance,"Fake",MainWinProc);
HWND hWnd = ::CreateWindow("Fake","OpenGL",WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,width,heigtht,
NULL,NULL,hInstance,NULL);
HDC hDC = ::GetDC(hWnd);
HGLRC hRc;
::PIXELFORMATDESCRIPTOR
//memset(&pfd,0,sizeof(pfd));
//pfd.nVersion = 1;
//pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
//pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
//pfd.iPixelType = PFD_TYPE_RGBA;
//pfd.cColorBits = 32;
//pfd.cDepthBits = 32;
//pfd.iLayerType = PFD_MAIN_PLANE;
//int iPixelFormat = ::ChoosePixelFormat(hDC,&pfd);
//if (iPixelFormat == 0)
DestroyWindow(hWnd);
/**************************************************************************
1,注册fake窗口的class,如果和主窗口是同名的class,会使初始化失败
2,选择1号格式索引作为临时索引
3,根据设备上下文创建渲染上下文
4,绑定到当前上下文
5,初始化glew
6,解除上下文绑定,销毁窗口
**************************************************************************/
int iPixelFormat = 1;
if (::SetPixelFormat(hDC,iPixelFormat,&pfd))
hRc = ::wglCreateContext(hDC);
if (::wglMakeCurrent(hDC,hRc))
GLenum retVal = glewInit();
wglMakeCurrent(NULL,NULL);
wglDeleteContext(hRc);
DestroyWindow(hWnd);
return retVal == GLEW_OK;
wglDeleteContext(hRc);
DestroyWindow(hWnd);
DestroyWindow(hWnd);
return false;
1 bool InitOpenGL(HWND hWnd,HINSTANCE hInstance)
if (!InitGlewLib(hInstance))
::MessageBox(NULL,"glew init Error",NULL,MB_OK);
if(!WGLEW_ARB_create_context || !WGLEW_ARB_pixel_format)
return false;
HDC hDC = ::GetDC(hWnd);
PIXELFORMATDESCRIPTOR
//memset(&pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
//pfd.nSize
= sizeof(PIXELFORMATDESCRIPTOR);
//pfd.nVersion
//pfd.dwFlags
= PFD_DOUBLEBUFFER | PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW;
//pfd.iPixelType = PFD_TYPE_RGBA;
//pfd.cColorBits = 32;
//pfd.cDepthBits = 32;
//pfd.iLayerType = PFD_MAIN_PLANE;
/**************************************************************************
1,填充像素格式属性 (缓冲区的初始化)
2,填充上下文属性 (用于设置指定OpenGL版本)
3,根据像素格式属性选择设备上下文合适像素格式索引。wglChoosePixelFormatARB(...)
4,将得到的像素格式索引绑定到设备上下文。SetPixelFormat(...)
5,根据设备上下文,及上下文属性设置创建一个OpenGL渲染上下文。wglCreateContextAttribsARB(...)
6,将渲染上下文与设备上下文绑定 wglMakeCurrent(...)
**************************************************************************/
const int iPixelFormatAttributeList[] =
WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,
// 绘制到窗口
WGL_SUPPORT_OPENGL_ARB,GL_TRUE,
// 支持OpenGL
WGL_ACCELERATION_ARB ,WGL_FULL_ACCELERATION_ARB ,
// 硬件加速
WGL_DOUBLE_BUFFER_ARB,GL_TRUE,
WGL_PIXEL_TYPE_ARB,WGL_TYPE_RGBA_ARB,
WGL_COLOR_BITS_ARB,32,
// 颜色位数32
WGL_DEPTH_BITS_ARB,24,
// 深度位数24
WGL_STENCIL_BITS_ARB,8,
// 模板位数8
WGL_SWAP_METHOD_ARB, WGL_SWAP_EXCHANGE_ARB,
// 双缓冲swap方式直接交换
WGL_SAMPLES_ARB, 4,
// 4倍抗锯齿
const int iContextAttributeList[] =
WGL_CONTEXT_MAJOR_VERSION_ARB,3,
// 主版本号
WGL_CONTEXT_MINOR_VERSION_ARB,3,
// 次版本号
WGL_CONTEXT_FLAGS_ARB,WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB,
int iPixelFormat,iNumF
wglChoosePixelFormatARB(hDC,iPixelFormatAttributeList,NULL,
1,&iPixelFormat,(UINT *)&iNumFormat);
if (!SetPixelFormat(hDC,iPixelFormat,&pfd))
//int error = ::GetLastError();
return false;
HGLRC hRC = wglCreateContextAttribsARB(hDC,NULL,iContextAttributeList);
::wglMakeCurrent(hDC,hRC);
return true;
return false;
阅读(...) 评论()轻量级前端组件框架Vue.js近日发布1.0版本。下面是官方博文翻译:在经历了300+次的提交,8次alpha版本,4次beta版本和2次发布候选,今天我十分骄傲的宣布Vue.js 1.0.0 Evangelion正式发布!十分感谢那些参与到API再设计过程中的贡献者。没有来自社区的支持,那(API再设计)将是不可能的。改进模板语法总而言之,1.0版本的模板语法解决了一些细微的一致性问题并且使得Vue模板更加简洁更具可读性。最引人注目的新特点是v-on和v-bind速记语法: :href=&someURL&&& @click=&onClick&&&当我们使用子组件时,v-on 监听自定义事件并且v-bind可以用来绑定道具。速记法使用子组件十分的简洁。&item-list
:items=&items&
@ready=&onItemsReady&
@update=&onItemsUpdate&&
&/item-list&API整理对Vue.js来说,总的目标是让它适用于更大的项目。这就是为什么我们会放弃许多API,他们是一些难以维护和重构的功能特性,而这些特性会损害维护模式。更快初始渲染1.0版本直接用v-for替换了旧版本的v-repeat。此外还提供了相同的功能和更直观的作用域,当绘制大的列表和表格时v-for提供了高达100%的初始化渲染性能。更强大的工具在Vue.js核心之外也有令人兴奋的事情发生——vue-loader和vueify有以下的主要更新:热组件重载。当一个*.vue组件被编辑,其所有活动实例均可进行热交换且不用重载页面。这意味着在进行一些小的改变时,例如修改样式或者模板,你的应用程序无需完全重载;程序热组件的状态可以被保存,大幅提升开发体验。局部CSS。仅向你的*.vue组件样式标签添加一个局部属性,该组件的模板和最终生成的CSS都会神奇地重写,以保证一个组件的样式仅适用于它本身。最重要地是,在父组件中指定的样式不影响其嵌套的子组件。默认ES2015。JavaScript是不断发展的。你可以用最新的语法编写最简洁清楚的代码。vue-loader和vueify现在显露你的*.vue组件盒之外,无需额外的安装。今天写未来的JavaScript吧!结合vue-router, Vue.js现在不仅是一个库——它为构建复杂的SPA提供了一个坚实的基础。下一步会怎样正如1.0.0通常表现的那样,在可见的未来核心API将继续保持稳定,且库已准备好用于生产使用。未来的发展将集中于:升级vue-router使之成为真正的产品。简化开发者体验,例如一个用于搭建Vue.js项目和组件的更好的devtool和CLI。提供更多的学习资源,如教程和实例。Vue.js官方网站:译者简介王飞,从事于移动互联网开发,Android工程师,好读书,尤好文史。本文为CSDN原创,请点击阅读原文查看完整文章并参与讨论如果您喜欢这篇文章,请点击右上角…将本文分享给你的朋友 
 文章为作者独立观点,不代表微头条立场
的最新文章
Rust一直在国外蓬勃的发展,只是国内应用案例较少,很多研究者只是出于兴趣的阶段。日前,来自系统级编程语言Rust官方的消息,Rust 1.5来了。没抢过火车票,你并不能意识到自己见识少!年关将至,12306又迎来了购票高峰,而近期其登录验证系统也成为了网上热门的恶搞素材,网友直呼:“购票验证码简直要把人逼疯了!”今年6月份,Tittle已是一起写创始人、CEO的蔡建对外正式发布了他们的产品——“一起写”。这款被媒体称为中国版Google Docs的产品究竟是什么样的一款产品?背后有什么故事?就此,CSDN采访了一起写创始人&CEO蔡建。中国工程院院士高文带来了名为“多媒体大数据分析与搜索”的主题演讲,深度剖析媒体大数据的存不下、看不清、找不到的三大技术挑战问题,以及解决方案。大家可以通过阅读本文,学习关于PHP7.0的五个方面的内容:PHP7.0简介、主要新特性、过去几周关于程序员是否采用php7.0的意愿调查结果、以上调查结果的分析、以及对PHP未来版本的期待。日,作为大数据领域规模最大、最具影响力的IT盛会,2015中国大数据技术大会(BDTC 2015)在北京新云南皇冠假日酒店盛大开幕。科技巨头将内部产品发布到开源社区,这可是相当时髦的举动,现在他们带着免费的午餐姗姗而来。用户通过Deep Linking点击某个链接之后,可以跳过网页,直接打开另一个应用中的相关内容页面。Deep Linking可以让用户在各应用间无缝跳转,不仅能带来更好的移动交互体验,更有助于提高新用户的转化率。一转眼,2015年马上就要过去了,但是数数自己这一年的成果,进步仿佛又很少。对于一个热爱云计算技术的开发者来最近“增长黑客”(growth hacker)渐成整个行业热议的话题。特别是在经济寒冬来临、创业热潮不退的大环境下,如何以最高的投入产出比谋求公司的增长,成为初创公司乃至已具备一定体量的大公司都在深刻思考的问题。我全程参加了“新一代数据库技术论坛”,随着互联网的普及,很多互联网企业都经历了海量并发之痛,根据CSDN权威发布的《2015年中国软件开发者白皮书》,今年大家最关心的数据库功能就是“并发处理能力”……最近基于数据的自然语言对话技术取得了突破性的进展。我们发现,利用深度学习和大数据,可以很容易地构建一个单轮对话系统,自动生成对话,并且取得惊人的好效果。Moxtra是一家总部位于硅谷的创新公司,致力于为企业提供一站式的移动协同解决方案,为行业应用提供嵌入式协同SDK。在Barcelona举行的DockerCon Europe 2015会议上,将推出面向IT企业的容器平台的新项目ContainerX测试版。它是为IT企业用户管理使用设计的即用型容器基础设施平台,开发者可以通过Docker命令行访问该平台。在10月底举办的OpenStack东京峰会期间,记者有幸见到了首次面对中国媒体的英特尔公司软件与服务事业部(SSG)副总裁、英特尔开源技术中心总经理Imad Sousou,并对他进行了深入的访谈。对3D Touch研究和把玩了一番,我着实被惊艳到了。就像当初iOS 7在通知中心里添加了 “Today”组件一样,所有人几乎是本能地觉得3D Touch很有用,只是还不知道如何将其发挥到极致,所以不断尝试和摸索。中小创业团队要想提高团队工作效率,借助一些适合自己的团队协作类工具是非常必要的。然而有些团队协作工具生来就是为大公司服务的,并不适合中小团队。如果你身在中小团队中,究竟该选择哪款团队协作工具呢?游戏开发人员面对的往往是一个长期持续演进的软件产品,新加入的内容不仅导致愈加复杂的逻辑实现,同时由于需要更多的纹理绘制,仿真计算,也带来了内存消耗的增加和性能的下降。imo在PC端IM领域有很强的积累,但在做移动端时遇到了不少的挑战。在移动端相对恶劣的运行环境加上企业IM的过去一年,业务增长迅猛,架构不断改进,但我却看不清楚架构未来的样子,经过思考悟出一些简单的道理,架构是为业务去年此时,W3C定稿了HTML5。我曾发表一篇文章《HTML 5终于定稿,为什么原生App世界将被颠覆》,这11月21日,为期三天的SDCC2015中国软件开发者大会成功闭幕。今年的大会规模和质量都再创新高,主办方总【CSDN现场报道】-21日,由CSDN重磅打造的“ 2015 中国软件开发者大会”(以随着移动互联网的迅速发展,传统客服系统的弱点逐渐暴露,客服人员与用户之间的沟通成本偏高,不能通过多渠道有效沟【CSDN现场报道】-21日,由CSDN重磅打造的“ 2015 中国软件开发者大会”(以给你12小时,你会做什么?看一本书,一次短途旅行?现在,大数据处理平台—Linux on Power,邀请你【CSDN现场报道】-21日,由CSDN重磅打造的“2015 中国软件开发者大会”(以下软件开发主力军虽以85后为主,但是程序媛的比例逐渐递减,仅占8.2%,猿君为此你作何感想?调查显示,从业岗位-21日,由CSDN重磅打造的“2015 中国软件开发者大会”(以下简称SDCC 201给你12小时,你会做什么?看一本书,一次短途旅行?现在,大数据处理平台—Linux on Power,邀请你徐磊——一名写了十几年代码但还没写够的程序员,1999年,他本科毕业于北京理工大学工业管理专业和计算机专业;【编者按】对于企业来说,前途未卜的改变往往很难发生,就像航海一样,重复的往往是久经验证的安全航线,这点在De美国TMC主办的WebRTC大会一直是全球实时通信技术最具影响力的行业大会,今年我们在中国见到了它的面孔。1CSDN年度技术盛宴
“SDCC 2015中国软件开发者嘉年华”将于-21日在北京召开【导读】前端时间,一篇“从产品经理的角度算一算,做个App需要多少钱”的文章在网上疯传,可见大家对互联网创业CSDN年度技术盛宴 “SDCC 2015中国软件开发者嘉年华”将于-21日在北京召开。企业软件市场势必成为新热点—— Gartner在最近一份报告中称:企业今年在应用上的花销将增至1499亿美元【编者按】本文来自《程序员》电子刊1511A期封面报道,介绍传统企业IT应用架构基于OpenStack云化的马如悦,百度大数据部主任架构师,负责百度分析型数据库方向和在线数据服务架构方向。 在大会召开前夕,笔者有幸采今年的11月2日是乔治·布尔诞辰200周年纪念日。在现今的电子世界中,我们经常会听到一个叫“布尔”变量的词—CSDNnewsCSDN精彩内容每日推荐。我们关注IT产品研发背后的那些人、技术和故事。热门文章最新文章CSDNnewsCSDN精彩内容每日推荐。我们关注IT产品研发背后的那些人、技术和故事。

我要回帖

更多关于 巴西渲染器 的文章

 

随机推荐