MapKit 进阶教程: 自定义瓦片
原文:Advanced MapKit Tutorial: Custom Tiles
作者:Michael Katz
译者:kmyhy
在现代 app 中,地图的使用无处不在。地图可以提供 POI(兴趣点),为公园和城镇中的用户进行导航,寻找附近的人,跟踪旅程,或者在增强现实游戏中提供背景。
不幸的是,这也导致了每个 app 中的地图千篇一律。烦!
本教程介绍如何使用手绘地图,而不是用代码生成的地图,就像精灵宝可梦中的地图。
手绘地图是一个非常浩大的工程。考虑到地球太大,这种方法只适用于定义良好的、地理学意义上的小片区域。如果需要在你的地图上显示一个定义良好的小片地图,那么自定义地图能够为你的 app 增色不少。
开始
从这里下载开始项目。
MapQuest 的原型是一个有趣的冒险游戏。主角沿着纽约的中央公园奔跑(实景中),然后进行冒险,和怪物搏斗,并在现实交替(Alernate Reality)中搜集宝物。它采用了可爱的、童趣的设计,让玩家感觉舒适并表示游戏不会太危险。
游戏中有几个 POI,暗示了玩家能够和游戏发生交互的地方。会有一些谜题、怪物、情节或其它游戏元素。进入 POI 10米范围内会启动事件。处于教程的缘故,地图渲染才是主题,游戏玩法是次要的。
在这个项目中,有两个负责主要工作的类:
- MapViewController.swift: 负责处理 Map View 及 UI 逻辑和状态改变。
- Game.swift: 包含了游戏逻辑,以及管理一些游戏对象的坐标。
游戏的主要视图是一个 MKMapView。MapKit 通过各种缩放级别的瓦片图来填充视图,以及提供关于地理特征的信息,比如道路等。
map view 可以显示为传统的街道图,也可以显示为卫星图。对于在城市中导航来说,这是有用的,但如果你想在中世纪的世界中进行冒险,那就不合适了。因此,MapKit 允许你用自己的地图图片来定制美工和要显示的信息。
一个 map view 由许多张瓦片构成,它们在你平移视图时动态加载。瓦片图是256x256 大小,以网格方式铺开,这个网格对应于麦卡脱地图投影。
Build & run,亲眼看一下这张地图。
哇!漂亮的小镇。游戏的第一个界面是一个定位,也就是说,如果不到达中央公园的话,你什么都看不见、什么都不能做。
测试定位
和别的教程不同,MapQuest 是一个“接近完成”的准 app!但是,除非你正在纽约市生活,否则你就没那么幸运了。幸好,Xcode 提供了至少两种模拟位置的方法。
模拟位置
在 iPhone 模拟器上运行 app,设置用户位置。
打开 Debug\Location\Custom Location… 菜单。
将纬度设置为 40.767769 ,经度设置为 -73.971870。这会显示出用户位置的小蓝点,并将地图中心置于中央公园动物园。 那里住着一只哥布林;你必须和它战斗,然后获取它的财物。
一旦你击败这只可怜的哥布林,你应当位于动物园中了(注意小蓝点)。
模拟一次冒险
一个固定的位置对于许多基于定位的 app 来说是非常有用的。但是,这个游戏在冒险中需要拜访许多位置。模拟器可以模拟一次奔跑、骑行和驾驶的变化的位置。这些内置的旅程位于 丘珀蒂诺,但 MapQuest 只是在纽约。
这种位置的模拟需要用到 GPX 文件(GPS 交换格式)。这个文件中定义了许多路径点,而模拟器会在它们之间插入线段。
这个文件的制作不是本文的范围,不过在示例项目中已经包含了你测试用到的那个 GPX 文件了。
通过 Product\Scheme\Edit Scheme… 菜单,打开 Xcode 的 scheme 编辑器。
选中左窗格中的 Run,再选择右边的 Options tab 按钮。在 Core Location 一栏,勾上 Allow Location Simulation 选项。在 Default Location 下拉框中,选择 Game Test。
这样,app 会用 Game Test.gpx 文件中定义的路径点来模拟运动。
Build & run。
模拟器会模拟从第五大道向中央公园动物园进行移动,在那里你将再次和哥布林战斗。然后,你可以去水果公司的旗舰店买一把升级的宝剑。当这个循环结束,冒险将重新开始。
用 OpenStreetMap 替换瓦片图
OpenStreetMap 是一个由社区支持的地图数据的开放式数据库。这些数据可以用于生成苹果地图所用的同一类地图瓦片。Open Street Map 社区提供除了基本街道图之外许多东西,比如专门针对地型地貌、自行车的地图,以及艺术绘制。
注意:Open Street Map 瓦片许可协议对数据的使用、所有权和 API 访问有严格限制。在教程中使用还没有什么问题,但如果要在商业 app 中使用的话,请确认你没有违反它。
创建覆盖物
替换地图瓦片需要使用 MKTileOverlay 去显示新的瓦片图到苹果地图上面。
打开 MapViewController.swift,将 setupTileRenderer() 替换为:
func setupTileRenderer() {// 1let template = "https://tile.openstreetmap.org/{z}/{x}/{y}.png"// 2let overlay = MKTileOverlay(urlTemplate: template)// 3overlay.canReplaceMapContent = true// 4mapView.add(overlay, level: .aboveLabels)//5tileRenderer = MKTileOverlayRenderer(tileOverlay: overlay)
}
默认,MKTileOverlay 支持以 URL 模板来指定瓦片路径,并加载瓦片图。
- 用 Open Street Map API 抓取一个地图瓦片。 {x}, {y}, {z} 会在运行时用瓦片坐标替换。z 坐标或者缩放级别指定了用户缩放地图的倍数。x 和 y 是瓦片在地图上的区块索引。对于某个x,y 而言,每个缩放级别都需要提供一个瓦片。
- 创建覆盖物。
- 设置瓦片为不透明,这样就会替换默认的地图瓦片。
- 将覆盖物添加到 mapView。定制的瓦片会在街道上或者标签上(比如街道和地名)。Open Street Map 的瓦片是带地图标记的,因此它们会盖住苹果的地图标记。
- 新建一个 title render,用它绘制瓦片图。
在 viewDidLoad() 方法最后添加一句:
mapView.delegate = self
设置 MapViewController 为 mapView 的委托对象。
在 MapView Delegate 扩展中,添加方法:
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {return tileRenderer
}
一个覆盖物 renderer 用于描述 map view 应该如何绘制覆盖物。tile renderer 是它的一个子类,用于加载和绘制瓦片。
好了!Build & run,你会看到标准苹果地图被换成了 Open Street 地图:
现在,你发现开源地图和苹果地图确实不一样了吧!
分割地球
瓦片覆盖物的关键技术是能够将瓦片路径转换成特定的图片资源。瓦片路径是用坐标来表示的:x、y、z。x、y 表示了地图表面的索引,0,0 表示左上角的瓦片。z 坐标是缩放级别,这决定了整个地图需要用多少个瓦片构成。
缩放级别为 0 时,整个世界用一张 1x1 网格表示,只会用到一张瓦片:
缩放级别 1,整个世界被分割成 2x2 网格,需要 4 张瓦片:
缩放级别 2, 行数和列数分别乘以 2,需要 16 张瓦片:
以此类推,每个缩放级别的详细程度和瓦片数以 4 倍递增。每个缩放级别需要 2*2*z 张瓦片图,所有贴图从 0-19 缩放级别总共需要 274,877,906,944 张瓦片!
创建自定义瓦片
因为 map view 是跟随用户位置的,默认缩放级别为 16,这会给用户一个能够看到所处环境的比较好的细节显示。而在缩放级别 16 上,整个地球需要 4,294,967,296 张瓦片。如果用手画的话,一辈子也画不完!
将范围缩小一点,比如一个城市或者一座公园,才有可能使自定义瓦片成为可能。而超过这个范围,瓦片通过源数据程式化的生成。
因为在项目资源包中已经包含了游戏中所用的瓦片,你只需要将它们加载出来就可以了。但糟糕的是,普通的那种 URL 模板已经行不通了,因为如果 renderer 在请求数十亿张瓦片中的某张时发现 app 中没有,当然就只会返回失败。
要解决这个问题,你需要定义一个 MKTileOverlay 子类。打开 AdventureMapOverlay.swift 添加代码:
class AdventureMapOverlay: MKTileOverlay {override func url(forTilePath path: MKTileOverlayPath) -> URL {let tileUrl = "https://tile.openstreetmap.org/\(path.z)/\(path.x)/\(path.y).png"return URL(string: tileUrl)!}
}
我们定义了一个子类,覆盖基类的 URL 方法,用特殊的 URL 生成器来生成模板 URL。
为了测试自定义覆盖物,暂时先保持 Open Street Map 的瓦片不变。
打开 MapViewController.swift,修改 setupTileRenderer()方法:
func setupTileRenderer() {let overlay = AdventureMapOverlay()overlay.canReplaceMapContent = truemapView.add(overlay, level: .aboveLabels)tileRenderer = MKTileOverlayRenderer(tileOverlay: overlay)
}
这里换上了自定义的子类。
Build & run。如果一切正常,游戏应该和之前显示没有什么不同。耶✌️!
提前渲染瓦片
来点有趣的事情。打开 Open AdventureMapOverlay.swift,修改 url(forTilePath:) 方法:
override func url(forTilePath path: MKTileOverlayPath) -> URL {// 1let tilePath = Bundle.main.url(forResource: "\(path.y)",withExtension: "png",subdirectory: "tiles/\(path.z)/\(path.x)",localization: nil)guard let tile = tilePath else {// 2return Bundle.main.url(forResource: "parchment",withExtension: "png",subdirectory: "tiles",localization: nil)!}return tile
}
这些代码加载了游戏中的自定义瓦片。
- 首先,从资源束中根据命名规则查找匹配的瓦片图。
- 如果找不到,则用一张羊皮纸图案代替,以营造一种中世纪地图的氛围。这样就避免了为每个地图路径都提供一个唯一资源。
Build & run。自定义的地图显示了。
放大、缩小地图,你会看到细度不同的地图。
限制缩放级别
别放得太大或缩得太小,否则你会根本看不见自定义地图。
这个问题很容易搞定。打开 MapViewController.swift,在 setupTileRenderer() 方法最后添加:
overlay.minimumZ = 13
overlay.maximumZ = 16
这会告诉 mapView,只提供这两这个缩放级别之间的瓦片图。如果缩放级别超出此范围,将会用 app 中提供的瓦片图片进行拉伸。显示的图片不会更精细,但至少图片的大小对了。
创建瓦片
这一节是可选的,因为它讨论的是如何绘制自定义瓦片。要跳到后面的 MapKit 相关的技术部分,请直接跳到“修饰地图”一节。
整个练习中最困难的部分是如何创建正确尺寸的瓦片并正确地摆放它们。要画出自己的瓦片,你需要用到数据源和图片编辑器。
打开项目文件夹,看一眼 MapQuest/tiles/14/4825/6156.png 这张图片。这个瓦片显示的是中央公园动物园的底部,缩放级别 14。这个 app 中有许多这样的小图片,它们组成了纽约市这个游戏场景的地图,每个瓦片都是用非常简陋的技巧和工具手绘的。
你需要什么样的地图?
首先,需要明确你需要画出什么样的地图。你可以从 Open Street Map 下载源数据,然后用 MapNik 之类的工具生成瓦片图。不幸的是,要下载的源数据有 57 GB 之巨。同时工具有一点难用,也超出了本文的范畴。
对于有限的区域,比如中央公园,有一个简单的方法。
在 AdventureMapOverlay.swift 中在 url(forTilePath:) 后添加下句:
print("requested tile\tz:\(path.z)\tx:\(path.x)\ty:\(path.y)")
Build & run。当你缩放或平移地图时,瓦片路径会在控制台中输出。
接下来我们要读取源瓦片图并定制它。你可以重用和之前获取 Open Street Map 瓦片的 URL scheme。
下面的终端命令用于抓取并保存瓦片到本地。你可以修改 URL,将 x,y,z 替换成具体的地图路径。
curl --create-dirs -o z/x/y.png https://tile.openstreetmap.org/z/x/y.png
对于中央公园的南边,用:
curl --create-dirs -o 14/4825/6156.png https://tile.openstreetmap.org/14/4825/6156.png
通过 “缩放级别/x-坐标/y-坐标” 这种目录结构,到后面我们查找和使用瓦片图时会比较方便。
自定义外观
接下来是用原来的图片作为自定义的基础。用任意图片编辑器打开瓦片图,例如 Pixelmator:
你可以用铅笔或笔刷去描绘街道、路径等有意义的特征。
如果工具支持图层,你可以在单独的图层中绘制不同的特征,这样你就可以通过调整它们达到最佳效果。图层的使用让绘图更加轻松,你可以将凌乱的线条隐藏到其它图形之下。
对所有的瓦片图重复同样步骤,这样就准备好了。你知道的,这是件相当费时间的事情。
你可以将这个过程变成更简单一点:
- 首先,将所有的瓦片合并成一整张。
- 描绘自定义地图。
- 将地图重新切成瓦片。
保存瓦片图
做好自己的瓦片之后,将它们重新放到项目的 “tiles/缩放级别/x-坐标/y-坐标” 文件夹。这会将它们变得有序,容易访问。
这样你可以轻易访问它们了,就先之前添加在 url(forTilePath:) 方法中的代码那样。
let tilePath = Bundle.main.url(forResource: "\(path.y)",withExtension: "png",subdirectory: "tiles/\(path.z)/\(path.x)",localization: nil)
OK。现在你就准备来画几张漂亮的地图吧!
修饰地图
这个地图不错,就适合那种中世纪时代的游戏。但我们还应该定制更多的内容!
你的主角现在只是一个小蓝点,你可以用一张自定义的图片来替换它。
User Annotation
打开 MapViewController.swift 在 MapView Delegate 扩展中增加方法:
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {switch annotation {// 1case let user as MKUserLocation:// 2let view = mapView.dequeueReusableAnnotationView(withIdentifier: "user")?? MKAnnotationView(annotation: user, reuseIdentifier: "user")// 3view.image = #imageLiteral(resourceName: "user")return viewdefault:return nil}
}
这里创建了一个自定义 view 用作用户标注。
- 用户标注用 MKUserLoaction 对象表示。
- MapView 维护了一个重用的 annotation view 以提升性能。如果 dequeue 方法不能取出可重用的对象,则创建新对象。
- 标准的 MKAnnotationView 是非常灵活的,但要表示一位冒险者的话只需要用一张图片就可以了。
Build & run。现在小蓝点被小火柴人所代替。
特定位置的标注
MKMapView 允许你自己标注出你感兴趣的位置。MapQuest 的剧情是沿着纽约地铁展开的,你可以把地铁系统看成是一个巨大的曲变网络。
在地铁站附近添加一些标注。打开 MapViewController.swift, 在 viewDidLoad() 最后添加:
mapView.addAnnotations(Game.shared.warps)
Build & run, 选中一个地铁站,现在会显示大头钉。
和小蓝点一样,这些标准的大头钉和游戏的审美不太一致。可以通过定制标注来解决这个问题。
在 mapView(_:viewFor:) 在 switch 的 default 分支之上插入一个 case 分支:
case let warp as WarpZone:let view = mapView.dequeueReusableAnnotationView(withIdentifier: WarpAnnotationView.identifier)?? WarpAnnotationView(annotation: warp, reuseIdentifier: WarpAnnotationView.identifier)view.annotation = warpreturn view
Build & run。自定义的 annotation view 会使用一张模板图片,并在特定的地铁线路上标记出颜色。
在真实世界中,是否会存在一条能够瞬间曲变的地铁呢?
定制覆盖物的绘制
MapKit 有许多方法来打扮游戏地图。接下来,用 MKPolygonRenderer 在水塘上绘制出渐变的闪耀效果。
修改 setupLakeOverlay() 方法为:
func setupLakeOverlay() {// 1let lake = MKPolygon(coordinates: &Game.shared.reservoir, count: Game.shared.reservoir.count)mapView.add(lake)// 2shimmerRenderer = ShimmerRenderer(overlay: lake)shimmerRenderer.fillColor = #colorLiteral(red: 0.2431372549, green: 0.5803921569, blue: 0.9764705882, alpha: 1)// 3Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { [weak self] _ inself?.shimmerRenderer.updateLocations()self?.shimmerRenderer.setNeedsDisplay()}
}
这里创建了一个新的覆盖物:
- 创建一个 MKPolygon 标注,和水塘的形状一模一样。这些坐标定义在 Game.swift 中。
- 创建一个自定义的 Renderer,用指定的效果来绘制多边形。
- 因为覆盖物的 renderer 是不会动的,需要创建一个 100ms 的定时器去刷新覆盖物。
然后,修改 mapView(_:rendererFor:) 方法:
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {if overlay is AdventureMapOverlay {return tileRenderer} else {return shimmerRenderer}
}
这会根据不同的覆盖物类型返回正确的 renderer。
Build & run。平移到水池附近,你会看到粼粼水光!
结束
你可以从这里下载最终完成的项目。
绘制手绘地图是比较花时间的,但它能给 app 带来一种与众不同的感觉。但是一旦创建了这些图片资源,使用起来就非常简单了。
除了基本的瓦片,Open Street Map 还提供了一个特殊瓦片提供器列表,包含了诸如自行车和地形等内容。Open Street Map 也提供了必要的数据,可以允许你以代码方式设计自己的瓦片图。
如果你需要一个自定义同时现实主义的地图,不需要任何手绘内容,请看一下第三方的工具 MapBox。它允许你通过工具定制地图外观,而且价格也比较适中。
要了解更多关于自定义覆盖物和标注的内容,请参考其它教程。
如果你有任何问题和评论,请在下面留言!
Open Street Map 的数据和图片由 © OpenStreetMap 提供。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- python 标准库之xml.etree.ElementTree
简介Element类型是一种灵活的容器对象,用于在内存中存储结构化数据。[注意]xml.etree.ElementTree模块在应对恶意结构数据时显得并不安全。每个element对象都具有以下属性:1. tag:string对象,表示数据代表的种类。2. attrib:dictionary对象,表示附有的属性。3. text:s…...
2024/4/16 20:31:43 - 开发即过程!立此纪念一个IT新名词的诞生
近日拙文“Jazz--开放协作与开发即过程的前奏”参与了 Rational技术征文大赛 见http://tech.it168.com/focus/200903/rationalgame/index.html, 很荣幸获得了头名, 见http://www.itpub.net/viewthread.php?tid=1176225&page=1&extra=page=1不过对我个人来说最为得意…...
2024/4/16 20:32:13 - 在的一个批处理(BAT)文件中成功执行多个ant命令的操作
在dos命令行逐行输入以下的ant命令是没问题的。我想在一个批处理(BAT)文件中成功执行这几个ant命令的操作,觉得手工输入太麻烦, -------------------------------------- cls echo on Create a Test DB start....cd c:\aa ant buildcd ..\bb ant test.db1cd ..\cc ant test.db…...
2024/4/16 20:33:37 - 一款非常完善的开源的游戏服务端引擎
一款开源的游戏服务端引擎,使用简单的约定协议就能够使客户端与服务端进行交互,使用KBEngine插件能够快速与(Unity3D, OGRE, Cocos2d, HTML5, 等等)技术结合形成一个完整的客户端。 服务端底层框架使用c++编写,游戏逻辑层使用Python(支持热更新),开发者无需重复的实现一些游…...
2024/4/16 20:47:03 - 《微信终极秘籍》
1046个铁杆粉丝的力量 青龙老贼/文 2013年 1月 29日 ZTalk@青龙老贼这个微信公众账号正式创建,内容定位主要是移动互联网趋势和产品分析,以及微信领域相关研究文章,当然还有一些个人日记,那时候我从来没有想过有一天它会成为微信领域最专业的账号之一。 以前我是做产品技术…...
2024/4/16 20:32:43 - 常见数据结构算法总结
1、快速排序法 概念:排序速度非常快,采用分治思想 空间复杂度 快速排序是一种原地排序,只需要一个很小的栈作为辅助空间,空间复杂度为O(logn),所以适合在数据集比较大的时候使用。 时间复杂度 时间复杂度比较复杂,最好的情况是O(n),最差的情况是O(n^2),所以平时说的O(n…...
2024/4/19 15:59:42 - Mount与Mount Point是什么意思
Mount与Mount Point是什么意思 概述 我们平时经常见到“Mount”这个概念,它被译为“挂载”。例如在Root Explorer中,就会让你选择“挂载为只读/读写”,获取root权限以后就可以将整个系统挂载为读写,从而可以自由操作各种敏感文件。 “挂载”是一个动词,它一般用于各种存储…...
2024/4/16 20:34:01 - iOS体会篇 大学编程到公司的过程
原文作者:朱众 授权本技术博文转载。刚进公司时,在你正式动手写代码前,很可能要理解code base。这一过程至少持续1个月,取决于你所在项目的规模。你会发现你不得不使用你浑身所学之能事,理解上古程序员是如何解决一个个实际的问题的。有的时候你沾沾自喜,“哈哈,这个技巧…...
2024/4/20 5:32:21 - vue中自定义全局组件
需求:在vue 中需自定义一个全局组件 在components 中创建要自定义的组件文件demo,demo 文件中创建demo.vue、index.js 1、demo.vue自定义在自己的组件模版 <!-- 组件内容 --> <template><div class="demo">内容</div> </template>2、…...
2024/4/4 21:44:57 - IT项目管理实践经验分享
其实我本来是想找PMP考友的,但是无人应征,又看到版主的号召,所以就贴个实践经验分享贴,也找点志同道合者交流交流实践经验吧。我的msn ccjjgg79310@msn.comEmail ccjjgg79310@yahoo.com.cn有兴趣交流的,加我吧先说说自己的情况,制造型企业,集团公司,比较多的下属企业(…...
2024/4/27 23:10:03 - Bat文件批量处理----DOS命令
写在前面: 本文章旨在总结备份、方便以后查询,由于是个人总结,如有不对,欢迎指正;另外,内容大部分来自网络、书籍、和各类手册,如若侵权请告知,马上删帖致歉。(通常我们在编译完程序后,无论是IAR、Keil或者其他编译器都会产生一些编译垃圾,所以当我们想把这些编译后…...
2024/4/16 20:34:01 - 浅谈Android中微信的文本,音频,视频,链接,表情,图片分享接口开发详解
这次主要讲解带你一步一步开发微信的分享文本,音频,视频,链接,表情,图片功能,以及给出一些关于网上朋友们提出的微信分享闪退,微信分享失败等问题的解决办法。 第一实现调用打开微信客户端: 首先到微信开放平台(https://open.weixin.qq.com )上注册一个账号,然后在上…...
2024/4/16 20:32:49 - Unity安卓接入以及通信(详细教程)
相关问题:关屏幕再开屏幕导致重启问题https://blog.csdn.net/SnoopyNa2Co3/article/details/86215782Sdk接入一定涉及到安卓既接入和通信,虽然现在很多sdk只要打一下母包就可以出n个渠道的包,不过母包还是要接入安卓这次教程分两部分第一部分:unity接入安卓首先我们先确定一…...
2024/4/19 18:22:26 - 整人之bat重启文件
整人之bat重启文件这是一个很好玩儿的东西,对于身边的人就可以使用,也可以让自己的宿舍成员体验一下,就是一个病毒文件,其实,具体来说不是一个病毒,而是一个批处理文件。首先,建立一个bat文件,什么是bat文件呢?百度百科:bat文件是批处理文件,在DOS和Windows(任意)…...
2024/4/27 0:56:06 - 医疗信息化及医学影像处理常用名词
本文是参考博客园(http://www.cnblogs.com/kesalin/),及自己在工作中经常要接触到的医疗术语进行整理。这些都是医疗行业最常用的行业术语。医疗信息化:1. HIS: hospital informationsystem 医院信息系统,在国际学术界已公认为新兴的医学信息学(Medical Informatics)的重要分…...
2024/4/16 20:32:49 - 单用户模式下mount -o remount,rw / 有大用途
单用户模式下mount -o remount,rw / 有大用途我们的Linux系统在无法启动时候,通常需要进入单用户模式下进行修改一些配置文件,或调整一些参数方可。但是在进入单用户模式后,我们的/文件系统是只读模式,无法进行修改,那么这个时候我们就需要用到一条命令:mount –o remoun…...
2024/4/16 20:32:01 - 我的java设计模式 总结【2】strategy
文章目录策略模式举例或场景实现 策略模式 其实就是对做一件事,有不同的实现方式。这种实现方式就是一种策略,相同的事情不同的策略。 举例或场景对数组进行排序:那么排序就是事,而对于排序的实现可以有很多种,可以按照对象不同的属性进行排序,也可以按照不同的算法进行排…...
2024/4/18 9:28:59 - 四大开源3d游戏引擎探究(前言上)
本人水平有限,只对于长久以来研究的几个经典3d游戏引擎的设计思想、程序架构和应用行深入剖析的结果与游戏开发同行分享,文档有不妥之处请指出,期待我们的共同进步。 引擎名称: 1. orge(鬼怪) 2. Irrlicht(鬼火), 3. Nebula(星云) 4. klayGE(。…...
2024/4/16 20:32:13 - Android 实现视屏播放器、边播边缓存功能、外加铲屎(IJKPlayer)
Android 实现视屏播放器与边播边缓存功能外加蹲坑铲屎(IJKPlayer)hello,大家好,我就是那个会掀桌子的话唠,刚刚结束两篇关于音频播放与录制的文章,旧坑未埋就挖新坑,还望多多关照。最近累趴了,周末果断休假。快看,用力戳它:https://github.com/CarGuo/GSYVideoPlayer…...
2024/4/20 3:22:39 - bat中设置变量等于某命令返回值
batch文件中若想使用某个命令的返回值,可以通过for命令获得: for /f "delims=" %%a in (命令) do set a=%%a 比如现在想要使某变量值为你的主机名: for /f "delims=" %%a in (hostname) do set a=%%a 其中命令hostname返回主机名。 若是直接在命令行中敲…...
2024/4/16 20:33:07
最新文章
- P4360 [CEOI2004] 锯木厂选址
前言 显然啊,这道题应该用斜率优化来做,但是,又很显然,我不是那种喜欢推式子(雾,到最后还是推了啊)写 DP 的人,那么,刚好我学了模拟退火,那么就来试一试模拟…...
2024/4/27 23:39:25 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - jQuery(一)
文章目录 1. 基本介绍2.原理示意图3.快速入门1.下载jQuery2.创建文件夹,放入jQuery3.引入jQuery4.代码实例 4.jQuery对象与DOM对象转换1.基本介绍2.dom对象转换JQuery对象3.JQuery对象转换dom对象4.jQuery对象获取数据获取value使用val()获取…...
2024/4/26 21:12:47 - JavaEE 初阶篇-生产者与消费者模型(线程通信)
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 生产者与消费者模型概述 2.0 在生产者与消费者模型中涉及的关键概念 2.1 缓冲区 2.2 生产者 2.3 消费者 2.4 同步机制 2.5 线程间通信 3.0 实现生产者与消费者模…...
2024/4/24 13:18:03 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/26 18:09:39 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/26 20:12:18 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/26 23:05:52 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/27 4:00:35 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/26 21:56:58 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/27 9:01:45 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/25 18:39:16 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/26 22:01:59 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/25 18:39:00 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/26 19:46:12 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/27 11:43:08 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/27 8:32:30 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57