首页 文章 精选 留言 我的

精选列表

搜索[oppo],共606篇文章
优秀的个人博客,低调大师

OPPO、努比亚筹划自建网盘

继三星、努比亚和乐视手机宣布关闭云存储服务后,南都记者留意到,O P P O手机也挂出了“网盘业务调整公告”。公告称:“由于方案商业务调整,从C olorO S 3 .0起将暂停网盘服务。” 6月10日,努比亚发布公告称由于与百度合作协议过期将关停努比亚手机的云存储;6月14日乐视超级手机宣布因为乐视云盘停止服务而彻底关停乐视手机的云存储服务;而去年11月,三星云宣布停止网络存储服务,三星云A P P下架并在今年1月20日全面删除云盘内的用户数据。 手机厂商或将自建云盘 有业内人士猜测今年的新一波云盘停服或与云存储服务费用上涨有关?但O P P O方面回复南都记者称,“跟云存储涨价无关,和业务规划有关”,O P P O将会采用自建网盘或更换云服务商的方案,“可以确定的是,O P P O网盘的关闭只是暂时的,云盘会重新启动并且提供更好的体验。” 努比亚方面同样回复南都记者称,他们会采用自建网盘,“自建网盘的用户体验会比较好,有针对性的专人管理。” 值得注意的是,乐视发布的公告显示,乐视手机将于6月30日后停止LeCloud云存储服务(包括图库APP中的云相册和文件管理APP中的云盘),并未透露是否重新恢复该服务。“乐视云存储是乐视手机和乐视云盘联合开发的额外服务,由乐视云盘提供云存储技术支持,由于一些原因,乐视云盘已经发布了停服公告,整个业务即将关停,因此整个合作无法继续维持下去。” 个人云盘服务商所剩无几 至于手机厂商和百度等云盘服务商停止合作的原因,O PPO和努比亚方面均未透露;乐视云盘团队的公告则称,“由于部分不法分子利用云盘存储传播盗版、淫秽色情等非法文件,乐视云盘决定停止个人云盘服务。” 本文转自d1net(转载)

优秀的个人博客,低调大师

OPPO 快游戏在浏览器复现运行(五)之竖屏适配

大部分竖屏快游戏都很少有兼顾宽屏分辨率的情况,Laya 游戏会有一个自动横屏的机制,会将整个画面横向显示,而像 CC 游戏,基本都是 UI 位置大小严重失调,要么导致某些区域点不了,要么导致 UI 飞出屏幕外,根本看不到点不着。针对这两个常见的游戏框架做了一个竖屏适配修复,可以用修复代码在启动阶段将游戏画面按设定好的比例强制自适配调整。推荐比例:`9:16`、`10:16`、`9:20`。 ``` fixPortrait() { if (window.cc) { _fixCCPortrait(); } else if (Laya) { _fixLayaPortrait(); } } _fixLayaPortrait() { if (!Laya) return; const bestRatio = window.sdkConfig?.bestRatio; let maxRatio = 9 / 20; if (bestRatio) { const [w, h] = bestRatio.split(':').map(Number); maxRatio = w / h; } Laya._stage = Laya.stage; Object.defineProperty(Laya, 'stage', { set: function(val) { Laya._stage = val; const setScreenSize = val.setScreenSize; let _rawWidth = 0; let _rawHeight = 0; val.setScreenSize = function(width, height) { const pixelRatio = Laya.Browser.pixelRatio; let rawWidth = width / pixelRatio; let rawHeight = height / pixelRatio; if (rawWidth / rawHeight > maxRatio) { rawWidth = rawHeight * maxRatio; width = rawWidth * pixelRatio; height = rawHeight * pixelRatio; } _rawWidth = rawWidth; _rawHeight = rawHeight; setScreenSize.apply(val, [width, height]); }; const identity = val._canvasTransform.identity; val._canvasTransform.identity = function(...args) { identity.apply(val._canvasTransform, args); val._canvasTransform.tx = (Laya.Browser.clientWidth - _rawWidth) / 2; return val._canvasTransform; }; const scale = val._canvasTransform.scale; val._canvasTransform.scale = function(...args) { scale.apply(val._canvasTransform, args); val._canvasTransform.tx = (Laya.Browser.clientWidth - _rawWidth) / 2; return val._canvasTransform; }; }, get: function() { return Laya._stage; }, configurable: true, enumerable: true, }); } _fixCCPortrait() { const cc = window.cc; const view = cc?.view; const canvas = cc?.game?.canvas; if (!view || !canvas) return; const bestRatio = window.sdkConfig?.bestRatio; let maxRatio = 9 / 20; if (bestRatio) { const [w, h] = bestRatio.split(':').map(Number); maxRatio = w / h; } const getViewport = (width?: number, height?: number) => { const viewportWidth = width || window.innerWidth || document.documentElement.clientWidth; const viewportHeight = height || window.innerHeight || document.documentElement.clientHeight; return { width: Math.max(1, viewportWidth), height: Math.max(1, viewportHeight), }; }; const applyViewportStyle = (viewportWidth?: number, viewportHeight?: number) => { const viewport = getViewport(viewportWidth, viewportHeight); const width = Math.min(viewport.width, viewport.height * maxRatio); const height = viewport.height; if (view._frameSize) { view._frameSize.width = width; view._frameSize.height = height; } if (canvas.style) { canvas.style.position = "fixed"; canvas.style.left = `${Math.round((viewport.width - width) / 2)}px`; canvas.style.top = "0px"; canvas.style.width = `${Math.round(width)}px`; canvas.style.height = `${Math.round(height)}px`; canvas.style.margin = "0px"; } }; const initFrameSize = view._initFrameSize; view._initFrameSize = function() { initFrameSize.apply(this, arguments); applyViewportStyle(); }; const setDesignResolutionSize = view.setDesignResolutionSize; view.setDesignResolutionSize = function() { const result = setDesignResolutionSize.apply(this, arguments); applyViewportStyle(); return result; }; const setCanvasSize = view.setCanvasSize; if (typeof setCanvasSize === "function") { view.setCanvasSize = function(width: number, height: number) { const viewport = getViewport(width, height); const result = setCanvasSize.call(this, viewport.width, viewport.height); applyViewportStyle(viewport.width, viewport.height); return result; }; } const refreshResolution = () => { applyViewportStyle(); const resolution = view._originalDesignResolutionSize || view._designResolutionSize; if (!resolution || resolution.width <= 0 || resolution.height <= 0) return; view.setDesignResolutionSize( resolution.width, resolution.height, view._resolutionPolicy, ); }; window.addEventListener("resize", refreshResolution); window.addEventListener("orientationchange", refreshResolution); this.onWindowResize(refreshResolution); if (typeof view._resizeEvent === "function") { view._resizeEvent(true); } else { refreshResolution(); } } ```

优秀的个人博客,低调大师

OPPO 快游戏在浏览器复现运行(七)之远程资源离线化

**完全的离线化仅适用于走快游戏 API 的资源,部分资源是直接通过 `img` 标签或者其他方式加载的(最终会 fallback 到 XHR)还是会到本地服务器发起请求。`web.sdk.js` 不对此类资源做特殊拦截处理,做离线化的本意是解决版本更新后在线资源的失效问题,对快游戏做 web 移植本身就需要一个静态服务器托管,所以这个并不算大问题。如果需要完完全全的离线化,可自行对游戏逻辑做魔改拦截。** 针对使用 Cocos Creator 框架制作的游戏,在 `_CCSettings` 中一般能看到以下字段:`remoteBundles`、`bundleVers`,`remoteBundles`是远程 Bundle 列表,`bundleVers`是所有 Bundle 列表,比如: ``` window._CCSettings = { remoteBundles: ["resources"], bundleVers: { internal:"b3cad", b0:"10607", b1:"f37a4", data:"5bf88", resources:"011ae", main:"c0c83" } }; ``` 远程 Bundle 可能会依赖其他 Bundle,为了远程 Bundle 能顺利的加载,需要先通过 `loadBundle` 拿到 Bundle 配置中的 `deps`,统计完整依赖链,再按依赖顺序逐个加载。 ``` async function loadCCBundle(names, unload = false) { names = Array.isArray(names) ? names : [names]; const bundles = Object.create(null); const visited = Object.create(null); const visiting = Object.create(null); const order = []; function unloadBundle(name) { const bundle = cc.assetManager.getBundle(name); if (bundle) { bundle.releaseAll(); cc.assetManager.removeBundle(bundle); } } function loadBundle(name) { return new Promise(function (resolve, reject) { if (unload) { unloadBundle(name); } const exists = cc.assetManager.getBundle(name); if (exists) { resolve(exists); return; } cc.assetManager.loadBundle(name, function (err, bundle) { if (err) { reject(err); return; } resolve(bundle); }); }); } function loadDir(bundle) { return new Promise(function (resolve, reject) { window.qg.consolelog('loadDir start: ' + bundle.name); bundle.loadDir('', function (err) { if (err) { reject(err); return; } window.qg.consolelog(bundle.name + ' resources loaded'); resolve(bundle); }); }); } async function visit(name, stack) { if (visited[name]) { return; } if (visiting[name]) { throw new Error('Circular bundle deps: ' + stack['concat'](name).join(' -> ')); } visiting[name] = true; const bundle = await loadBundle(name); const deps = bundle.deps || []; bundles[name] = bundle; window.qg.consolelog('bundle deps: ' + name + ' -> ' + JSON.stringify(deps)); for (let i = 0; i ')); for (let i = 0; i < order.length; i++) { const name = order[i]; const bundle = bundles[name] || await loadBundle(name); await loadDir(bundle); } window.qg.consolelog('all bundle resources loaded'); } catch (err) { window.qg.consoleerror(err); } } // 然后就可以正式下载远程 Bundle 了 loadCCBundle(window._CCSettings.remoteBundles); ``` 此时应该可以看到控制台已经在疯狂下载资源了,但还不够,因为我们需要将这些资源保存放到本地,以便后续离线化加载。 这时候就到了 `remote-cache` 上场了,它本质上就是一个转发保存程序,收到请求后,重定向到真正的远程资源,并将资源原样返回的同时将资源保存到本地。 修改 `_CCSettings` 中的 `server` 字段: ``` window._CCSettings = { server: `http://127.0.0.1:9999/${originServer}`, }; ``` 然后再次尝试 `loadCCBundle`,当所有远程 Bundle 都进行 `loadCCBundle`之后,就可以对 `_CCSettings` 中的 `server` 字段做一个小调整,将远程资源改成本地资源: ``` window._CCSettings = { server: `/https.xxx.com/xxxxxxxxxx`, }; ``` 此时游戏已经完成远程资源的本地化了。 某些游戏是运行时通过 JS 动态加载的,此类逻辑没法提前预加载,只能通过人工的方式去到对应的场景下触发下载,做这类逻辑的游戏一般都比较捞。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册