网站图片修改/百度推广排名怎么做的

网站图片修改,百度推广排名怎么做的,网页小游戏列表,网站推广120requestAnimationFrame 是前端开发中用于优化动画性能的 API。它允许浏览器在下一次重绘之前执行指定的回调函数,通常用于实现平滑的动画效果。 1.作用 优化性能:requestAnimationFrame 会根据浏览器的刷新率(通常是 60Hz,即每秒…

requestAnimationFrame 是前端开发中用于优化动画性能的 API。它允许浏览器在下一次重绘之前执行指定的回调函数,通常用于实现平滑的动画效果。

1.作用

  1. 优化性能requestAnimationFrame 会根据浏览器的刷新率(通常是 60Hz,即每秒 60 帧)来调用回调函数,确保动画流畅且不浪费资源。

  2. 节省资源:当页面不可见或最小化时,浏览器会自动暂停 requestAnimationFrame 的执行,减少 CPU 和 GPU 的消耗。

  3. 避免丢帧:与 setTimeout 或 setInterval 相比,requestAnimationFrame 能更好地与浏览器的渲染周期同步,减少丢帧现象。

2.使用方法

  1. 基本用法

    function animate() {// 动画逻辑requestAnimationFrame(animate);
    }
    requestAnimationFrame(animate);
  2. 停止动画

    let animationId;
    function animate() {// 动画逻辑animationId = requestAnimationFrame(animate);
    }
    animate();// 停止动画
    cancelAnimationFrame(animationId);

优势对比

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>requestAnimationFrame vs setTimeout - 点击开始</title><style>.box {width: 50px;height: 50px;position: relative;top: 0;left: 0;margin-bottom: 20px; /* 增加间距 */}#rafBox {background-color: red;}#timeoutBox {background-color: blue;}.label {font-family: Arial, sans-serif;margin-bottom: 10px;}#startButton {padding: 10px 20px;font-size: 16px;margin-bottom: 20px;cursor: pointer;}</style>
</head>
<body>
<button id="startButton">开始动画</button><div><div class="label">requestAnimationFrame</div><div id="rafBox" class="box"></div>
</div>
<div><div class="label">setTimeout</div><div id="timeoutBox" class="box"></div>
</div><script>// 增加动画复杂度:模拟一些计算任务function heavyTask() {let sum = 0;for (let i = 0; i < 1000000; i++) {sum += Math.random();}}// requestAnimationFrame 动画const rafBox = document.getElementById('rafBox');let rafPosition = 0;let rafStartTime;let rafFrameCount = 0;function rafAnimate() {heavyTask(); // 模拟复杂计算rafPosition += 2; // 每次移动 2pxrafBox.style.left = rafPosition + 'px';rafFrameCount++;if (rafPosition < 600) { // 移动到 600px 时停止requestAnimationFrame(rafAnimate);} else {const rafEndTime = performance.now();console.log(`requestAnimationFrame 完成!用时:${(rafEndTime - rafStartTime).toFixed(2)}ms,帧数:${rafFrameCount}`);}}// setTimeout 动画const timeoutBox = document.getElementById('timeoutBox');let timeoutPosition = 0;let timeoutStartTime;let timeoutFrameCount = 0;function timeoutAnimate() {heavyTask(); // 模拟复杂计算timeoutPosition += 2; // 每次移动 2pxtimeoutBox.style.left = timeoutPosition + 'px';timeoutFrameCount++;if (timeoutPosition < 600) { // 移动到 600px 时停止setTimeout(timeoutAnimate, 16); // 模拟 60Hz 刷新率} else {const timeoutEndTime = performance.now();console.log(`setTimeout 完成!用时:${(timeoutEndTime - timeoutStartTime).toFixed(2)}ms,帧数:${timeoutFrameCount}`);}}// 点击按钮后启动动画const startButton = document.getElementById('startButton');startButton.addEventListener('click', () => {// 重置方块位置rafBox.style.left = '0px';timeoutBox.style.left = '0px';rafPosition = 0;timeoutPosition = 0;// 记录开始时间rafStartTime = performance.now();timeoutStartTime = performance.now();// 启动动画rafAnimate();timeoutAnimate();// 禁用按钮,防止重复点击startButton.disabled = true;});
</script>
</body>
</html>
  • 你会看到一个“开始动画”按钮,点击按钮后:

    • 红色方块:使用 requestAnimationFrame,动画更加流畅。

    • 蓝色方块:使用 setTimeout,动画可能会出现卡顿。

打开浏览器的控制台(按 F12),可以看到两者的完成时间和帧数对比

requestAnimationFrame 的兼容封装 

requestAnimationFrame 在不同浏览器中的兼容性确实存在差异,尤其是在一些旧版本的浏览器中(如 IE9 及以下)。为了确保代码的兼容性,我们可以封装一个通用的 requestAnimationFrame 方法,如果浏览器不支持 requestAnimationFrame,则自动降级为 setTimeout

// 兼容性封装
const requestAnimFrame = (function () {return (window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnimationFrame ||function (callback) {// 如果不支持 requestAnimationFrame,则使用 setTimeout 模拟return window.setTimeout(callback, 1000 / 60); // 模拟 60Hz 刷新率});
})();// 兼容性封装 cancelAnimationFrame
const cancelAnimFrame = (function () {return (window.cancelAnimationFrame ||window.webkitCancelAnimationFrame ||window.mozCancelAnimationFrame ||window.oCancelAnimationFrame ||window.msCancelAnimationFrame ||function (id) {// 如果不支持 cancelAnimationFrame,则使用 clearTimeoutwindow.clearTimeout(id);});
})();

3.使用方法

启动动画

let animationId;function animate() {// 动画逻辑animationId = requestAnimFrame(animate);
}animate(); // 启动动画

停止动画

cancelAnimFrame(animationId); // 停止动画

4.完整示例

以下是一个完整的示例,展示如何使用封装的 requestAnimFrame 方法,并且保留啦优势对比的蓝色方块,同时也增加了两个按钮,可以重复观看,以感受他们的差异!

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>requestAnimationFrame vs setTimeout 对比</title><style>.box {width: 50px;height: 50px;position: relative;top: 0;left: 0;margin-bottom: 20px; /* 增加间距 */}#rafBox {background-color: red;}#timeoutBox {background-color: blue;}.label {font-family: Arial, sans-serif;margin-bottom: 10px;}button {padding: 10px 20px;font-size: 16px;margin-right: 10px;cursor: pointer;}</style>
</head>
<body>
<button id="startButton">开始动画</button>
<button id="resetButton">重新执行动画</button><div><div class="label">requestAnimationFrame</div><div id="rafBox" class="box"></div>
</div>
<div><div class="label">setTimeout</div><div id="timeoutBox" class="box"></div>
</div><script>// 兼容性封装const requestAnimFrame = (function () {return (window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnimationFrame ||function (callback) {// 如果不支持 requestAnimationFrame,则使用 setTimeout 模拟return window.setTimeout(callback, 1000 / 60); // 模拟 60Hz 刷新率});})();const cancelAnimFrame = (function () {return (window.cancelAnimationFrame ||window.webkitCancelAnimationFrame ||window.mozCancelAnimationFrame ||window.oCancelAnimationFrame ||window.msCancelAnimationFrame ||function (id) {// 如果不支持 cancelAnimationFrame,则使用 clearTimeoutwindow.clearTimeout(id);});})();// requestAnimationFrame 动画const rafBox = document.getElementById('rafBox');let rafPosition = 0;let rafAnimationId;function rafAnimate() {rafPosition += 2; // 每次移动 2pxrafBox.style.left = rafPosition + 'px';if (rafPosition < 600) { // 移动到 600px 时停止rafAnimationId = requestAnimFrame(rafAnimate);}}// setTimeout 动画const timeoutBox = document.getElementById('timeoutBox');let timeoutPosition = 0;let timeoutAnimationId;function timeoutAnimate() {timeoutPosition += 2; // 每次移动 2pxtimeoutBox.style.left = timeoutPosition + 'px';if (timeoutPosition < 600) { // 移动到 600px 时停止timeoutAnimationId = setTimeout(timeoutAnimate, 16); // 模拟 60Hz 刷新率}}// 点击按钮启动动画document.getElementById('startButton').addEventListener('click', () => {// 启动 requestAnimationFrame 动画rafAnimate();// 启动 setTimeout 动画timeoutAnimate();});// 点击按钮重新执行动画document.getElementById('resetButton').addEventListener('click', () => {// 停止当前动画cancelAnimFrame(rafAnimationId);clearTimeout(timeoutAnimationId);// 重置方块位置rafBox.style.left = '0px';timeoutBox.style.left = '0px';rafPosition = 0;timeoutPosition = 0;// 重新启动动画rafAnimate();timeoutAnimate();});
</script>
</body>
</html>

5.代码说明

  1. 兼容性封装

    • requestAnimFrame 和 cancelAnimFrame 封装了 requestAnimationFrame 和 cancelAnimationFrame 的兼容性逻辑。

  2. 动画逻辑

    • 红色方块:使用 requestAnimFrame,动画更加流畅。

    • 蓝色方块:使用 setTimeout,动画可能会出现卡顿。

  3. 按钮功能

    • 开始动画:点击后同时启动 requestAnimFrame 和 setTimeout 的动画。

    • 重新执行动画:点击后停止当前动画,重置方块位置,并重新启动动画。

6.效果展示

7.案例总结

通过这个示例,你可以直观地看到 requestAnimFrame 和 setTimeout 的差异:

  • requestAnimFrame:动画流畅,性能更优。

  • setTimeout:动画可能会出现卡顿。

  • 备注:网上随便下载的gif录屏软件,貌似这种差异不是很明显,建议自己复制代码查看,我实际看到的还是很明显的

 8.性能优化建议

  1. setTimeout 的性能问题

    • 丢帧setTimeout 的时间间隔是固定的(如 16ms 模拟 60Hz),但无法保证与浏览器的渲染周期同步,可能导致丢帧或卡顿。

    • 资源浪费:即使页面不可见或最小化,setTimeout 仍会继续运行,浪费 CPU 和 GPU 资源。

    • 精度问题setTimeout 的时间精度受系统负载影响,可能导致动画不流畅。

  2. requestAnimationFrame 的性能优势

    • 与浏览器渲染同步requestAnimationFrame 会在每次浏览器重绘前调用回调函数,确保动画流畅。

    • 节省资源:当页面不可见或最小化时,requestAnimationFrame 会自动暂停,减少资源消耗。

    • 高精度requestAnimationFrame 的时间戳精度更高,适合高性能动画。


9.注意事项

  1. 避免频繁操作 DOM

    • 在动画回调函数中,尽量减少对 DOM 的频繁操作(如修改样式或布局),因为 DOM 操作会触发重排(reflow)和重绘(repaint),影响性能。

    • 可以通过以下方式优化:

      • 使用 transform 和 opacity 代替 topleft 等属性,因为前者不会触发重排。

      • 使用 will-change 属性提示浏览器优化渲染。

  2. 避免阻塞主线程

    • 如果动画回调函数中有复杂的计算任务(如大量循环或递归),可能会导致主线程阻塞,影响动画流畅性。

    • 可以通过以下方式优化:

      • 将复杂计算任务放到 Web Worker 中执行。

      • 使用 requestIdleCallback 处理低优先级的任务。

  3. 处理动画停止

    • 使用 cancelAnimationFrame 或 clearTimeout 及时停止动画,避免不必要的资源消耗。

    • 在页面不可见时(如切换标签页),可以通过 Page Visibility API 检测页面状态,暂停动画。

  4. 兼容性问题

    • 虽然 requestAnimationFrame 在现代浏览器中支持良好,但在旧版本浏览器(如 IE9 及以下)中需要降级为 setTimeout

    • 使用兼容性封装(如前面的代码)可以解决这个问题。

  5. 动画帧率控制

    • requestAnimationFrame 的帧率通常是 60Hz,但如果动画逻辑过于复杂,可能会导致帧率下降。

    • 可以通过时间戳(performance.now())计算帧间隔,动态调整动画逻辑,确保帧率稳定。

  6. 内存泄漏

    • 如果动画回调函数中引用了外部变量或 DOM 元素,可能会导致内存泄漏。

    • 确保在动画停止时,清理不必要的引用。


10.优化建议

  1. 使用硬件加速

    • 通过 transform: translate3d(0, 0, 0) 或 will-change: transform 启用 GPU 加速,提升动画性能。

  2. 减少重排和重绘

    • 使用 transform 和 opacity 实现动画,避免修改 widthheighttopleft 等属性。

  3. 批量操作 DOM

    • 如果需要修改多个 DOM 元素的样式,可以使用 DocumentFragment 或 requestAnimationFrame 批量处理,减少重排次数。

  4. 使用 Web Worker

    • 将复杂的计算任务放到 Web Worker 中执行,避免阻塞主线程。

  5. 性能监控

    • 使用 performance.now() 或浏览器开发者工具(如 Chrome 的 Performance 面板)监控动画性能,找出性能瓶颈。


11.优化后的动画

以下是一个优化后的动画示例,结合了上述建议:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>三个方块的性能对比</title><style>body {font-family: Arial, sans-serif;margin: 20px;}.animation-container {margin-bottom: 40px; /* 每个动画区块之间的间距 */}.label {font-size: 16px;margin-bottom: 10px; /* 文字与方块的间距 */}.box {width: 50px;height: 50px;position: relative;left: 0;}#optimizedBox {background-color: red;will-change: transform; /* 启用硬件加速 */}#unoptimizedRAFBox {background-color: green;}#unoptimizedTimeoutBox {background-color: blue;}button {padding: 10px 20px;font-size: 16px;margin-right: 10px;cursor: pointer;}</style>
</head>
<body><button id="startButton">开始动画</button><button id="resetButton">重新开始动画</button><!-- 优化后的动画 --><div class="animation-container"><div class="label">优化后的动画(requestAnimationFrame + transform)</div><div id="optimizedBox" class="box"></div></div><!-- 未优化的 requestAnimationFrame 动画 --><div class="animation-container"><div class="label">未优化的 requestAnimationFrame 动画(使用 left)</div><div id="unoptimizedRAFBox" class="box"></div></div><!-- 未优化的 setTimeout 动画 --><div class="animation-container"><div class="label">未优化的 setTimeout 动画(使用 left)</div><div id="unoptimizedTimeoutBox" class="box"></div></div><script>// 兼容性封装const requestAnimFrame = (function () {return (window.requestAnimationFrame ||window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.oRequestAnimationFrame ||window.msRequestAnimationFrame ||function (callback) {return window.setTimeout(callback, 1000 / 60);});})();const cancelAnimFrame = (function () {return (window.cancelAnimationFrame ||window.webkitCancelAnimationFrame ||window.mozCancelAnimationFrame ||window.oCancelAnimationFrame ||window.msCancelAnimationFrame ||function (id) {window.clearTimeout(id);});})();// 优化后的动画(requestAnimationFrame + transform)const optimizedBox = document.getElementById('optimizedBox');let optimizedPosition = 0;let optimizedAnimationId;function optimizedAnimate() {optimizedPosition += 2; // 每次移动 2pxoptimizedBox.style.transform = `translateX(${optimizedPosition}px)`; // 使用 transformif (optimizedPosition < 600) { // 移动到 600px 时停止optimizedAnimationId = requestAnimFrame(optimizedAnimate);}}// 未优化的 requestAnimationFrame 动画(使用 left)const unoptimizedRAFBox = document.getElementById('unoptimizedRAFBox');let unoptimizedRAFPosition = 0;let unoptimizedRAFAnimationId;function unoptimizedRAFAnimate() {unoptimizedRAFPosition += 2; // 每次移动 2pxunoptimizedRAFBox.style.left = unoptimizedRAFPosition + 'px'; // 使用 leftif (unoptimizedRAFPosition < 600) { // 移动到 600px 时停止unoptimizedRAFAnimationId = requestAnimFrame(unoptimizedRAFAnimate);}}// 未优化的 setTimeout 动画(使用 left)const unoptimizedTimeoutBox = document.getElementById('unoptimizedTimeoutBox');let unoptimizedTimeoutPosition = 0;let unoptimizedTimeoutAnimationId;function unoptimizedTimeoutAnimate() {unoptimizedTimeoutPosition += 2; // 每次移动 2pxunoptimizedTimeoutBox.style.left = unoptimizedTimeoutPosition + 'px'; // 使用 leftif (unoptimizedTimeoutPosition < 600) { // 移动到 600px 时停止unoptimizedTimeoutAnimationId = setTimeout(unoptimizedTimeoutAnimate, 16); // 模拟 60Hz 刷新率}}// 点击按钮启动动画document.getElementById('startButton').addEventListener('click', () => {// 启动优化后的动画optimizedAnimate();// 启动未优化的 requestAnimationFrame 动画unoptimizedRAFAnimate();// 启动未优化的 setTimeout 动画unoptimizedTimeoutAnimate();});// 点击按钮重新开始动画document.getElementById('resetButton').addEventListener('click', () => {// 停止当前动画cancelAnimFrame(optimizedAnimationId);cancelAnimFrame(unoptimizedRAFAnimationId);clearTimeout(unoptimizedTimeoutAnimationId);// 重置方块位置optimizedBox.style.transform = 'translateX(0px)';unoptimizedRAFBox.style.left = '0px';unoptimizedTimeoutBox.style.left = '0px';optimizedPosition = 0;unoptimizedRAFPosition = 0;unoptimizedTimeoutPosition = 0;// 重新启动动画optimizedAnimate();unoptimizedRAFAnimate();unoptimizedTimeoutAnimate();});</script>
</body>
</html>

12.效果展示

csdn上gif大小不能超过5M,我这动图超过5M啦,在线压缩居然要收费,算了!

大家自己复制源码感受一下吧!不贴gif图啦,jpg的对付着看吧!!!

你可以清晰地看到三种实现方式的性能差异:

  1. 优化后的动画:使用 requestAnimationFrame 和 transform,性能最佳。

  2. 未优化的 requestAnimationFrame 动画:使用 left,性能稍差。

  3. 未优化的 setTimeout 动画:使用 left,性能最差。

13.总结

通过优化 DOM 操作、启用硬件加速、减少重排和重绘,可以显著提升动画性能。同时,注意兼容性和资源管理,确保动画在不同设备和浏览器中都能流畅运行。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【pytest框架源码分析五】pytest插件的注册流程

前文介绍到pytest整体是运用插件来实现其运行流程的。这里仔细介绍下具体过程。 首先进入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

IoTDB日志提示Too many open files

问题 时序数据库 IoTDB 1.3.3 版本 IoTDB 执行查询操作失败&#xff0c;日志打印提示 Too many open files。通过命令查看打开文件数&#xff0c;结果如下&#xff1a; [root0002 DataReceiver]# lsof|grep 28347|wc -l DataNode 55444 [root0002 DataReceiver]# lsof|g…

prometheus 添加alertmanager添加dingtalk机器人告警

1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下

C 语 言 --- 操 作 符 2

C 语 言 --- 操 作 符 2 移 位 操 作 符定 义原 码 补 码 和 反 码左 移&#xff08;<<&#xff09;右 移&#xff08;>>&#xff09;算 术 右 移逻 辑 右 移 按 位 与、按 位 或、和 按 位 异 或按 位 与按 位 或按 位 异 或 逻 辑 反 操 作负 值 操 作按 位 取 反…

基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

零碳工厂能源管理系统的核心技术与应用实践

零碳工厂能源管理系统是一种高效的解决方案&#xff0c;旨在优化能源使用并减少碳排放&#xff0c;以帮助工厂实现低碳或零碳的生产目标。以下是该系统的详细构成和功能&#xff1a; 1. 核心组件 传感器和监测设备&#xff1a;用于实时监测工厂内的能源使用情况&#xff0c;包…

美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!

今年以来&#xff0c;DeepSeek凭借其强大的深度推理分析能力&#xff0c;在AI领域掀起新的热潮。美摄科技快速响应市场需求&#xff0c;迅速接入以DeepSeek、通义千问、商汤、文心一言为代表的大模型&#xff0c;为企业视频创作生产带来全新体验。 传统视频创作面临着同质化、…

【yolo】yolo训练报错,以及解决方案

背景&#xff1a; 刚刚&#xff0c;写了《【yolo】yolo推理报错&#xff0c;以及解决方案》&#xff0c;马上训练就遇到类似的报错。 我对我标注的图像进行了300轮的训练&#xff0c;但是训练完300轮后&#xff0c;报错了。。。 报错信息 300 epochs completed in 0.085 hou…

理解线性动力学中的模态叠加法

线性动力学中的模态叠加方法 模态叠加法是线性动力学中一种有价值的工具&#xff0c;可以有效地确定频域或时域中的系统响应。对于某些类型的线性动力学分析&#xff0c;有必要使用此方法&#xff0c;因此了解该过程对于获得准确的结果至关重要。在本博客中&#xff0c;我们将…

报错 - redis - Unit redis.service could not be found.

报错&#xff1a; Unit redis.service could not be found.Could not connect to Redis at 127.0.0.1:6379: Connection refused解决方法&#xff1a; 检查状态、有必要的话 重新安装 Linux 上查看状态 systemctl status redis显示以下内容&#xff0c;代表正常服务 出现下面…

CMS网站模板定制设计与安全评估

内容概要 现代CMS&#xff08;内容管理系统&#xff09;作为网站建设的核心载体&#xff0c;其模板架构与安全防护体系的协同设计已成为企业数字化转型的关键环节。随着网络攻击向量日益复杂化&#xff0c;基于HTTPS协议的端到端加密部署不仅成为基础安全配置&#xff0c;更直…

【React】useEffect、useLayoutEffect底层机制

目录 useEffect不设置依赖设置空数组&#xff0c;无依赖设置多个依赖返回值是一个函数总结useEffect的使用环境useEffect 中发送请求错误示例用.then获取数据在useEffect创建一个函数 总结 useLayoutEffectuseLayoutEffect 和useEffect区别执行时机&#xff1a;浏览器渲染的关系…

深度解析学术论文成果评估(Artifact Evaluation):从历史到现状

深度解析学术论文成果评估(Artifact Evaluation)&#xff1a;从历史到现状 引言 在计算机科学和工程领域的学术研究中&#xff0c;可重复性和可验证性越来越受到重视。随着实验性研究的复杂性不断增加&#xff0c;确保研究成果可以被其他研究者验证和构建变得尤为重要。这一需…

游戏MOD伴随盗号风险,仿冒网站借“风灵月影”窃密【火绒企业版V2.0】

游戏MOD&#xff08;即游戏修改器&#xff09;是一种能够对游戏进行修改或增强的程序&#xff0c;因其能够提升游戏体验&#xff0c;在玩家群体中拥有一定的市场。然而&#xff0c;这类程序大多由第三方开发者制作&#xff0c;容易缺乏完善的安全保障机制&#xff0c;这就为不法…

QT二 QT使用generate form 生成常用UI,各种UI控件

一 。没有使用general form 和 使用 general form 后&#xff0c;file层面和代码层面的不同比较 file层面的不同 代码层面的不同&#xff0c; 在 使用了general form之后&#xff0c;在主界面的构造方法中&#xff0c;使用ui->setupUi(this),就完成了所有UI的处理。 而之…

从PGC到AIGC:海螺AI多模态内容生成系统架构一站式剖析

海螺AI&#xff1a;基于多模态架构的下一代认知智能引擎 海螺AI核心模型架构基础模型&#xff1a;abab-6.5语音模型&#xff1a;speech-01 视频生成管线关键子系统快速接入海螺AI 蓝耘MaaS平台什么是MaaS平台&#xff1f;支持的大模型蓝耘搭载海螺AI的优势 实战应用教程如何注册…

二分查找上下界问题的思考

背景 最近在做力扣hot100中的二分查找题目时&#xff0c;发现很多题目都用到了二分查找的变种问题&#xff0c;即二分查找上下界问题&#xff0c;例如以下题目&#xff1a; 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…

算法系列——有监督学习——4.支持向量机

一、概述 支持向量机&#xff08;Support Vector Machine&#xff0c;SVM&#xff09;是一种应用范围非常广泛的算法&#xff0c;既可以用于分类&#xff0c;也可以用于回归。 本文将介绍如何将线性支持向量机应用于二元分类问题&#xff0c;以间隔&#xff08;margin&#x…

【图像处理基石】什么是HDR图片?

1. 什么是HDR图片&#xff1f; HDR&#xff08;高动态范围图像&#xff0c;High Dynamic Range&#xff09;是一种通过技术手段扩展照片明暗细节的成像方式。以下是关于HDR的详细说明&#xff1a; 核心原理 动态范围&#xff1a;指图像中最亮和最暗区域之间的亮度差。人眼能…

现代复古像素风品牌海报游戏排版设计装饰英文字体 Psygen — Modern Pixel Font

Psygen 是一种像素化等宽字体&#xff0c;具有强烈的复古未来主义和网络风格美学。块状的、基于网格的字体采用了早期的计算机界面、街机游戏排版和 ASCII 艺术。 该字体支持拉丁文、西里尔文和希腊文脚本&#xff0c;使其适用于多语言设计。扩展的字符集还具有唯一的符号和方…