Ray 的记录站

日常开发实践记录

0%

本文介绍 Container 是如何发现各自存在的. 即:

  • 理解 Docker 内部虚拟网络中容器如何利用 DNS 简化相互通信
  • DNS 在自定义网络中如何工作
  • 使用 --link 在默认的 bridge 网络中启用 DNS
阅读全文 »

本文主要介绍 Docker 的网络基础, 包括:

  • docker container run -p 命令
  • docker container port 命令查看容器的端口
  • Docker Networking 的概念
  • 网络包如何在 Docker 内部流转
阅读全文 »

MediatR 是.NET 中的简单中介者模式实现,一种进程内消息传递机制(无其他外部依赖)。 支持以同步或异步的形式进行请求/响应,命令,查询,通知和事件的消息传递,并通过 C#泛型支持消息的智能调度。

阅读全文 »

在 .Net 或 dotnet core 5.0 中, 数据库相关开发时, 通常可以分为 Code First 和 Database First 两种方式的开发, 本文先看看如何进行 Code First 开发, 即先定义数据模型, 通过模型生成数据表及对应关系.

阅读全文 »

本文的主要目的是介绍 Flutter 中的动画 API, 相关概念, 类, 以及方法.

Flutter 中的动画主要分为两大类: 插值动画和物理动画.

  • 插值动画: 指的是通过设置一个起点和终点, 通过提供的变化曲线进行中间帧插值的一种动画方法.
  • 物理动画: 指的是以模拟的方式

为了更好地在 Flutter 中实现动画, 先来看 Flutter 中的常用动画实现模式.

阅读全文 »

Flutter Framework 中的绝大部分代码都是通过 Engine 的帧渲染驱动执行的.

事件一般有如下几类:

  • 手势
  • 平台消息(设备本身产生的数据, 比如设备传感器数据)
  • 设备消息(设备状态改变, 比如旋转, APP 进入后台/前台, 内存报警, 设备设置改变等)
  • Future 或 HTTP 响应

事件发生后, 通过引擎驱动 Framework 代码执行.

阅读全文 »

利用 Window 作为接口, 通过 Binding 来建立 Engine 和 Framework 的联系.

Binding 的初始化过程实际就是将 Framework 端许多函数或方法挂接到 Window 上的过程. 绑定过程的结果是生成一个 WidgetsBinding 单例对象, 可通过 WidgetsBinding.instance 访问. 更极端地讲: 只有通过 Binding, Framework 和 Engine 才能相互通信(不过有一个特例是 RenderView).

阅读全文 »

大部分手机应用程序都会拥有用户界面(UI), 用户看到的实际是显示在屏幕上的”图片”, 这些”图片”由若干像素组成, 图片在高速变化时, 就形成动画. 当用户触摸某个按钮时, 实际是由设备发送手指在屏幕上触摸的坐标.

显示在屏幕上的”图片”要进行更新, 需要外部事件驱动, 这些事件包括:

  • 用户手势(触摸)
  • 各类传感器(光线/方向/位置等)
  • 网络(network)通信
  • 时间(定时器, 比如动画)

图片被更新后, 显示器如何知道它更新了呢? 显示设备以固定速率(60Hz 或更精确的 59.97Hz)从 GPU 帧缓存中获取, 帧即显示在屏幕上的”图片”描述, 从而完成显示.

阅读全文 »

Flutter 框架概述

Flutter 总体架构如下所示:

Flutter 框架总体分为如下三个部分:

  • Embedder: 负责初始化 Flutter Engine(引擎) 和相关线程(包括 Flutter 主线程, 消息通道线程等), 并将平台事件和引擎进行对接.
  • Engine: 负责和平台之间的沟通, 同时负责渲染管线后续处理. 另外它会创建 DartVM, DartVM 创建后会调用 main 函数, main 函数在 Flutter 主线程中执行(和平台 APP 的 UI 线程不是同一个).
  • Framework: 负责提供针对底层 Render Object 等的响应式封装, 管理 Element 树的创建/重建, 以及 Render Object 的更新等.

Framework 层和 Engine 层的通信使用 Binding 机制完成, 目前在 Flutter 中一共有八种 Binding, 详见后续内容.

一个打包好的 Flutter APP 中总是包含有这几层的代码(Flutter 编译时有摇树处理会自动删除未使用的框架代码, 不过这也造成在 Flutter 中 Dart 无法使用反射, 许多常规操作比如 JSON 解析都只有通过代码生成工具硬编码进行), 同时包含平台端容器 APP 的代码(比如安卓和 iOS 的原生端代码).

之后会以自底向上的方式逐步讲解 Flutter 的整个运行过程, 包括 build 是怎样触发的, InheritedWidget 是如何简化依赖注入工作的等内容.

大纲如下: (需要调整大纲的顺序, 这样便于从下往上和从上往下逼近讲解目标)

第一部分: 基础知识准备(包含 Flutter 的架构设计)

  1. 一切的基础: 设备, 讲解 vSync 信号驱动显示更新的整个流程.
  2. Engine 和 Framework 之间的接口: Window
  3. Binding 概述
  4. 生成下一帧(frame): 驱动 Flutter Framework

第二部分:

  1. 两棵树: Element Tree & Render Tree
  2. Render Tree 元素: RenderObject
  3. Widgets: Flutter 开发核心
  4. Element Tree 元素: Element

第三部分:

  1. Flutter 帧绘制核心原理
  2. 手势处理
  3. 动画的处理过程
  4. 下一帧绘制的完整流程(总结)

欠缺

  • 无图无真相: 需要绘制一些图示说明.
  • 通过从整体到局部的方式展开, 切勿一开始就掉到代码的细节中去.

参考

  1. Flutter Internals
  2. Flutter 内部运行原理
  3. Inside Flutter
  4. Inside Flutter 中文版
  5. Flutter 实战
  6. iOS 核心动画高级技巧(中文版)
  7. 提升 iOS 界面渲染性能
  8. 安卓图形显示系统
  9. iOS 保持界面流畅的技巧

由于网站获取自然流量的需要, 在 SEO 上需要加大力度投入, 故对 SEO 相关实践进行梳理总结. 最终的期望是网站排名和自然流量有一个大的提升.

阅读全文 »