- 博客(237)
- 收藏
- 关注
原创 MediaPipe Tasks 在 Android 中的生成式 AI 实践:基于 Gemma 3n 的移动端
用它的时候,你可以直接在浏览器里上传自己的数据、用自己定制的机器学习模型,快速测试 MediaPipe 的各种解决方案(比如手势识别、图像分类等)。简单说,它就像一个在线工作台,不用复杂配置,打开就能直观地评估模型效果,或者根据自己的需求调整模型和运行流程,很适合快速验证想法。传统的全量微调需要重新训练模型所有参数(数十亿个),而 LoRA 微调只训练模型中注意力层的少量参数(约万分之一),像给模型加个"插件",既保留原模型能力,又能学会新任务。功能,但第三方的模型并不完善,需要转换。
2025-11-14 07:30:22
936
原创 浅谈Nacos获取配置两次调优经历
因历史和架构原因,我们的多个服务存在共用同一redis实例的情况,为最大程度避免redis数据不一致的情况,我们在共用redis的服务中引入同一配置项作为切换的开关(前提是北显机房的redis数据已“实时地”向金山云机房同步),当开关关闭时,所有服务读写北显机房的redis。经排查和讨论,我们认为,每一个服务的配置项并不是很多,并且配置项多数不会频繁的变更,即便配置项发生改变,延迟几秒(Nacos配置变化生效时间几乎都是毫秒级)对服务也无影响,综上,我们用机器内存缓存配置来解决这一超时问题。
2025-11-06 07:30:22
979
原创 这死锁,不打个招呼就来了
事务一拿到A记录的锁开始处理,此时事务二也对C记录加锁处理,处理完C记录之后,发现A的锁已经被占,于是阻塞。超时,好处是避免一直死锁监测的cpu开销(适用于高并发写入场景),但也存在风险:如果出现死锁,可能导致大量事务锁等待超时,系统的吞吐量降低。一个事务获取某个资源的排他锁后,其他事务不能获取该资源的任何锁。(Next-Key Lock): 记录锁(Record Lock) + 间隙锁(Gap Lock) 的组合。(行级锁,不是意向锁(IS/IX)别弄混),在 InnoDB 的锁体系中属于独立的类别。
2025-10-30 07:30:42
348
原创 从编译爆炸到编译防火墙:狐友 iOS 架构升级中的轻量化治理实践
现有的成熟优秀架构,如MVC (Model-View-Controller),MVVM(Model-View-ViewModel),VIPER(View-Interactor-Presenter-Entity-Router)等,都在狐友App中有广泛使用,这些架构主要聚焦于模块内部的代码组织和分层设计,不考虑架构设计对编译时间的影响;在狐友App的早期阶段,业务功能相对简单,模块之间的依赖关系也较为直接,通常是上层模块依赖底层模块,形成一种垂直依赖关系。分支合并那种烦人的冲突也少了92%,省心多了。
2025-10-24 07:30:14
758
原创 Android动态图片技术深度解析
本文将深入解析 Android 动态照片的技术原理,重点分析 XMP 元数据系统,并通过小米 Micro Video、Google Motion Photo 和 OPPO O Live Photo 三个真实案例,展示不同厂商的技术实现细节,探寻一套统一的检测和处理解决方案。动态照片是一种融合静态图片与动态视频的多媒体格式,其核心设计采用"主静态文件 + 附加视频 + 元数据"的组合模式,既能实现静态展示,又可支持动态播放,为用户带来更丰富的视觉体验,同时保持了较好的兼容性。
2025-10-10 07:30:23
625
原创 Lottie动画双状态切换的渐进式优化实践
Lottie 的底层实现会尝试用 json 路径的同级目录下的 images 文件夹,但如果你用的是沙盒缓存路径、或者 images 目录和 json 不在同一目录,或者 images 目录没有被正确拷贝,Lottie 就找不到图片,结果动画就不会被正常显示出来。纯 json 文件,所有资源(包括图片)都内嵌在 json 里(base64),这种情况下,Lottie 只需要加载 json 文件本身即可,动画和图片都能正常显示;为了处理动画加载和状态切换的时序问题,我们引入了状态机和Pending机制。
2025-09-18 07:31:13
411
原创 CAEmitterLayer:iOS 中创建炫酷粒子效果的魔法工具
CAEmitterLayer 是 iOS 开发中创建炫酷粒子效果的强大工具,通过合理组合 CAEmitterLayer 和 CAEmitterCell 的各种属性,你可以创建出几乎任何想象中的粒子效果。在 iOS 开发中,CAEmitterLayer 是一个强大但相对复杂的类,它可以创建出各种炫酷的粒子效果,如火焰、烟雾、雨、雪等自然现象,或者用于增强用户界面的视觉效果。粒子系统的基本原理是模拟大量微小物体(粒子)的运动和行为,通过组合这些粒子的效果来创建复杂的视觉现象。
2025-09-11 07:31:26
751
原创 Figma Context MCP 源码解析
这不是简单的数值转换,而是设计理念的转译:设计稿是静态的、固定尺寸的,而Web产品是动态的、多设备适配的。这个设计体现了作者对AI认知模式的"焦点机制"的深刻思考,AI可以首先构建元素的骨架,而不是被"淹没"在细节中,导致写出混乱的代码。随着MCP生态的成熟,可以预见一个新的开发范式:设计师在Figma这样的设计平台中创作,AI助手实时理解设计意图并生成高质量代码,开发者专注于代码审查和架构设计。MCP的核心理念是为AI模型提供标准化的上下文获取机制,让AI助手能够访问实时、准确的信息来增强其响应能力。
2025-09-04 07:31:34
954
原创 Jetpack Compose 深度剖析:从 UI 声明式编程到渲染内核优化
它不会像传统 View 那样层层嵌套测量布局与绘制流程,而是采用测量(MeasurePass)-> 布局(LayoutPass)-> 绘制(DrawPass)的管线逻辑,通过 LayoutNode 驱动 Compose UI 树的变化。Jetpack Compose 和 HarmonyOS ArkUI 均采用声明式 UI 编程范式,面向多设备场景的响应式 UI 构建,二者在理念相通的同时,在架构设计、状态模型、渲染机制等方面有显著区别。Compose 则采用声明式模型:界面即状态的函数表达。
2025-08-29 07:30:53
1030
原创 Android点赞烟花效果实现
并且属性动画提了种类丰富的插值器 Interpolator,除本文提到的还有弹跳插值器、回荡秋千插值器等等,另外还支持自定义插值器,这成为定制复杂动画运动轨迹的关键。那么,烟花图形又是怎么动气来的呢,通过属性动画ValueAnimator设置运行时间Duration,利用插值器在每个时间因子不断更新粒子的位置、速度、透明度、旋转角度等属性,通过view.postInvalidate() 渲染更新画布。根据整个烟花效果,将烟花分为两个主体,一是发射点发出的烟花粒子,二是烟花爆炸后形成的火花粒子组。
2025-08-14 07:30:34
1161
原创 TS:依赖分析助力项目依赖管理
本文用一个文件、一段比较简单的代码开篇,后面的工具也是围绕这段代码展开。还有,我们上面的代码是用的“当前文件中的代码段”。代表的是各种名字,而我们要寻找的是 cookie 这个 API 在代码中的调用情况,那就可以通过遍历所有。可以“读取虚构的xxx文件中的代码”。但是区别的地方来了:如果是虚构的文件,虽然也可以使用这里说的其它。同一个文件中,两个不同的函数里面定义了名称相同的变量,它们属于不同的。本文代码摘自“插件”的方式。上面这段代码的作用是“读取虚构的xxx文件中的代码”,代码内容就是第二个参数。
2025-08-14 07:30:34
769
原创 Swift下Dictionary背后的魔法
假设每个人的姓名笔划数都是不重复的,那么我们通过一个函数把要存档的人姓名笔划数转换到1000以内,然后把这个人的资料就放在转换后的数字指定的柜子里,这个函数就叫做哈希函数,按照这种方式存放的这1000个柜子就叫哈希表(散列表),人名笔画数就是哈希表的元素,转换后的数就是人名笔划数的哈希值(也就是柜子的序号)。如果是你,你会怎么做?哈希函数在计算行业里有很多应用,除了我们现在在了解哈希表外,比如我们经常听见的数字签名,服务器为了负载均衡而做的一致性哈希设计,搜索服务用的布隆过滤器等,都是用的哈希函数的特性。
2025-08-14 07:30:34
940
原创 如何生成严格递增的分布式id?
雪花算法生成的唯一ID均为正数,所以这 64 个 bit 中,其中 1 个 bit 是不用的(第一个 bit 默认都是 0),然后用 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。处理好redis问题后,修改naocs开关,程序监听到开关打开事件,则从数据库模式改为缓存模式生成:先更新下一号段避免id重复,然后把新更新的值写入redis中,下次请求就继续开始使用redis生成id。不同的机器存在不同的号段,放在内存中,速度快效率高,只需要考虑本机的线程安全问题。
2025-08-14 07:30:34
676
原创 浅析责任链模式在视频审核场景中的应用
通过使用责任链模式并遵循开闭原则、单一职责等设计原则对视频审核与发布业务进行了重构,当业务新增处理器时,无需对原有的系统源码进行修改,只需要关注新增的处理器本身即可,极大的增加了系统的灵活性与扩展性,也提高了系统的可维护性,减少了对复杂业务编排导致出现。实现,且每个处理器除了要关注自己的处理器代码外,还需要持有下一个处理器的引用,以串联成链,并且还负责对下一个处理器的调用。链路管理器负责处理器的编排,在本示例中,只是简单的按顺序调用每一个处理器进行处理,在实际工作中会增加处理器的优先级特性,也可以结合。
2025-07-31 07:31:36
359
原创 一文读懂实时活动
类型的实时活动创建以后,系统框架会自动帮你完成所有的更新和显示,你什么都不需要操作,文档也强调说明了,异步队列来获取更新回调,所以是不安全的回调,具体原因官方也没有回复,也有其他的开发者反馈类似问题,没有答复具体参考。部门最近也最近实现了这一功能需求,用于某一事件的实时动态展示,接下来的这一篇文章将为大家揭开实时活动的面纱,让你对实时活动不再说陌生。项目就是你的实时活动的最终响应模块,这个模块就是你的实时活动展示界面和更新数据的最终载体。)的概念,以便于用户在锁屏查看一些应用实时活动的更新。
2025-07-31 07:31:36
1844
原创 低成本高精度三维重建
得益于3D Gaussian Splatting技术,采用高斯椭球体点云取代传统的骨架+三角形贴图,并且利用深度学习技术实现了椭球点云的自校验,使得对于图像素材的要求大大降低,相应的对于拍摄设备与拍摄手法的要求也大大降低。3.由于在早期步骤中获取到了每个图片的拍摄机位信息,那么我们可以利用机位信息将椭球点云反推为一系列图像,再将生成的图像与原始图像进行损失计算,然后根据损失数据调整椭球点云,不断重复以上过程以实现一个损失不断下降的自校验过程。库,利用运动结构恢复技术提取拍摄机位信息与模型点云数据;
2025-07-31 07:31:36
489
原创 矢量图SVG安卓进阶
上面三个方案,都不能像Android的AnimatedVectorDrawable一样,支持每个path和group的属性动画,如果能够复用VectorDrawable,AnimatedVectorDrawable的设计来支持SVG中的矢量图和动画,是不是就一举两得了呢?下面对两种设计思路进行尝试。从源码和示例效果,可以发现Android-PathView库只是结合ObjectAnimator,对SVG中的path进行了一个裁剪绘制,从而产生出动画效果,并非支持SVG的动画标签,所以其动画效果比较简单。
2025-07-31 07:31:36
794
原创 基于YYKit的富文本自标定体系
如上图所示,业务场景中存在评论、图文标题等富文本的编辑场景,一条文本中可能存在@的人、话题、链接等不同类型的内容。编辑结束如何告知下游服务文本中哪部分是特殊类型的内容,这些内容又分别是什么,就成了一个很棘手的问题。也就是说,NSMutableAttributedString 自带一个跟文本绑定的 NSString 为 key 的存储空间,那我们只需要自定义一个 NSString 的 Key 用来存取标记数据就可以了。这就是自标定体系,用于富文本类型内容的生产编辑。什么是自标定体系,自标定体系是干什么用的。
2025-07-31 07:31:36
644
原创 搜狐新闻直播间适配HarmonyOs实现点赞动画
Ark UI中,UI的变化是通过状态变量控制的,由此需要设计一个数组,初始化为空数组,当触发一次动画操作时,向数组中添加一个数据,此时系统会根据数组的数量自动渲染对应的组件,当组件准备完成时执行属性动画,控制动画的状态变量放在数组里的对象中,当动画执行结束时,从数组中移除该数据,相应的组件也随之移除。
2025-07-24 07:30:33
1158
原创 用 MCP 扩展 Cursor 能力:解锁 Sentry 服务数据新玩法
服务的另一个核心组件,专门用于获取应用的会话统计数据,包括崩溃率、用户数量、会话持续时间等关键指标。问题的详细信息,包括问题标题、状态、级别、首次和最后出现时间、事件数量,以及最关键的堆栈跟踪信息。能够帮助我们监控和分析应用的稳定性表现,及时发现潜在问题,提供数据支持以优化用户体验和应用质量。可直接查询到更为全面、丰富的应用信息,全方位提升了数据的可获取性与利用价值。- 分组和排序:支持对数据进行分组和排序,便于比较分析不同维度的数据。信息以及可能的解决方案,这可以显著提升问题排查与解决的效率。
2025-07-24 07:30:33
954
原创 线程锁漫谈
在开发中往往是多线程的,如果多个线程同时对同一资源进行读写,就可能造成资源抢夺的问题,导致数据计算结果不是我们想要的结果。从操作系统的层面,有些系统已经内置了解决方案,在遇到此类优先级反转的情况时,会出让高优先级线程的优先级给让低优先级线程,保证锁内资源执行的正常。的崩溃,如果执行次数很少,还是可以考虑的。但是,自旋锁的效率相对是很高的,因为不用进行线程唤醒的操作,而是让线程直接进入盲等状态,相当于运行了一个。可以进行跨平台使用,可以创建两种类型的锁,一个是互斥锁,一个是递归锁,在初始化时指定类型。
2025-07-24 07:30:33
767
原创 视频审核中多模态应用
模型的训练过程,就是每个batch输入一定数量的图像和文本,通过各自模型encode成embedding,然后将图像的embedding和文字的embedding分别计算余弦相似度,损失函数要做的就是让成对的文本接近1,让不成对的文本接近0通过这样的方式,不断地调整两个encoder的权重,使得损失函数效果更好,以达到两个模型更高的对应表达。违规图片的检测,最先想到的方法就是建立违规图片数据库,视频进审时,针对视频关键帧提取图片特征,同图片违规数据库匹配,如果命中的话,则标记当前视频为违规视频。
2025-07-24 07:30:33
1063
原创 狐友抽奖平台构建之路
结合以上实际场景,我们引入预占库存的逻辑,将奖品分为总资源池和活动资源池,逻辑上相互独立,当新建一个玩法活动配置奖品库存时,需要进行预占库存的操作,会从总资源池中预占一部分库存,作为该活动的奖品库存,当活动的奖品库存发放完时,活动运营可以选择追加库存,当活动结束时,如果奖品库存仍有剩余,会自动返还至总资源池。在实际的业务场景下,运营人员分为两种角色,活动运营人员与运营BD人员,前者主要负责活动的策划和执行层面,后者负责活动奖品的商务拓展,与外部商家对接,获得商家的赞助。
2025-07-17 07:30:55
771
原创 矢量图Vector安卓详解
通过VectorDrawable的创建过程,我们可以了解到所有图片资源,最终都会通过解释xml中的标签,在inflateFromTag方法中创建图片对象,如VectorDrawable,GradientDrawable,ColorDrawable等。的属性和SVG中的属性基本一一对应,其中pathData对应了SVG中的d属性,绘制命令也完全一致,包括了10个命令:M,L,H,V,C,S,Q,T,A,Z。ImageView中的动画默认会停在初始画面,需要在代码中通过start函数来启动动画。
2025-07-17 07:30:55
485
原创 鸿蒙搜狐新闻如何在Native调用ArkTS方法
01前言鸿蒙作为一款新兴的智能操作系统,现在适配鸿蒙系统的应用越来越多,同时会面临三端兼容问题,如同一产品功能,需要维护iOS、Android、鸿蒙三端代码。拿文件上传、下载功能场景举例,同时要适配iOS、Android、鸿蒙三端,目前比较好的方案是文件上传、下载功能下沉到C,三端native代码可以复用,但是在鸿蒙上存在如下一个问题:Native文件上传、下载进度怎么从Native线程异步回调给ArkTs线程对应JS回调方法?答案:通过Node-API提供的线程安全函数,可以把文件上传、下载进度从nati
2025-07-17 07:30:55
740
原创 使用AVPlayer播放FairPlay DRM视频的最佳实践
01DRM 介绍DRM,即数字版权管理(Digital Rights Management),是指使用加密技术保护视频内容、通过专业技术安全地存储和传输密钥(加密密钥和解密密钥)、并允许内容生产商设置商业规则,限制内容观看者的一种系统。1.1 DRM 工作流程DRM使用对称加密算法(Symmetric-key algorithms)对视频内容进行加密,对称加密算法使用同一把密钥加密和解密;首先,通过密钥(通常为AES-128)将内容加密,然后传输给客户端。这把密钥由专用服务器提供,安全可靠;当客户端想要播放
2025-07-17 07:30:55
1247
原创 基于LLM的流量回放系统
无论是GET请求或者POST请求,其实都是很多的key、value的组合,那么去重的优先级是, 优先key不同的数据, 这个不同包括key的绝对值不同,也包括key的多与少,如图中所示,当通过这种方式去重后,一般每个接口路径下,一种返回形状,可能只能剩下5个以内的数据了,但是这会出现一个问题,因为请求参数可能会有一些id,他们的值不同则代表了不同的文章、用户,去重后会造成这类数据的减少,但这种问题几乎无法预计,所以这里直接采用了最简单的办法,对已经去重的数据做随机补充。
2025-07-17 07:30:55
862
原创 ViewPager2的滚动机制与优化
我们以C卡片为例,如果不操作的话那么我们的卡片应该处于右边C位置,然而实际上我们的卡片确却是在左边B位置,这样我们需要向下移动的卡片的距离为2*小卡片高度+ 大卡片高度,以此类推,D卡片需要多滑动一个小卡片的距离,以此类推,然而为了平滑移动需要乘以。然而,设计师的酷炫效果往往给开发者带来不小的挑战。可以看到第一张图片小卡片的人头部分没有显示出来,但是移动到第一张卡片的时候却显示的整张完整的图片,这样做的原因是为了在小卡片的时候显示我们想要显示的区域,这样效果会更好,那么这个效果我们需要怎么做呢?
2025-07-10 07:30:23
552
原创 基于Redis的向量召回,支撑 AI 业务
传统的问答库多以关键词匹配为核心,但面对复杂的用户表达和多样化的问题场景,单纯的关键词匹配显得无能为力,给用户笨拙低效的体验。然而,智能客服的关键在于能够快速、准确地理解用户的问题,并提供有效的解决方案,而这背后离不开强大的问答库支持。当用户输入问题时,将问题也转换为向量,并通过向量相似度计算,召回匹配的问答数据,实现对用户问题的精准匹配。相比传统方法,向量搜索能够理解问题中的语义含义,识别出用户隐含的意图,即使用户的问题表述与问答库中的内容不完全一致,也能提供相关性较高的答案。
2025-07-10 07:30:23
701
原创 JDK21虚拟线程僵死、调查及展望
与传统的线程不同,虚拟线程并不是直接由操作系统调度的,而是由JVM调度和管理,通过更高效的调度机制,使得数百万的线程也能在单台机器上高效运行。关键字的实现,以便虚拟线程可以独立于平台线程获取,保留和释放监视器,并且支持在等待监视器时释放平台线程,以便平台线程可以挂载其他虚拟线程。而JVM会追踪当前哪个线程持有锁对象的监视器,但是JVM追踪的是平台线程,而非虚拟线程。,被移出队列,以便pinned-0线程执行,但是不幸的是,由于没有空闲的平台线程,它永远无法被移出,这就跟之前的线程栈分析对上了。
2025-07-10 07:30:23
1140
原创 当测试遇见AI:用 Streamlit+AutoGen+Deepseek 构建智能用例生成器
未来的测试领域,AI 将成为需求理解的翻译官、测试设计的参谋长、质量风险的预警器,最终实现 "让测试更智能,让质量更可靠" 的目标。它借助 Streamlit 构建出友好的用户界面,利用 AutoGen 库和 Deepseek 语言模型进行交互,只要用户输入需求,就能快速生成测试用例,极大提升了测试工作的效率。负责搭建用户界面,收集用户的需求和高级选项信息,提供交互功能,比如按钮点击、输入框输入等,还能实时显示生成的测试用例和相关状态信息,就像一个热情的 “接待员”,和用户进行互动。
2025-07-10 07:30:23
752
原创 iOS静态代码检查方案解读
的程序,和我们人工分析的过程类似,符号执行引擎会分析程序逻辑的各个分支满足的条件,然后提前把这些条件准备好,如果有多个独立条件并存就会用排列组合的方式设计条件列表,再将这些不同预设的条件放到引擎中模拟执行,观察并记录符号的状态变化,具体某一项分析检查器只需要在合适的时机去读取符号的当前状态,判定是否有误即可知道代码是否存在问题了。前面我们讲述了如何使用 clang 针对单个文件进行分析,但实际的场景中,我们一般并不会单个的去编译一个个文件,而是利用针对工程的集成构建工具,例如。
2025-07-10 07:30:23
434
原创 鸿蒙富文本实践
图片组件 RichEditorImageSpanResult 就麻烦一些,首先通过 .valueResourceStr 可以获取到图片的资源路径 resource:///icon_emotion_8.png ,刨除协议头 resource:/// 与文件后缀 .png ,就得到了图片名 icon_emotion_8,通过配置表可以匹配到对应的表情关键字"[鼓掌]"。上面的文本就转换为:"第一次见面她帮他出头,他被她拽拽的气质吸引,对她一见钟情,多年后重逢续写故事"、"[色]"、"这该死的羁绊~"。
2025-03-27 07:30:30
1386
原创 Argo Workflows 原理及应用
01组件概述Argo Workflows是一个开源的容器原生工作流引擎,允许用户在Kubernetes集群上定义并执行复杂的业务流程。支持对相关流程进行个性化编排,包括执行顺序、相互之间的依赖等等。Argo Workflows 是以 Kubernetes 自定义资源定义(Custom Resource Definitions,简称 CRD)的形式来实现其功能。CRD 是 Kubernetes 提供...
2025-03-13 07:30:17
1961
原创 鸿蒙跨平台框架ArkUI-X
01引言目前,移动端主流跨平台方案有Flutter、React Native、uni-app等等,还有刚推出不久的Compose-Multiplatform,真所谓是百花齐放。这些框架各有特点,技术实现各有差异,比如Flutter通过Dart编写的UI描述对接Flutter渲染引擎,React Native 则是借助大前端成熟的发展背景,利用JS引擎生成UI描述,渲染时转化为原生控件,复用了原生渲...
2025-03-06 07:30:53
2188
原创 Android 根据View生成图片
01背景随着Android技术发展,经常有将某个界面截图保存下来分享,或者生成用户或者商品二维码图片方便加好友或者购买,所以这个功能在实际应用中非常有用,下面我将重点针对这些情况进行讲解,废话不多说了,先画个序列图,如下:序列图实现步骤:步骤一:创建View;首先,我们需要创建一个View,这个View可以是任何view,比如一个TextView或者一个Image View,也可以是LinearL...
2025-02-27 07:30:42
1133
原创 动态隐私检查方案优化与实现
01背景在移动应用开发过程中,隐私保护是一项至关重要的工作。以往我们采用了一种动态隐私检查工具,通过xposed方式实现,然而,这种方案存在着诸多限制。需要特定型号的手机和复杂的安装操作,不适用于集成到自动化测试系统中。02两种方案的比较2.1 xposed 方式的实现以往我们采用了xposed框架实现了动态隐私检查功能。该方案通过修改Android系统的运行时环境,拦截应用程序的方法调用,实现隐...
2025-02-20 07:31:27
1053
原创 掌握Swift宏:深入探索SwiftSyntax与宏的实用指南
欢迎来到 Swift 宏的世界。我们将探索 Swift 5.9 版本中引入的一项革命性特性——宏(Macro),它为我们提供了一种在编译时处理源代码的能力。宏可以帮助我们自动化代码生成,减少模板代码,并使得代码更加简洁和易于理解。我们将从宏的基本概念开始,逐步深入了解关联宏(attached macro)和独立宏(freestanding macro)的区别与应用。接着,我们会学习如何通过 Swi...
2025-01-23 07:32:16
738
原创 矢量图SVG应用探索
随着计算机技术的不断发展,图形设计和多媒体制作领域对图像质量、可编辑性和跨平台兼容性的要求越来越高,而矢量图作为一种强大的图像类型,正好满足了这些需求。在软件开发中,基于矢量图无限缩放性、小文件体积、高度可编辑性、跨平台兼容性和透明背景等独特优势,也会被大家广泛使用。01矢量图与SVG矢量图,也称为向量图,是一种基于数学方程和几何属性的图形表示方法。它不同于位图,位图由像素组成,缩放时可能出现失真...
2025-01-16 07:31:02
1248
原创 探秘block原理
01概述在iOS开发中,block大家用的都很熟悉了,是iOS开发中闭包的一种实现方式,可以对一段代码逻辑进行封装,使其可以像数据一样被传递、存储、调用,并且可以保存相关的上下文状态。很多block原理性的文章都比较老,里面讲的一些知识已经过时,这里用新版的iOS SDK再梳理一遍block原理,也是和大家一起对已有知识做一次复习。02内存布局block本质上可以理解为结构体,对于结构体的内存布局...
2025-01-09 07:30:14
752
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅