精华内容
下载资源
问答
  • 一致变量

    2015-07-26 21:19:08
    一致变量 原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载) Background 在本教程中我们将接触到一新的着色器变量类型——一致变量。属性变量与一致变量之间的区别:...

    第五课 一致变量

    原文地址:http://ogldev.atspace.co.uk/(源码请从原文主页下载)

    Background

    在本教程中我们将接触到一个新的着色器变量类型——一致变量。属性变量与一致变量之间的区别:属性变量包含顶点特性数据所以每次调用shader都会从顶点缓冲区中重新导入新的数据,而一致变量中的值在整个绘制过程中都保持不变。这意味着我们在绘制过程之前就为一致变量赋值并且在顶点着色器的每次调用中都可以访问这个相同的值。一致变量对于保存光照参数(光源位置和光照方向等),变换矩阵、纹理对象句柄等都是非常有用的。

    在此教程中我们最终实现的功能是使某些东西在屏幕上不停的运动。要实现这个功能,我们需要使用一个一致变量和GLUT库提供的idle回调函数,一致变量的值在每一帧中都会被改变。问题在于GLUT并不会反复调用我们的渲染回调函数——除非它不得不调用。GLUT只有在如下列事件发生时才会强制调用渲染回调函数:最大化或者最小化窗口、被另一个窗口遮挡,遮挡窗口移除等。如果我们在程序运行之后对窗口的布局不做任何变化则渲染回调函数只会调用一次。你可以通过在渲染函数中添加一个打印函数来验证,你会看到打印函数只执行一次,如果你将窗口最大化或者最小化你可以发现打印函数会再次被执行。在GLUT中只注册一个渲染回调函数对于前面的教程来说是合适的,但是现在我们想要不断的改变变量的值,要实现这个功能我们需要注册一个idle回调。Idle函数会在窗口系统未接收到事件的时候被GLUT调用,你可以为idle回调函数设计一个专用功能函数用于做一些与时间更新类似的记录工作,或者简单的将渲染回调函数注册为idle回调函数即可。在本教程中我们直接将渲染函数注册为idle回调函数并且在渲染函数中对一直变量进行更新。

    Code Walkthru

    glutIdleFunc(RenderSceneCB);

    这里我们将渲染函数注册为idle回调函数,需要注意的是如果你想使用一个专用的idle回调函数那么你就需要在函数的最后调用glutPostRedisplay()函数,否则idle函数会被一次又一次的重复调用但是渲染函数却不会被重复调用。glutPostRedisplay()将当前窗口标记为需要重新显示而且在GLUT的下一次仿真循环中渲染回调函数会被再一次调用。

     

    gScaleLocation = glGetUniformLocation(ShaderProgram, "gScale");
    assert(gScaleLocation != 0xFFFFFFFF);

    在对shader程序对象进行链接之后我们需要从shader程序对象中获取指向一致变量的地址。这是C/C++应用程序执行环境需要映射到shader执行环境的另一个例子。当你编译shader程序时GLSL会自动为每个一致变量分配一个索引,在shader内部编译器就是通过索引来解决变量的访问问题的。通过使用程序对象句柄和变量的名字来调用glGetUniformLocation函数,应用程序同样可以获取这个索引,如果出现错误的话,这个函数会返回-1。所以错误检查是非常重要的(正如我们上面通过调用assert函数一样)否则更新之后的变量就不会被传递到shader中去。调用这个函数失败的原因有两个:其一是你弄错了变量名,其二是变量被编译器优化掉了。如果GLSL编译器发现变量在shader中并没有被使用,则编译器会将其剔除。在这种情况下调用glGetUniformLocation函数就会失败。

     

    static float Scale = 0.0f;
    Scale += 0.001f;
    glUniform1f(gScaleLocation, sinf(Scale));

    我们维持一个静态float变量并且在每次调用渲染函数的时候使其值增加一点(如果它在你的机器上运动的太快或者太慢,你可以将0.001改得小一点或者大一点),实际上传递到shader中的值是Scale变量的sin值,这是为了创建一个在-1.0和1.0之间的循环。需要注意的是sinf()使用弧度值而不是角度值作为参数,而在这里我们并没有过多关注这一点,我们只是需要sin函数产生的这个波动值。Sinf()所产生的结果通过glUniform1f函数传递到shader中。OpenGL提供了多个形如glUniform{1234}{if}的函数,你可以使用这些函数将值传递到1D,2D,3D或者4D(由位于glUniform后面的数字确定)向量中,这些值可以是浮点数也可以是整数(由后缀‘i’和‘f’确定)。类似的我们也可以使用向量地址或者矩阵地址作为参数来传递一个向量或者矩阵。这个函数的第一个参数是我们通过glGetUniformLocation()获得的变量的索引地址。

    现在我们可以看看VS中的一些改变(FS没有进行任何改动)。

     

    uniform float gScale;

    这里我们在shader中声明一个一致变量

     

    gl_Position = vec4(gScale * Position.x, gScale * Position.y, Position.z,1.0);

    在每一帧中,我们都让位置向量的X分量和Y分量乘上从应用程序中传入的值。你能解释下为什么三角形总是在旋转正负90度之间循环吗?

    展开全文
  • BOW(Brillant Open Web)团队,是一专门的Web技术建设小组,致力于推动 Open Web 技术的发展,让Web重新成为开发者的首选。 BOW 将依托于【Open Web 开发者】公众号,为大家提供设计、开发、安全等 Web 相关...

    作者 | 百度搜索用户体验中心

    《Web设计指南》分为设计原则、基础规范两方面主要内容,同时会提供相应的实际案例及资源下载。欢迎关注OpenWeb开发者,订阅《Web设计指南》。

    前言

    《Web设计指南》是专门为广大Web内容生态提供一套简单实用的设计指南,目的是提升设计与开发的效率及质量,为广大用户提供优质的用户体验。

    Web内容数以千亿涵盖生活各个方面,除了稳定流畅的浏览,优质的内容及服务,也需要高质量的交互及视觉体验。基于百度新使命以及百度搜索开放的生态特征,我们提供适合第三方的设计指南与直观的案例参照。

    《Web设计指南》会根据Web生态的发展不断更新优化,但是指南中的设计原则仍然相对稳定,具有持久性。设计原则包括:通用一致、简洁清晰、高级精致、智能快捷,本文将为大家介绍通用一致原则。

    通用一致原则

    通用一致的设计,可以减少认知负担带来流畅体验,也可以提升设计及开发效率。
    搜索场景下的Web内容页涵盖生活各个方面,服务于大众用户,同时横跨多种系统和不同尺寸的设备,稳定直观的体验根基于通用一致的设计。根据一定的标准持续复用,才能让用户从陌生到熟悉,建立习惯与信任,这需要在界面布局,视觉风格、图标寓意、功能文案,交互逻辑等方面的通用一致体验。

    通用一致的界面不仅方便于用户,第三方开发者根据自身需求,参考基本设计原则和案例,采用通用的 UI 组件可以提升开发效率,保证页面性能与加载速度。

    当然,通用一致并不是绝对的,绝对的统一会让用户感到重复乏味,有时我们需要特殊的样式,给用户有趣、生动,超出预期的愉悦体验。这部分将在高级精致以及智能快捷原则中讲解。

    设计案例 01

    建议控件采用扁平化风格,充分考虑通用性,类似或相同功能,采用同类交互及视觉样式;通用一致的设计可以提升设计质量和效率。
    这里写图片描述
    这里写图片描述

    设计案例 02

    建议控件的尺寸沿用4pt的倍数使用。例如按钮,输入框,图标等控件,沿用统一的节奏和规则,可以让控件更加通用,提升设计和开发效率,减少对不同尺寸选择的纠结与干扰。
    这里写图片描述
    这里写图片描述

    设计案例 03

    建议通常采用通用样式标题栏,尽可能避免自定义布局、高度和图标样式不一致的标题栏,而采用一致的标准,可以避免重复设计,给用户稳定的体验。
    这里写图片描述
    这里写图片描述

    设计案例 04

    同一控件可能应用多种场景,尺寸,也可能对应多种状态。例如图标的设计统一采用几何化正视图风格,根据需要可以灵活变化填充样式,变化中保持形状的统一,能减少用户认知负担,建立信任。
    这里写图片描述

    设计案例 05

    页面布局采用栅格,能够保证页面版块划分沿用一定的规则,各模块通用一致。我们建议采用12列流式栅格,具体规则详见基础规范的栅格部分。
    这里写图片描述

    Brilliant Open Web

    BOW(Brillant Open Web)团队,是一个专门的Web技术建设小组,致力于推动 Open Web 技术的发展,让Web重新成为开发者的首选。

    BOW 将依托于【Open Web 开发者】公众号,为大家提供设计、开发、安全等 Web 相关知识和案例。同时,也非常欢迎有志于改变世界的你加入我们!

    关注 OpenWeb开发者,回复“加群”,让我们一起推动 OpenWeb技术的发展!

    展开全文
  • 一致性事务 Storm是一分布式的流处理系统,利用anchor和ack机制保证所有tuple都被成功处理。如果tuple出错,则可以被重传,但是如何保证出错的tuple只被处理一次呢?Storm提供了一套事务性组件...

    第五章 一致性事务

    Storm是一个分布式的流处理系统,利用anchor和ack机制保证所有tuple都被成功处理。如果tuple出错,则可以被重传,但是如何保证出错的tuple只被处理一次呢?Storm提供了一套事务性组件Transaction Topology,用来解决这个问题。

    Transactional Topology目前已经不再维护,由Trident来实现事务性topology,但是原理相同。

    5.1一致性事务的设计

    Storm如何实现即对tuple并行处理,又保证事务性。本节从简单的事务性实现方法入手,逐步引出Transactional Topology的原理。

    5.1.1 简单设计一:强顺序流

    保证tuple只被处理一次,最简单的方法就是将tuple流变成强顺序的,并且每次只处理一个tuple。从1开始,给每个tuple都顺序加上一个id。在处理tuple的时候,将处理成功的tuple id和计算结果存在数据库中。下一个tuple到来的时候,将其id与数据库中的id做比较。如果相同,则说明这个tuple已经被成功处理过了,忽略它;如果不同,根据强顺序性,说明这个tuple没有被处理过,将它的id及计算结果更新到数据库中。

    以统计消息总数为例。每来一个tuple,如果数据库中存储的id 与当前tuple id不同,则数据库中的消息总数加1,同时更新数据库中的当前tuple id值。如图:

    强顺序流

             但是这种机制使得系统一次只能处理一个tuple,无法实现分布式计算。

    5.1.2 简单设计二:强顺序batch流

    为了实现分布式,我们可以每次处理一批tuple,称为一个batch。一个batch中的tuple可以被并行处理。

    我们要保证一个batch只被处理一次,机制和上一节类似。只不过数据库中存储的是batch id。batch的中间计算结果先存在局部变量中,当一个batch中的所有tuple都被处理完之后,判断batch id,如果跟数据库中的id不同,则将中间计算结果更新到数据库中。

    如何确保一个batch里面的所有tuple都被处理完了呢?可以利用Storm提供的CoordinateBolt。如图:

    顺序batches

    但是强顺序batch流也有局限,每次只能处理一个batch,batch之间无法并行。要想实现真正的分布式事务处理,可以使用storm提供的Transactional Topology。在此之前,我们先详细介绍一下CoordinateBolt的原理。

    5.1.3 CoordinateBolt原理

    CoordinateBolt具体原理如下:

    • 真正执行计算的bolt外面封装了一个CoordinateBolt。真正执行任务的bolt我们称为real bolt。
    • 每个CoordinateBolt记录两个值:有哪些task给我发送了tuple(根据topology的grouping信息);我要给哪些tuple发送信息(同样根据groping信息)
    •  Real bolt发出一个tuple后,其外层的CoordinateBolt会记录下这个tuple发送给哪个task了。
    • 等所有的tuple都发送完了之后,CoordinateBolt通过另外一个特殊的stream以emitDirect的方式告诉所有它发送过tuple的task,它发送了多少tuple给这个task。下游task会将这个数字和自己已经接收到的tuple数量做对比,如果相等,则说明处理完了所有的tuple。
    • 下游CoordinateBolt会重复上面的步骤,通知其下游。

    整个过程如图所示:

    coordinateBolt

    CoordinateBolt主要用于两个场景:

    • DRPC
    • Transactional Topology

    CoordinatedBolt对于业务是有侵入的,要使用CoordinatedBolt提供的功能,你必须要保证你的每个bolt发送的每个tuple的第一个field是request-id。 所谓的“我已经处理完我的上游”的意思是说当前这个bolt对于当前这个request-id所需要做的工作做完了。这个request-id在DRPC里面代表一个DRPC请求;在Transactional Topology里面代表一个batch。

    5.1.4 Trasactional Topology

    Storm提供的Transactional Topology将batch计算分为process和commit两个阶段。Process阶段可以同时处理多个batch,不用保证顺序性;commit阶段保证batch的强顺序性,并且一次只能处理一个batch,第1个batch成功提交之前,第2个batch不能被提交。

    还是以统计消息总数为例,以下代码来自storm-starter里面的TransactionalGlobalCount。

    MemoryTransactionalSpout spout = new MemoryTransactionalSpout(DATA,new Fields(“word“), PARTITION_TAKE_PER_BATCH);

    TransactionalTopologyBuilder builder = new TransactionalTopologyBuilder(“global-count“, “spout“, spout, 3);

    builder.setBolt(“partial-count“, new BatchCount(), 5).noneGrouping(“spout“);

    builder.setBolt(“sum“, new UpdateGlobalCount()).globalGrouping(“partial-count“);

    TransactionalTopologyBuilder共接收四个参数。

    • 这个Transactional Topology的id。Id用来在Zookeeper中保存当前topology的进度,如果这个topology重启,可以继续之前的进度执行。
    •  Spout在这个topology中的id
    • 一个TransactionalSpout。一个Trasactional Topology中只能有一个TrasactionalSpout.在本例中是一个MemoryTransactionalSpout,从一个内存变量(DATA)中读取数据。
    • TransactionalSpout的并行度(可选)。

    下面是BatchCount的定义:

    public static class BatchCount extends BaseBatchBolt {

            Object _id;

            BatchOutputCollector _collector;

            int _count = 0;

            @Override

            public void prepare(Map conf, TopologyContext context,

                  BatchOutputCollector collector, Object id) {

                _collector = collector;

                _id = id;

            }

            @Override

            public void execute(Tuple tuple) {

                _count++;

            }

            @Override

            public void finishBatch() {

                _collector.emit(new Values(_id, _count));

            }

            @Override

            public void declareOutputFields(OutputFieldsDeclarer declarer) {

                declarer.declare(new Fields(“id“, “count“));

            }

    }

     BatchCount的prepare方法的最后一个参数是batch id,在Transactional Tolpoloyg里面这id是一个TransactionAttempt对象。

    Transactional Topology里发送的tuple都必须以TransactionAttempt作为第一个field,storm根据这个field来判断tuple属于哪一个batch。

    TransactionAttempt包含两个值:一个transaction id,一个attempt id。transaction id的作用就是我们上面介绍的对于每个batch中的tuple是唯一的,而且不管这个batch replay多少次都是一样的。attempt id是对于每个batch唯一的一个id, 但是对于同一个batch,它replay之后的attempt id跟replay之前就不一样了, 我们可以把attempt id理解成replay-times, storm利用这个id来区别一个batch发射的tuple的不同版本。

    execute方法会为batch里面的每个tuple执行一次,你应该把这个batch里面的计算状态保持在一个本地变量里面。对于这个例子来说, 它在execute方法里面递增tuple的个数。

    最后, 当这个bolt接收到某个batch的所有的tuple之后, finishBatch方法会被调用。这个例子里面的BatchCount类会在这个时候发射它的局部数量到它的输出流里面去。

    下面是UpdateGlobalCount类的定义:

    public static class UpdateGlobalCount extends BaseTransactionalBolt

    implements ICommitter {

            TransactionAttempt _attempt;

            BatchOutputCollector _collector;

            int _sum = 0;

            @Override

            public void prepare(Map conf, TopologyContext context,

    BatchOutputCollector collector, TransactionAttempt attempt) {

                _collector = collector;

                _attempt = attempt;

            }

            @Override

            public void execute(Tuple tuple) {

                _sum+=tuple.getInteger(1);

            }

            @Override

            public void finishBatch() {

                Value val = DATABASE.get(GLOBAL_COUNT_KEY);

                Value newval;

                if(val == null || !val.txid.equals(_attempt.getTransactionId())) {

                    newval = new Value();

                    newval.txid = _attempt.getTransactionId();

                    if(val==null) {

                        newval.count = _sum;

                    } else {

                        newval.count = _sum + val.count;

                    }

                    DATABASE.put(GLOBAL_COUNT_KEY, newval);

                } else {

                    newval = val;

                }

                _collector.emit(new Values(_attempt, newval.count));

            }

            @Override

            public void declareOutputFields(OutputFieldsDeclarer declarer) {

                declarer.declare(new Fields(“id“, “sum“));

            }

    }

    UpdateGlobalCount实现了ICommitter接口,所以storm只会在commit阶段执行finishBatch方法。而execute方法可以在任何阶段完成。

    在UpdateGlobalCount的finishBatch方法中,将当前的transaction id与数据库中存储的id做比较。如果相同,则忽略这个batch;如果不同,则把这个batch的计算结果加到总结果中,并更新数据库。

    Transactional Topolgy运行示意图如下:

    transactional topology

    下面总结一下Transactional Topology的一些特性

    •  Transactional Topology将事务性机制都封装好了,其内部使用CoordinateBolt来保证一个batch中的tuple被处理完。
    •  TransactionalSpout只能有一个,它将所有tuple分为一个一个的batch,而且保证同一个batch的transaction id始终一样。
    •  BatchBolt处理batch在一起的tuples。对于每一个tuple调用execute方法,而在整个batch处理完成的时候调用finishBatch方法。
    •  如果BatchBolt被标记成Committer,则只能在commit阶段调用finishBolt方法。一个batch的commit阶段由storm保证只在前一个batch成功提交之后才会执行。并且它会重试直到topology里面的所有bolt在commit完成提交。
    •  Transactional Topology隐藏了anchor/ack框架,它提供一个不同的机制来fail一个batch,从而使得这个batch被replay。

    5.2 Trident介绍

    Trident是Storm之上的高级抽象,提供了joins,grouping,aggregations,fuctions和filters等接口。如果你使用过Pig或Cascading,对这些接口就不会陌生。

    Trident将stream中的tuples分成batches进行处理,API封装了对这些batches的处理过程,保证tuple只被处理一次。处理batches中间结果存储在TridentState对象中。

    Trident事务性原理这里不详细介绍,有兴趣的读者请自行查阅资料。

    参考:http://xumingming.sinaapp.com/736/twitter-storm-transactional-topolgoy/

    http://xumingming.sinaapp.com/811/twitter-storm-code-analysis-coordinated-bolt/

    https://github.com/nathanmarz/storm/wiki/Trident-tutorial

    转载于:https://my.oschina.net/U74F1zkKW/blog/351729

    展开全文
  • 章 数据一致

    2018-08-06 22:45:00
    关系型数据库:强一致性;  NoSQL: CAP原理与 最终一致性。 5.1 更新一致性  在单服务器数据库中,用序列化的方式保证一致性...(不让一读取操作读取到另外一操作的中间结果。)  部分NoSQL数据库不支持...

      关系型数据库:强一致性;

      NoSQL: CAP原理与 最终一致性。

    5.1 更新一致性

      在单服务器数据库中,用序列化的方式保证一致性。

      在集群环境中,数据有多分拷贝,必须要用“顺序一致性”保证所有节点以相同的顺序执行。

    5.2 读取一致性

      关系数据库用“事务”来解决读取一致性的问题。(不让一个读取操作读取到另外一个操作的中间结果。)

      部分NoSQL数据库不支持事务。

      面向聚合的数据库通常支持“原子操作”,但仅限于单一聚合内部。如果把订单、运费、商品全部放入一个订单聚合中,则可以避免“逻辑不一致”

      我们不能把数据都放在一个聚合中,所以在执行影响多个聚合的操作时,会有一段“不一致窗口”,数据最终会一致,叫做“最终一致性”。在数据存在冗余的集群中,这个不一致窗口可能比较长。

      “黏性会话”:保证情况都发到一个节点。

    5.3 放宽“一致性”约束

      事务影响性能,很多数据库弃用事务,放宽一致性需求。

      CAP定理:一致性,可用性,分区耐受性(发生通信故障,导致整个集群被分割成多个无法互相通信的分区时,也就是脑裂,集群任然可用。)

      不一致的问题,一般是可以容忍的,不能完全以来开发,更需要业务领域专家。

     5.4 放宽“持久性”约束

      把一些信息存储到内存中(比如用户会话)以提高相应速度 ,带来的问题是,内存数据可能丢失。             

     

      

        

      

     

    转载于:https://www.cnblogs.com/liufei1983/p/9434023.html

    展开全文
  • 专题:主谓一致

    2020-05-02 21:27:59
    前言: 爱的传递,希望能帮到更多的人。 如果觉得有收获,就点赞吧! 你的鼓励是我创作的最大动力! 目录:前言:
  • 一致性事务 Storm是一分布式的流处理系统,利用anchor和ack机制保证所有tuple都被成功处理。如果tuple出错,则可以被重传,但是如何保证出错的tuple只被处理一次呢?Storm提供了一套事务性组件...
  • Nacos 源码分析() 一致性协议Distro

    千次阅读 2020-05-07 20:33:16
    为临时数据的一致性协议 distro协议的关键点: distro协议是为了注册中心而创造出的协议; 客户端与服务端有两重要的交互,服务注册与心跳发送; 客户端以服务为维度向服务端注册,注册后每隔一...
  • 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网... 一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四定义:1、平衡性(Balance):平衡...
  • NoSQL一致性解决方案  更新一致性,读取一致性,放宽一致性约束,放宽持久性约束,CAP定理,仲裁  先来一案例 Tom和jarry在同一家公司上班,有一天,他们发现公司网页显示的电话有误,于是进入后台系统...
  • CAP, BASE, 最终一致性和分钟原则

    万次阅读 2017-02-16 16:30:34
    分钟法则是内存数据存储的理论依据。这是一切的源头。 CAP     C: Consistency 一致性A: Availability 可用性(指的是快速获取数据)P: Tolerance of network Partition 分区容忍性...
  • 有一种人,明于知己,暗于知彼,又有一种人,明于知彼,暗于知己,他们都是不能解决战争规律的学习和使用的问题的。中国古代大军事家孙武子书上‘知己知彼,百战不殆’这句话是包括学习和使用两阶段...
  • 关键问题的应对策略-续 3.关于微服务对性能的影响 大家可以先思考 2 问题:延迟(latency)和吞吐量(throughout)有什么关系? 延迟是响应时间么? 先说一下延迟和响应时间,延迟是对于服务本身来说...
  • 文章目录使用 Python 合并多格式一致的 Excel 文件一 问题描述二 需求分析三 查阅资料四 编码 使用说明六 总结 使用 Python 合并多格式一致的 Excel 文件 一 问题描述 最近朋友在工作中遇到这样一问题,...
  • 分布式理论()—— 一致性算法 Paxos 前言 Paxos 算法如同我们标题大图:世界上只有一种一致性算法,就是 Paxos。出自一位 google 大神之口。 同时,Paxos 也是出名的晦涩难懂,推理过程极其复杂。楼主在尝试...
  • 整个Zookeeper就是一多节点分布式一致性算法的实现,底层采用的实现协议是ZAB。 ZAB协议介绍 ZAB 协议全称:Zookeeper Atomic Broadcast(Zookeeper 原子广播协议)。 Zookeeper 是一为分布式应用提供高效且...
  • 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决...一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四定义: 1、平衡性(Balance):平衡性是指...
  • 世界上只有一种一致性算法,就是 Paxos。出自一位 Google 大神之口。Paxos 也是出名的 晦涩难懂,推理过程极其复杂。 Paxos 有点类似之前说的 2PC,3PC,但是解决了这两种算法各种硬伤。该算法在很多大厂都得到了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,183
精华内容 1,673
关键字:

五个一致