增加首屏圖片

增加首屏圖片(bg.jpg)

web-mobile類型打包

//index.html腳本
<div id="myDiv_1111"style="background: url(./bg.jpg) 50% 50%/ 100% auto no-repeat ; width:100%;height:100%;position:absolute;"></div>
//游戲內腳本
var div = document.getElementById("myDiv_1111");setTimeout(function (){//銷毀div,即移除其從DoM中div.parentNode.removeChild(div);},700);

wechat類型打包
修改首屏文件(first-screen.js)

const VS_LOGO = `
attribute vec4 a_Position;
attribute vec2 a_TexCoord;
varying vec2 v_TexCoord;
void main() {gl_Position = a_Position;  v_TexCoord = a_TexCoord;
}`;const FS_LOGO = `
precision mediump float;
uniform sampler2D u_Sampler;
varying vec2 v_TexCoord;
void main() {gl_FragColor = texture2D(u_Sampler, v_TexCoord);
}`;const VS_BG = `
attribute vec4 a_Position;
attribute vec2 a_TexCoord;
varying vec2 v_TexCoord;
void main() {gl_Position = a_Position;  v_TexCoord = a_TexCoord;
}`;const FS_BG = `
precision mediump float;
uniform sampler2D u_Sampler;
uniform float u_flip;
varying vec2 v_TexCoord;
void main() {vec2 texCoord = v_TexCoord;if(u_flip > 0.5) {texCoord.y = 1.0 - texCoord.y;}gl_FragColor = texture2D(u_Sampler, texCoord);
}`;const VS_PROGRESSBAR = `
precision mediump float;
attribute vec4 a_Position;
attribute float a_Progress;
varying float v_Progress;
void main() {gl_Position = a_Position;  v_Progress = a_Progress;
}`;const FS_PROGRESSBAR = `
precision mediump float;
uniform float u_CurrentProgress;
varying float v_Progress;
uniform vec4 u_ProgressBarColor;
uniform vec4 u_ProgressBackground;
void main() {gl_FragColor = v_Progress <= u_CurrentProgress ? u_ProgressBarColor : u_ProgressBackground;
}`;const options = {alpha: false,antialias: true,depth: true,stencil: true,premultipliedAlpha: false,preserveDrawingBuffer: false,powerPreference: 'default',failIfMajorPerformanceCaveat: false,
};let gl = null;
let image = null;
let slogan = null;
let bg = null;
let program = null;
let programBg = null;
let programProgress = null;
let rafHandle = null;
let logoTexture = null;
let sloganTexture = null;
let bgTexture = null;
let vertexBuffer = null;
let sloganVertexBuffer = null;
let bgVertexBuffer = null;
let vertexBufferProgress = null;
let progress = 0.0;
let progressBarColor = [61 / 255, 197 / 255, 222 / 255, 1];
let progressBackground = [100 / 255, 111 / 255, 118 / 255, 1];
let afterTick = null;
let backgroundFilp = 1.0; // set 0 to not flip
let displayRatio = 1;
let bgColor = [0, 0, 0, 1];
let useCustomBg = true;
let useLogo = false;
let useDefaultLogo = false;
let logoName = 'bg.jpg';
let bgName = 'bg.jpg';function initShaders(vshader, fshader) {return createProgram(vshader, fshader);
}function createProgram(vshader, fshader) {var vertexShader = loadShader(gl.VERTEX_SHADER, vshader);var fragmentShader = loadShader(gl.FRAGMENT_SHADER, fshader);var program = gl.createProgram();gl.attachShader(program, vertexShader);gl.attachShader(program, fragmentShader);gl.linkProgram(program);var linked = gl.getProgramParameter(program, gl.LINK_STATUS);if (!linked) {var error = gl.getProgramInfoLog(program);console.log('Failed to link program: ' + error);gl.deleteProgram(program);program = null;}gl.deleteShader(fragmentShader);gl.deleteShader(vertexShader);return program;
}function loadShader(type, source) {var shader = gl.createShader(type);gl.shaderSource(shader, source);gl.compileShader(shader);var compiled = gl.getShaderParameter(shader, gl.COMPILE_STATUS);if (!compiled) {var error = gl.getShaderInfoLog(shader);console.log('Failed to compile shader: ' + error);gl.deleteShader(shader);return null;}return shader;
}function initVertexBuffer() {const widthRatio = 2 / canvas.width;const heightRatio = 2 / canvas.height;const heightOffset = 0.225;const vertices = new Float32Array([widthRatio, heightRatio + heightOffset, 1.0, 1.0,widthRatio, heightRatio + heightOffset, 1.0, 0.0,-widthRatio, heightRatio + heightOffset, 0.0, 1.0,-widthRatio, heightRatio + heightOffset, 0.0, 0.0,]);vertexBuffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
}function initSloganVertexBuffer() {const widthRatio = 2 / canvas.width;const heightRatio = 2 / canvas.height;const vertices = new Float32Array([widthRatio, heightRatio, 1.0, 1.0,widthRatio, heightRatio, 1.0, 0.0,-widthRatio, heightRatio, 0.0, 1.0,-widthRatio, heightRatio, 0.0, 0.0,]);sloganVertexBuffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, sloganVertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
}function initBgVertexBuffer() {const vertices = new Float32Array([1.0, 1.0, 1.0, 1.0,1.0, 0.0, 1.0, 0.0,0.0, 1.0, 0.0, 1.0,0.0, 0.0, 0.0, 0.0,]);bgVertexBuffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, bgVertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
}function initProgressVertexBuffer() {// the ratio value may be adjusted according to the image pixelsconst widthRatio = 0.5;const heightRatio = (window.devicePixelRatio >= 2 ? 6 : 3) / canvas.height * 1.35;const heightOffset = -0.8;const vertices = new Float32Array([widthRatio, heightOffset - heightRatio, 1,widthRatio, heightOffset + heightRatio, 1,-widthRatio, heightOffset - heightRatio, 0,-widthRatio, heightOffset + heightRatio, 0,]);vertexBufferProgress = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, vertexBufferProgress);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
}function updateVertexBuffer() {// By default, maintain aspect ratio by constraining display at 200px heightconst defaultRatio = 200 / image.height;const widthRatio = image.width / canvas.width * 1.35 * defaultRatio * displayRatio;const heightRatio = image.height / canvas.height * 1.35 * defaultRatio * displayRatio;const heightOffset = 1 / 6; // canvas:(-1,1) -> (button, top); heightOffset = (5/12) * (-2) + 1 = 1/6const vertices = new Float32Array([widthRatio, heightOffset - heightRatio, 1.0, 1.0,widthRatio, heightOffset + heightRatio, 1.0, 0.0,-widthRatio, heightOffset - heightRatio, 0.0, 1.0,-widthRatio, heightOffset + heightRatio, 0.0, 0.0,]);gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
}function updateSloganVertexBuffer() {// the ratio value may be adjusted according to the image pixelsconst widthRatio = slogan.width / canvas.width * 0.75;const heightRatio = slogan.height / canvas.height * 0.75;const logoHeightRatio = image.height / canvas.height * 1.35 * displayRatio;const heightOffset = (5 / 12 + logoHeightRatio * 1 / 2 + heightRatio * 3 / 2) * (-2) + 1; // 5/12 is ui design layout for logoconst vertices = new Float32Array([widthRatio, heightOffset - heightRatio, 1.0, 1.0,widthRatio, heightOffset + heightRatio, 1.0, 0.0,-widthRatio, heightOffset - heightRatio, 0.0, 1.0,-widthRatio, heightOffset + heightRatio, 0.0, 0.0,]);gl.bindBuffer(gl.ARRAY_BUFFER, sloganVertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
}function updateBgVertexBuffer() {const vertices = new Float32Array([1.0, 1.0, 1.0, 1.0,1.0, -1.0, 1.0, 0.0,-1.0, 1.0, 0.0, 1.0,-1.0, -1.0, 0.0, 0.0,]);gl.bindBuffer(gl.ARRAY_BUFFER, bgVertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);
}function loadBackground(bgPath) {return new Promise((resolve, reject) => {bg = new Image();bg.premultiplyAlpha = false;bg.onload = function () {resolve(bg);};bg.onerror = function (err) {reject(err);};bg.src = bgPath.replace('#', '%23');});
}function loadImage(imgPath) {return new Promise((resolve, reject) => {image = new Image();image.premultiplyAlpha = false;image.onload = function () {resolve(image);};image.onerror = function (err) {reject(err);};image.src = imgPath.replace('#', '%23');});
}function loadSlogan(sloganPath) {return new Promise((resolve, reject) => {slogan = new Image();slogan.premultiplyAlpha = false;slogan.onload = function () {resolve(slogan);};slogan.onerror = function (err) {reject(err);};slogan.src = sloganPath.replace('#', '%23');});
}function initLogoTexture() {logoTexture = gl.createTexture();gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D, logoTexture);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255]));
}function initSloganTexture() {sloganTexture = gl.createTexture();gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D, sloganTexture);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255]));
}function initBgTexture() {bgTexture = gl.createTexture();gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D, bgTexture);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 2, 2, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255, 0, 0, 0, 255]));
}function updateLogoTexture() {gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D, logoTexture);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image);
}function updateSloganTexture() {gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D, sloganTexture);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, slogan);
}function updateBgTexture() {gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D, bgTexture);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, bg);
}function drawTexture(gl, program, texture, vertexBuffer, vertexFormatLength) {gl.useProgram(program);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D, texture);var uSampler = gl.getUniformLocation(program, 'u_Sampler');gl.uniform1i(uSampler, 0);var uFlip = gl.getUniformLocation(program, 'u_flip');gl.uniform1f(uFlip, backgroundFilp);gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);var aPosition = gl.getAttribLocation(program, 'a_Position');gl.enableVertexAttribArray(aPosition);gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, vertexFormatLength * 4, 0);var aTexCoord = gl.getAttribLocation(program, 'a_TexCoord');gl.enableVertexAttribArray(aTexCoord);gl.vertexAttribPointer(aTexCoord, 2, gl.FLOAT, false, vertexFormatLength * 4, vertexFormatLength * 2);gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
}function drawProgressBar(gl, program, vertexBuffer, vertexFormatLength, progress, progressBarColor, progressBackground) {gl.useProgram(program);var uCurrentProgress = gl.getUniformLocation(program, 'u_CurrentProgress');gl.uniform1f(uCurrentProgress, progress);var uProgressBarColor = gl.getUniformLocation(program, 'u_ProgressBarColor');gl.uniform4fv(uProgressBarColor, progressBarColor);var uProgressBackground = gl.getUniformLocation(program, 'u_ProgressBackground');gl.uniform4fv(uProgressBackground, progressBackground);gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);var aPosition = gl.getAttribLocation(program, 'a_Position');gl.enableVertexAttribArray(aPosition);var vertexFormatLength = 4;gl.vertexAttribPointer(aPosition, 2, gl.FLOAT, false, vertexFormatLength * 3, 0);var aProgress = gl.getAttribLocation(program, 'a_Progress');gl.enableVertexAttribArray(aProgress);gl.vertexAttribPointer(aProgress, 1, gl.FLOAT, false, vertexFormatLength * 3, vertexFormatLength * 2);gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
}function draw() {gl.enable(gl.BLEND);gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);gl.clearColor(bgColor[0], bgColor[1], bgColor[2], bgColor[3]);gl.clear(gl.COLOR_BUFFER_BIT);// draw backgrounduseCustomBg && drawTexture(gl, programBg, bgTexture, bgVertexBuffer, 4);// draw logouseLogo && drawTexture(gl, program, logoTexture, vertexBuffer, 4);// draw sloganuseLogo && useDefaultLogo && drawTexture(gl, program, sloganTexture, sloganVertexBuffer, 4);// draw progress bardrawProgressBar(gl, programProgress, vertexBufferProgress, 3, progress, progressBarColor, progressBackground);
}function tick() {rafHandle = requestAnimationFrame(() => {draw();tick();if (afterTick) {afterTick();afterTick = null;}});
}function end() {return setProgress(1).then(() => {cancelAnimationFrame(rafHandle);gl.useProgram(null);gl.bindTexture(gl.TEXTURE_2D, null);gl.bindBuffer(gl.ARRAY_BUFFER, null);useLogo && gl.deleteTexture(logoTexture);useLogo && useDefaultLogo && gl.deleteTexture(sloganTexture);useCustomBg && gl.deleteTexture(bgTexture);gl.deleteBuffer(vertexBuffer);useCustomBg && gl.deleteBuffer(bgVertexBuffer);useLogo && useDefaultLogo && gl.deleteBuffer(sloganVertexBuffer);gl.deleteBuffer(vertexBufferProgress);gl.deleteProgram(program);gl.deleteProgram(programBg);gl.deleteProgram(programProgress);});
}function setProgress(val) {progress = val;return new Promise((resolve, reject) => {afterTick = () => {resolve();};});
}function start(alpha, antialias, useWebgl2) {options.alpha = alpha === 'true' ? true : false;options.antialias = antialias === 'false' ? false : true;if (useWebgl2 === 'true') {gl = window.canvas.getContext("webgl2", options);}// TODO: this is a hack method to detect whether WebGL2RenderingContext is supportedif (gl) {window.WebGL2RenderingContext = true;} else {window.WebGL2RenderingContext = false;gl = window.canvas.getContext("webgl", options);}initVertexBuffer();useCustomBg && initBgVertexBuffer();useLogo && useDefaultLogo && initSloganVertexBuffer();initProgressVertexBuffer();initLogoTexture();useCustomBg && initBgTexture();useLogo && useDefaultLogo && initSloganTexture();if (useLogo) {program = initShaders(VS_LOGO, FS_LOGO);}if (useCustomBg) {programBg = initShaders(VS_BG, FS_BG);}programProgress = initShaders(VS_PROGRESSBAR, FS_PROGRESSBAR);tick();return Promise.all([//logo should be loaded earlier than sloganuseLogo && loadImage(logoName).then(() => {updateVertexBuffer();updateLogoTexture();}).then(() => {return useLogo && useDefaultLogo && loadSlogan('slogan.png').then(() => {updateSloganVertexBuffer();updateSloganTexture();});}),useCustomBg && loadBackground(bgName).then(() => {updateBgVertexBuffer();updateBgTexture();})]).then(() => {return setProgress(0);});
}
module.exports = { start, end, setProgress };

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78234.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

貪心算法~~

目錄 一、理論基礎 二、題目練習 &#xff08;1&#xff09;455. 分發餅干 &#xff08;2&#xff09;53. 最大子數組和 - 力扣 &#xff08;3&#xff09;122. 買賣股票的最佳時機 II - 力扣&#xff08;LeetCode&#xff09; &#xff08;4&#xff09;860. 檸檬水找零…

形象解釋 HTTP 的四種常見請求方式及其中的區別聯系

HTTP 的常見請求方式常見的有四種&#xff1a;GET、POST、PUT、DELETE&#xff0c;它們各自的功能不一樣。 &#x1f35c; 場景比喻&#xff1a;HTTP 請求像“去餐廳點菜” 請求方式行為餐廳比喻說明GET獲取數據看菜單/問服務員&#xff1a;你們有什么菜&#xff1f;不帶食材、…

string的基本使用

string的模擬實現 string的基本用法string的遍歷&#xff08;三種方式&#xff09;&#xff1a;關于auto&#xff08;自動推導&#xff09;:范圍for: 迭代器普通迭代器(可讀可改&#xff09;const迭代器&#xff08;可讀不可改&#xff09; string細小知識點string的常見接口引…

kubernetes》》k8s》》證書有效期

cd /etc/kubernetes/pki openssl x509 -in apiserver.crt -text -noount通常&#xff0c;Kubernetes的證書是由kubeadm生成的&#xff0c;所以可能需要修改kubeadm的源碼或者配置 登錄Master節點 》》》默認延續1年 # 查看證書 檢查證書有效期 # 該命令顯示 /etc/kubernetes…

LangChain LCEL表達式語言簡介

LangChain表達式語言&#xff08;LCEL&#xff09;是專為構建AI應用鏈設計的聲明式編程框架&#xff0c;通過管道符|實現組件無縫銜接&#xff0c;支持流式處理、異步調用等生產級特性。其核心優勢在于零代碼改動實現原型到生產的過渡&#xff0c;同時保持代碼簡潔性和可維護性…

【計算機視覺】CV實踐項目- 基于PaddleSeg的遙感建筑變化檢測全解析:從U-Net 3+原理到工程實踐

基于PaddleSeg的遙感建筑變化檢測全解析&#xff1a;從U-Net 3原理到工程實踐 技術背景與項目意義傳統方法的局限性深度學習的優勢 核心技術與算法原理U-Net 3架構創新全尺度跳躍連接深度監督機制 變化檢測技術路線 實戰指南&#xff1a;從環境搭建到模型部署環境配置數據準備與…

萬字長文 | Apache SeaTunnel 分離集群模式部署 K8s 集群實踐

文章作者&#xff1a;雷寶鑫 整理排版&#xff1a;白鯨開源 曾輝 Apache SeaTunnel官網鏈接: https://seatunnel.apache.org/ Apache SeaTunnel(以下簡稱SeaTunnel&#xff09;是一款新一代高性能、分布式的數據集成同步工具&#xff0c;正受到業界廣泛關注和應用。SeaTunnel支…

深入解析YOLO v1:實時目標檢測的開山之作

目錄 YOLO v1 算法詳解? ?1. 核心思想? ?2. 算法優勢? ?3. 網絡結構&#xff08;Unified Detection&#xff09;?? ?4. 關鍵創新? ?5. 結構示意圖&#xff08;Fig1&#xff09;? Confidence Score 的計算? 類別概率與 Bounding Box 的關系? 后處理&…

信令與流程分析

WebRTC是h5支持的重要特征之一&#xff0c;有了它&#xff0c;不再需要借助音視頻相關的客戶端&#xff0c;直接通過瀏覽器的Web頁面就可以實現音視頻聊天功能。 WebRTC項目是開源的&#xff0c;我們可以借助WebRTC&#xff0c;構建自己的音視頻聊緹娜功能。無論是前端JS的Web…

BIOS主板(非UEFI)安裝fedora42的方法

BIOS主板(非UEFI)安裝fedora42的方法 現實困難&#xff1a;將Fedora-Workstation-Live-42-1.1.x86_64.iso寫入U盤制作成可啟動U盤啟動fedora42&#xff0c;按照向導將fedora42安裝到真機的sda7分區中得到報錯如下內容&#xff1a; /boot/efi 必需的 /boot/efi必須位于格式化為e…

安卓 Compose 相對傳統 View 的優勢

安卓 Compose 相對傳統 View 的優勢 文章目錄 安卓 Compose 相對傳統 View 的優勢1. 引言2. 核心概念&#xff1a;Compose的革新性設計2.1 Jetpack Compose2.2 傳統安卓View系統 3. 開發體驗&#xff1a;Compose大幅提升效率3.1 使用Jetpack Compose構建UI3.2 使用傳統View系統…

SIEMENS PLC 程序 GRAPH 程序解讀 車型入庫

1、程序載圖1 2、程序截圖2 3、程序解釋 這是一個基于西門子 GRAPH 編程的車型 1 入庫順序控制流程圖&#xff0c;通過狀態機結構&#xff08;狀態框 S 與轉移條件 T&#xff09;描述完整工作流程&#xff0c;具體如下&#xff1a; 整體流程概述 初始化&#xff1a;從 S1&am…

VuePress可以做什么?

VuePress 可以做什么 VuePress 是一個基于 Vue.js 的靜態站點生成器,專注于文檔和內容展示。它結合了 Markdown 的簡潔性和 Vue 的靈活性,適合多種場景的開發需求。以下是 VuePress 的主要用途和功能: 1. 技術文檔網站 VuePress 最初是為編寫 Vue.js 官方文檔而設計的,因…

架構-系統可靠性分析與設計

一、可靠性相關基本概念 1. 可靠性與可用性 可靠性&#xff1a;軟件系統在遇到錯誤、意外操作或系統故障時&#xff0c;仍能維持自身功能特性的能力。 舉例&#xff1a;手機銀行APP在用戶誤操作&#xff08;如快速點擊多次轉賬&#xff09;時&#xff0c;仍能正確處理交易并避…

再談String

1、字符串常量池 1.1 創建對象的思考 下面是兩種創建字符串對象的代碼 public static void main1(String[] args) {String s1 "hello";String s2 "hello";System.out.println(s1 s2);//trueString s3 new String("hello");String s4 new …

《深入淺出ProtoBuf:從環境搭建到高效數據序列化》?

ProtoBuf詳解 1、初識ProtoBuf2、安裝ProtoBuf2.1、ProtoBuf在Windows下的安裝2.2、ProtoBuf在Linux下的安裝 3、快速上手——通訊錄V1.03.1、步驟1&#xff1a;創建.proto文件3.2、步驟2&#xff1a;編譯contacts.proto文件&#xff0c;生成C文件3.3、步驟3&#xff1a;序列化…

基于PHP+Uniapp的互聯網醫院源碼:電子處方功能落地方案

隨著“互聯網醫療”政策紅利持續釋放&#xff0c;互聯網醫院已成為推動醫療數字化轉型的重要方向。在這一趨勢下&#xff0c;電子處方功能模塊作為核心環節&#xff0c;不僅直接關系到線上問診閉環的實現&#xff0c;也成為系統開發中技術難度較高、業務邏輯最為復雜的一部分。…

ARM Cortex-M (STM32)如何調試HardFault

目錄 步驟 1: 實現一個有效的 HardFault 處理程序 步驟 2: 復現 HardFault 并使用調試器分析 步驟 3: 解讀故障信息 步驟 4: 定位并修復源代碼 HardFault 是 ARM Cortex-M 處理器中的一種異常。當處理器遇到無法處理的錯誤&#xff0c;或者配置為處理特定類型錯誤&#xff…

基于歸納共形預測的大型視覺-語言模型中預測集的**數據驅動校準**

摘要 本研究通過分離共形預測&#xff08;SCP&#xff09;框架&#xff0c;解決了大型視覺語言模型&#xff08;LVLMs&#xff09;在視覺問答&#xff08;VQA&#xff09;任務中幻覺緩解的關鍵挑戰。雖然LVLMs在多模態推理方面表現出色&#xff0c;但它們的輸出常常表現出具有…

LangChain4j 搭配 Kotlin:以協程、流式交互賦能語言模型開發

Kotlin 支持 | LangChain4j Kotlin 是一種面向 JVM&#xff08;及其他平臺&#xff09;的靜態類型語言&#xff0c;能夠實現簡潔優雅的代碼&#xff0c;并與 Java 庫無縫互操作。 LangChain4j 利用 Kotlin 擴展和類型安全構建器來增強 Java API&#xff0c;為其增添特定于 Ko…