1、stroke properties(描边)
当你用手指或者笔尖在屏幕上移动时,procreate 使用很多点进行绘图描边。此选项由两个模块构成:描边属性(stroke properties),描边锥度(stroke taper)
a、描边属性主要分为间距,流线,抖动,掉落四个选项,主要对线从整体进行控制。
间距:间距是每个点之间的距离,间距越大,你的笔刷中的间隔越大。间距调到最大,你可以清晰的看到你的画笔中具体的形状。
流线:流线可以使你的描线更稳定,曲线转折更精准。值越高,曲线越平滑。
抖动:抖动可以理解为线中的每一个点相对于原点,位置发生偏移。抖动与画笔的形状的距离有关,将会对曲线的每一个点进行偏移处理(上下偏移),值越小,线越平滑,值越大,将会平铺形状,直到超出边界。
掉落:影响所有画笔一次画线的长度。值越大,可画线的长度越短。(可以理解为对当前画笔进行截取,只保留前端某部分)
b、描边锥度
描边锥度主要对笔刷的笔尖宽度,透明度等进行调整。主要分为压力锥度(相对于pencil)和触摸锥度(相对于手指)两种。此处只对压力锥度进行说明,触摸锥度选项同压力锥度相同。
压力锥度可以对如下选项进行调整:数量,尺寸,不透明度,压力,尖端,尖端动画。
数量:有两个滚动栏,分别可以控制线的头部和尾部锥度的数量,点击链接按钮,可以对头部和尾部进行同步调整。(此处可以理解为线头部尾部的线条上点的数量,点越多,线头越粗)
大小:调整笔尖的粗细
透明度:调整笔尖的透明度
压力:调整笔间的压力,压力越大,笔尖越细
尖端:值越大,笔尖越圆
尖端动画:这个开关控制什么时候应用笔间锥度。开关关闭,意味了笔离开画布,程序对尾部进行处理。开关打开,procreate 将使用pencil预测你画画的停止点,并应用。
2、shape setting(形状设置)
一个形状就相当一个印章,在一次描边中你选择的图片将会重复印到线条中。你也可以认为边是颗粒的容器。(简而言之,形状就相当于线条中的一个点,可能是圆形,也可能是各种形状)
形状主要分为3个模块去设置:形状行为,形状属性,形状筛选
a 形状行为
散布:当你在画一笔的过程中,散布选项可以改变你笔刷中每一个形状的朝向。值越高,笔刷将会给人一种混乱,粗糙的感觉。值越低,越有序平滑。散布不会改变笔刷的方面。
旋转:旋转选型影响你的笔刷中每个形状对方向的转变。旋转选项有三点:100%全部反转(使形状和画画的方向完全相反),静止(维持不变),跟进描边(和你画的方向保持一致)
b 形状属性
随机化:当关闭——初始形状方向基于当前起笔的方向。当开启——每一次起笔方向都不相同。
方位:方位被使用于使用笔时,笔刷的方向保持一致,开启后,使用apple pencil从同一角度绘制时,形状相同。
c 形状筛选
无:关闭筛选选项,图片将会变得有棱角和粗糙
经典:从早期procreate 版本中进行模仿
已改进:对形状的锯齿进行优化
3、颗粒设置(grain settings)
a 颗粒行为
移动:当设置为印章(移动为0%),颗粒纹理不会滚动,它将会填充纹理。当设置为滚动(移动100%),颗粒将会重复平铺。(其实我也不太懂,此处作用可以参考procreate 中的纹理>网格笔刷理解)
缩放(百分比):调节颗粒纹理的大小
缩放(跟进尺寸):当设置为跟进尺寸,颗粒将和你笔刷大小同步缩放。当设置为已裁剪,颗粒将被锁住,颗粒大小不随笔刷大小同步缩放。(此处可以理解为调节笔刷大小,是否颗粒大小也同步变化)
旋转(百分比):颗粒旋转和颗粒移动很相似,这个设置将会基于笔刷方向填充颗粒。旋转滚动条有如下主要三点。100% inverse (全部反转)/staic(固定)/follow stroke(同向),使颗粒方向和笔刷相反/固定不变/同向。
b 颗粒筛选
无:禁用筛选,使颗粒的边缘锐化。
经典:模仿早期procreate 的版本
已改进:减少笔刷颗粒的锯齿,使变得平滑。
4、动态设置(dynamics settings)
a 画笔渲染
每个笔刷渲染选项都影响你笔刷的所有行为,分别提供不同的动态设置。
正常(没有动态设置)釉面(当被选中时,你的笔刷将会设定为某一透明度,你可以调整透明度)
累积:透明度累加
流程(Flow):控制透明度大小
湿混(此模式使你的笔刷看起来有水彩的感觉,你可以通过很多设置去调整稀释度)此处的翻译有点奇怪,不造软件为啥这样翻译。(用的是软件的翻译)
稀释:调整颜色的深浅(同水彩笔一样,稀释后,颜色变浅)
支付(控制)(Charge):控制笔头及整体的透明度(此处有小伙伴说翻译不太准确,这块用的是软件上显示的值,虽然个人也觉得怪怪的,我觉得可以用控制这个词)
攻击(压触)(Attack):和pencil相关,主要控制笔的压力和透明度的关系。(此处翻译同上)
拖拉长度(pull):控制笔刷尾部的透明度。高pull 和低 charge 类似于涂抹的效果。
等级:控制笔刷边缘的锐度
b 不透明度动态
速度(opacity speed):透明度将取决你画画的速度
抖动(opacity jitter):控制颗粒的透明度
c 尺寸动态
速度(size speed):大小取决你画画的速度
抖动(size jitter):控制颗粒的大小
5、pencil
根据你的需求调整pencil,如果你使用第三方笔,你的笔尖压力也可以调节大小和透明度。只有apple pencil可以设置倾斜度。
a apple pencil 压力
尺寸(pressure size):当设置为0时,笔刷不会随笔触压力改变,当设置为最大值,压力越大,笔尖越粗。当设置为-100%,压力越大,笔尖越细。
不透明度:当设置为0时,笔刷将不会随笔触压力改变。当设置为最大值时,压力越大,不透明度越高,当设置为-100%,压力越大,透明度越高。
渗流(pressure bleed):渗流可以定位压力,主要应用于笔刷的起始部分。高渗流意味着笔刷细节较少,比较影响轻笔画。笔刷细节将会通过笔刷压力增大而增加流量。(意思就是压力越大,颜色越重)
平滑(pressure softening):当设置为0时,任何压力的改变不会立刻显示出来。较大值将会随着笔刷压力很平滑过渡。它和釉面笔刷合在一起可以得到渐变,较小值将会在压力变动较大时,得到一个快速的响应。
你也可以通过右侧 >按钮 调整笔刷的透明度,尺寸。
Linear:线性,初始设置,procreate 将会根据 pencil 获取传递的压力大小。
aggressive:增大本身的压力,适合于触摸压力较小的人。
subtle:降低压力响应的时间,适合于触摸压力较大的人。
b apple pencil 倾斜
角度:倾斜角度,这个滑动栏控制pencil 在画画时笔的倾斜度。当apple pencil 平行于ipad 上为0°,垂直为90°
不透明度:当没有设置透明度时,笔刷将不会随笔倾斜的角度变化。当设置为最大值,透明度为最大值。
渐变:主要应用于笔刷形状外边缘逐步改变透明度。
渗流:同压力渗流类似,一个是基于压力,一个是基于笔尖角度。
尺寸:当尺寸设置为空时,笔刷不会根据角度变化而变化。当设置为最大值,pencil将会使笔刷尺寸变得更大。
尺寸压缩:尺寸压缩将会模仿传统铅笔的行为进行尺寸压缩。(这个不是很懂)
6、常规设置
设置笔刷的特征,将应用于此笔刷所有模块。
a 画笔属性
画笔名称:直接设置画笔名称。
使用图章预览:当设置为on时,印章预览将会使你的笔刷以笔刷形状源文件形式预览。当颗粒不是一个笔刷确切的部分时,使用图章预览非常有用。
预览:调整笔刷预览的大小。
b 画笔行为
适应屏幕:当设置为on时,笔刷的朝向将和ipad 屏幕朝向相同(横屏或者竖屏)
经典锥度:打开此开关,将会从之前版本的procreate 中应用传统的锥度。(此处不懂- 。-)
混合模式:此模式允许在同一个模式里应用不同的效果(线性加深,颜色加深等)
亮度弯曲:当打开时,弯曲的时候使用最亮的颜色。
涂抹:和湿混模式的拉相似,但是只能当笔刷应用于涂抹工具。
c 尺寸限制
最大:设置笔刷可达到的最大尺寸。初始时,所有笔刷都可以达到100%半径。如果一个笔刷有很大的间距,则最大尺寸可以达到16倍。必要的话,大间距允许大尺寸的笔刷。(此处可以参考procreate 的暴风雪笔刷)
最小:笔刷允许的最小间距。
d 不透明度限制
最大:最大值可以决定笔刷可达到的最大透明度。
最小:笔刷允许的最小透明度。
7、来源
此选项卡包含创建笔刷基础的源图像。一个图像是笔刷的形状,一个为笔刷的颗粒,你可以根据自己的喜好变更笔刷源文件。
点击可直接选择文件(jpeg,png,tiff,gif)
在开始分享之前,我们先来复习一下设置 Kafka 参数,特别是 Broker 端参数的方法。
在 Kafka 安装目录的 config 路径下,有个 server.properties 文件。通常情况下,我们会指定这个文件的路径来启动 Broker。如果要设置 Broker 端的任何参数,我们必须在这个文件中显式地增加一行对应的配置,之后启动 Broker 进程,令参数生效。我们常见的做法是,一次性设置好所有参数之后,再启动 Broker。当后面需要变更任何参数时,我们必须重启 Broker。但生产环境中的服务器,怎么能随意重启呢?所以,目前修改 Broker 端参数是非常痛苦的过程。
基于这个痛点,社区于 1.1.0 版本中正式引入了动态 Broker 参数(Dynamic BrokerConfigs)。所谓动态,就是指修改参数值后,无需重启 Broker 就能立即生效,而之前在server.properties 中配置的参数则称为静态参数(Static Configs)。显然,动态调整参数值而无需重启服务,是非常实用的功能。如果你想体验动态 Broker 参数的话,那就赶快升级到 1.1 版本吧。
当然了,当前最新的 2.3 版本中的 Broker 端参数有 200 多个,社区并没有将每个参数都升级成动态参数,它仅仅是把一部分参数变成了可动态调整。那么,我们应该如何分辨哪些参数是动态参数呢?
如果你打开 1.1 版本之后(含 1.1)的 Kafka 官网,你会发现Broker Configs表中增加了Dynamic Update Mode 列。该列有 3 类值,分别是 read-only、per-broker 和 cluster-wide。我来解释一下它们的含义。
我来举个例子说明一下 per-broker 和 cluster-wide 的区别。Broker 端参数 listeners 想必你应该不陌生吧。它是一个 per-broker 参数,这表示你只能为单个 Broker 动态调整listeners,而不能直接调整一批 Broker 的 listeners。log.retention.ms 参数是 cluster-wide 级别的,Kafka 允许为集群内所有 Broker 统一设置一个日志留存时间值。当然了,你也可以为单个 Broker 修改此值。
你可能会问,动态 Broker 参数的使用场景都有哪些呢?实际上,因为不必重启 Broker,动态 Broker 参数的使用场景非常广泛,通常包括但不限于以下几种:
在这些使用场景中,动态调整线程池大小应该算是最实用的功能了。很多时候,当 KafkaBroker 入站流量(inbound data)激增时,会造成 Broker 端请求积压(Backlog)。有了动态参数,我们就能够动态增加网络线程数和 I/O 线程数,快速消耗一些积压。当突发流量过去后,我们也能将线程数调整回来,减少对资源的浪费。整个过程都不需要重启Broker。你甚至可以将这套调整线程数的动作,封装进定时任务中,以实现自动扩缩容。
由于动态配置的特殊性,它必然有和普通只读参数不同的保存机制。下面我来介绍一下Kafka 是如何保存动态配置的。
首先,Kafka 将动态 Broker 参数保存在 ZooKeeper 中,具体的 znode 路径如下图所示。
我来解释一下图中的内容。changes 是用来实时监测动态参数变更的,不会保存参数值;topics 是用来保存 Kafka 主题级别参数的。虽然它们不属于动态 Broker 端参数,但其实它们也是能够动态变更的。
users 和 clients 则是用于动态调整客户端配额(Quota)的 znode 节点。所谓配额,是指Kafka 运维人员限制连入集群的客户端的吞吐量或者是限定它们使用的 CPU 资源。
分析到这里,我们就会发现,/config/brokers znode 才是真正保存动态 Broker 参数的地方。该 znode 下有两大类子节点。第一类子节点就只有一个,它有个固定的名字叫 <default >,保存的是前面说过的 cluster-wide 范围的动态参数;另一类则以 broker.id 为名,保存的是特定 Broker 的 per-broker 范围参数。由于是 per-broker 范围,因此这类子节点可能存在多个。
我们一起来看一张图片,它展示的是我的一个 Kafka 集群环境上的动态 Broker 端参数。
在这张图中,我首先查看了 /config/brokers 下的子节点,我们可以看到,这里面有 <default >节点和名为 0、1 的子节点。<default >节点中保存了我设置的 cluster-wide范围参数;0 和 1 节点中分别保存了我为 Broker 0 和 Broker1 设置的 per-broker 参数。
接下来,我分别展示了 cluster-wide 范围和 per-broker 范围的参数设置。拿num.io.threads 参数为例,其 cluster-wide 值被动态调整为 12,而在 Broker 0 上被设置成 16,在 Broker 1 上被设置成 8。我为 Broker 0 和 Broker 1 单独设置的值,会覆盖掉cluster-wide 值,但在其他 Broker 上,该参数默认值还是按 12 计算。
如果我们再把静态参数加进来一起讨论的话,cluster-wide、per-broker 和 static 参数的优先级是这样的:per-broker 参数 >cluster-wide 参数 >static 参数 >Kafka 默认值。
另外,如果你仔细查看上图中的 ephemeralOwner 字段 ,你会发现它们的值都是 0x0。这表示这些 znode 都是持久化节点,它们将一直存在。即使 ZooKeeper 集群重启,这些数据也不会丢失,这样就能保证这些动态参数的值会一直生效。
讲完了保存原理,我们来说说如何配置动态 Broker 参数。目前,设置动态参数的工具行命令只有一个,那就是 Kafka 自带的 kafka-configs 脚本。接下来,我来以unclean.leader.election.enable 参数为例,演示一下如何动态调整。
下面这条命令展示了如何在集群层面设置全局值,即设置 cluster-wide 范围值。
总体来说命令很简单,但有一点需要注意。 如果要设置 cluster-wide 范围的动态参数,需要显式指定 entity-default 。现在,我们使用下面的命令来查看一下刚才的配置是否成功。
从输出来看,我们成功地在全局层面上设置该参数值为 true。注意 sensitive=false 的字眼,它表明我们要调整的参数不是敏感数据。如果我们调整的是类似于密码这样的参数时,该字段就会为 true,表示这属于敏感数据。
好了,调整完 cluster-wide 范围的参数,我来演示下如何设置 per-broker 范围参数。我们还是以 unclean.leader.election.enable 参数为例,我现在为 ID 为 1 的 Broker 设置一个不同的值。命令如下:
同样,我们使用下列命令,来查看一下刚刚的设置是否生效了。
这条命令的输出信息很多。我们关注两点即可。
如果我们要删除 cluster-wide 范围参数或 per-broker 范围参数,也非常简单,分别执行下面的命令就可以了。
删除动态参数要指定 delete-config 。当我们删除完动态参数配置后,再次运行查看命令,结果如下:
此时,刚才配置的所有动态参数都已经被成功移除了。
刚刚我只是举了一个参数的例子,如果你想要知道动态 Broker 参数都有哪些,一种方式是在 Kafka 官网中查看 Broker 端参数列表,另一种方式是直接运行无参数的 kafka-configs脚本,该脚本的说明文档会告诉你当前动态 Broker 参数都有哪些。我们可以先来看看下面这两张图。
看到有这么多动态 Broker 参数,你可能会问:这些我都需要调整吗?你能告诉我最常用的几个吗?根据我的实际使用经验,我来跟你分享一些有较大几率被动态调整值的参数。
1.log.retention.ms 。
修改日志留存时间应该算是一个比较高频的 *** 作,毕竟,我们不可能完美地预估所有业务的消息留存时长。虽然该参数有对应的主题级别参数可以设置,但拥有在全局层面上动态变更的能力,依然是一个很好的功能亮点。
2.num.io.threads 和 num.network.threads 。
这是我们在前面提到的两组线程池。就我个人而言,我觉得这是动态 Broker 参数最实用的场景了。毕竟,在实际生产环境中,Broker 端请求处理能力经常要按需扩容。如果没有动态 Broker 参数,我们是无法做到这一点的。
3. 与 SSL 相关的参数 。
主要是 4 个参数(ssl.keystore.type、ssl.keystore.location、ssl.keystore.password 和ssl.key.password)。允许动态实时调整它们之后,我们就能创建那些过期时间很短的 SSL证书。每当我们调整时,Kafka 底层会重新配置 Socket 连接通道并更新 Keystore。新的连接会使用新的 Keystore,阶段性地调整这组参数,有利于增加安全性。
4.num.replica.fetchers 。
这也是我认为的最实用的动态 Broker 参数之一。Follower 副本拉取速度慢,在线上Kafka 环境中一直是一个老大难的问题。针对这个问题,常见的做法是增加该参数值,确保有充足的线程可以执行 Follower 副本向 Leader 副本的拉取。现在有了动态参数,你不需要再重启 Broker,就能立即在 Follower 端生效,因此我说这是很实用的应用场景。
本文重点讨论了 Kafka 1.1.0 版本引入的动态 Broker 参数。这类参数最大的好处在于,无需重启 Broker,就可以令变更生效,因此能够极大地降低运维成本。除此之外,还给出了动态参数的保存机制和设置方法。
数据窗口是PB最重要的技术之一,通过它,可以很方便的对数据库的数据进行增、删、改。刚刚学习PB的人,有没有考虑过,通常一个数据窗口是由Select语句构建的,它可以检索数据,我们很容易理解,可删除数据、修改数据也是靠寥寥几行代码就可以实现.
其实,这全是依靠数据窗口的“Update Properties”,对数据的删除、修改控制全在这里,见下图。
上面是一个数据窗口的Update Properties窗口,它记录了如下信息:
1:数据是否只读(Allow Updates)
如果把该选项关闭,那么在程序中的任何删、改 *** 作都无法生效。
2:哪些列参与本次删、改 *** 作(Where Clause for Update/Delete)
Key Columns:主键列
Key and Updateable Columns:主键列以及用户设置的允许修改的列(窗口左下部设置哪些列允许被修改),这是通常使用最广泛的方式。
Key and Modified Columns:主键列以及真正发生变化的列(如果一张表有200个字段,仅仅一、两个字段变化了,千万不能用这种方式)。
3:如何完全本次删、改 *** 作(Key Modification)
Use Delete then Insert:如果是修改数据,先把该键值的数据删除除,再插入进来,再提交数据。用户感觉上数据仅仅是被修改过了。
Use Update:通过Update语句修改数据。
这样,就知道了数据窗口的工作原理。
如果删除数据,找到主键列,然后用delete 语句删除相应数据;
如果是修改数据,仍然找主键列,然后根据用户的设置判断是先删再插,还是直接修改,若是直接修改则再根据用户的设置对相应的列进行修改,这样,有时在程序里明明对n多列修改了数值,如果在此处设置不正确,也会得到不正确的结果。
其实,如果是单机版程序,数据库在本地,怎么设置都无大碍,但如果是C/S模式,每个属性就要与并发性以及数据库的“锁”有关系了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)