首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView ...

1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目“GameSurfaceView”,首先自定义一个类"MySurfaceView",此类继承SurfaceView,并实现android.view.SurfaceHolder.Callback接口,代码如下 MySurfaceView 修改MainActivity类,让其显示自定义的SurfaceView视图 public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //显示自定义的SurfaceView 视图 setContentView(new MySurfaceView(this)); } } 配置文件中设置应用程序为全屏 android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 具体说明可查看代码。 2.SurfaceView视图添加线程 在游戏中,基本上不会等到用户每次触发了按键事件、触屏事件才去重绘画布,而是会固定一个时间去刷新画布:比如游戏中的倒计时、动态的花草、流水等等,这些游戏元素并不会跟玩家交互,但是这些元素都是动态的。所以游戏开发中会有一个线程不停的去重绘画布,实时的更新游戏元素的状态。 当然游戏中除了画布给玩家最直接的动态展现外,也会有很多逻辑需要不断的去更新,比如怪物的AI(人工智能)、游戏中钱币的更新等等。 下面给上面实例中的SurfaceView视图添加线程,用于不停的重绘画布以及不停地执行游戏逻辑。 实例效果如下: 修改后,MySurfaceView类代码如下: MySurfaceView 代码说明: (1)线程标识位 Introductions (2)获取视图的宽和高 Introductions (3)绘图函数 try 一下 Introductions (4)提交画布必须放在 finally 中 Introductions (5)刷帧时间尽可能保持一致 Introductions 上面的MySurfaceView 类继承surfaceview类,并且使用回调callback接口以及线程runnable接口。那么这里简单的说下Callback接口和SurfaceHolder 类的作用; callback接口: 只要继承SurfaceView类并实现SurfaceHolder.Callback接口就可以实现一个自定义的SurfaceView了,SurfaceHolder.Callback在底层的Surface状态发生变化的时候通知View,SurfaceHolder.Callback具有如下的接口: surfaceCreated(SurfaceHolder holder):当Surface第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Surface。 surfaceChanged(SurfaceHolder holder, int format, int width,int height):当Surface的状态(大小和格式)发生变化的时候会调用该函数,在surfaceCreated调用后该函数至少会被调用一次。 SurfaceHolder 类: 它是一个用于控制surface的接口,它提供了控制surface 的大小,格式,上面的像素,即监视其改变的。 SurfaceView的getHolder()函数可以获取SurfaceHolder对象,Surface 就在SurfaceHolder对象内。虽然Surface保存了当前窗口的像素数据,但是在使用过程中是不直接和Surface打交道的,由SurfaceHolder的Canvas lockCanvas()或则Canvas lockCanvas()函数来获取Canvas对象,通过在Canvas上绘制内容来修改Surface中的数据。如果Surface不可编辑或则尚未创建调用该函数会返回null,在 unlockCanvas() 和 lockCanvas()中Surface的内容是不缓存的,所以需要完全重绘Surface的内容,为了提高效率只重绘变化的部分则可以调用lockCanvas(Rect rect)函数来指定一个rect区域,这样该区域外的内容会缓存起来。在调用lockCanvas函数获取Canvas后,SurfaceView会获取Surface的一个同步锁直到调用unlockCanvasAndPost(Canvas canvas)函数才释放该锁,这里的同步机制保证在Surface绘制过程中不会被改变(被摧毁、修改)。 本例没有在该surfaceview的初始化函数中将其 ScreenW 与 ScreenH 进行赋值,这里要特别注意,如果你在初始化调用ScreenW = this.getWidth();和ScreenH = this.getHeight();那么你将得到很失望的值 全部为0;原因是和接口Callback接口机制有关,当继承callback接口会重写它的surfaceChanged()、surfaceCreated()、surfaceDestroyed(),这几个函数当surfaceCreated()被执行的时候,真正的view才被创建,也就是说之前得到的值为0 ,是因为初始化会在surfaceCreated()方法执行以前执行,view没有的时候我们去取屏幕宽高肯定是0,所以这里要注意这一点; 这里把draw的代码都try起来,主要是为了当画的内容中一旦抛出异常了,那么也能在finally中执行该操作。这样当代码抛出异常的时候不会导致Surface出去不一致的状态。 3.View 和 SurfaceView 的区别 1.更新画布 在 View 视图中对于画布的重新绘制,是通过调用 View 提供的 postInvalidate() 与 invalidate() 这两个函数来执行的,也就是说画布是由系统主 UI 进行更新。那么当系统主 UI 线程更新画布时可能会引发一些问题;比如更新画面的时间一旦过长,就会造成主 UI 线程被绘制函数阻塞,这样一来则会引发无法响应按键、触屏等消息的问题。 SurfaceView 视图中对于画布的重绘是由一个新的单独线程去执行处理,所以不会出现因主 UI 线程阻塞而导致无法响应按键、触屏信息等问题2.视图机制 Android 中的View 视图是没有双缓冲机制的,而 SurfaceView 视图却有!也可以简单理解为, SurfaceView 视图就是一个由 View 拓展出来的更加适合游戏开发的视图类。 View 与 SurfaceView 都各有其优点: 比如一款棋牌类游戏,此类型游戏画面的更新属于被动更新;因为画布的重绘主要是依赖与按键和触屏事件(当玩家有了操作之后画布才需要进行更新),所以此类游戏选择 View 视图进行开发比较合适,而且也减少了因使用 SurfaceView 需单独起一个新的线程来不断更新画布所带来的运行开销。 但如果是主动更新画布的游戏类型,比如RPG、飞行射击等类型的游戏中,很多元素都是动态的,需要不断重绘元素状态,这时再使用 View 显然就不合适了。 所以到底开发游戏使用哪种视图更加的合适,这完全取决于游戏类型、风格与需求。 总体来说, SurfaceView 更加适合游戏开发,因为它能适应更多的游戏类型。 本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/4159104.html,如需转载请自行联系原作者

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

构建IoT基础设施,国内最大高精度定位服务商如何玩转“自动驾驶朋友圈”?

自动驾驶初体验 10 月 12 日,云栖大会第 2 天,杭州仍是整天的降雨。在云栖小镇,雷锋网(公众号:雷锋网)·新智驾试乘了千寻和清华大学苏州汽车研究院的自动驾驶测试汽车。 车辆启动。坐在前排的驾驶员手自觉远离方向盘,并刻意使脚与离合、刹车保持一定距离,车辆在小镇的双向单车道上开始行驶,并最终保持在 20 km/h 的速度上。 我们乘坐的是一辆九龙的商务车,车辆共配置了 1 个 16 线的 Velodyne 激光雷达, 1 个毫米波雷达和 1 个 Mobileye摄像头,这是自动驾驶汽车上常见的传感器组合。但不易被直接感知的是,行驶过程中,直行、转弯、巡航、避障等各个环节,都伴随着千寻高精度定位与高精度地图的配合,为车辆的感知、决策与控制提供强大支持。 虽然是封闭园区,但因为云栖大会巨大的人流量,路上行人、车辆不断,而因为恰好赶上

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

AI是新的电能,百度如何将人工智能变成今天的“基础设施”?

财富杂志在近两周刊文《为什么深度学习会一夜间改变你的生活?》。文中讲到,过去四年来,我们身边的很多技术都骤然跃进。其中最为明显的莫过于每个人手机里的语音助手都变得通晓人性了,无论是亚马逊的Alexa、微软的Cortana还是苹果的Siri,都能在我们需要的时候飞快又精确地帮我们联系到各自的爱人。 image credit: science.howstuffworks.com 以深度学习为代表的人工智能技术的引入,就像通电一样,使得原本沉闷的机器、设备一下子变得灵动和善解人意。而在技术演进的背后,是微软、苹果、谷歌、亚马逊、百度这些巨头公司数年甚至数十年的投入推动。 在今年的百度世界大会上,李彦宏说“移动互联网的下一幕是人工智能。而人工智能是(公司)核心中的核心。”作为国内最早投入人工智能研发的公司之一,我们来看看百度是如何把AI变成电能

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

间谍卫星的基础?YOLT——利用卷积神经网络对卫星影像进行多尺度目标检测(Part I)

本文由北邮@爱可可-爱生活老师推荐,阿里云云栖社区组织翻译。 以下为译文: 利用卷积神经网络,对于卫星影像中多尺度目标检测而言,你只需要看两次(Part I) 在大片物体中检测小物体一直是卫星图像分析感兴趣的主要点之一。早期的工作是利用本地滑动窗和HOG特征描述确定船的位置,但存在的缺点是高度不均匀背景下分辨不清晰。为了解决这一问题,实现了一种基于“你只要看两眼”的物体检测流水线,该方法极大的提高了背景区分,并能够在不同尺度和多个传感器上快速检测出物体。 1卫星图像目标检测概述 卫星图像库与ImageNet数据库不一样,存在四个问题:卫星图像的对象往往是非常小的并围绕成一个圆、输入图像巨大、训练数据相对缺乏;积极的一面是物体的物理和像素规模是实现已知的,观察角度也是低变化的。 图1. 《纽约时报》截图显示俄罗斯设计的武器实物模型愚弄遥感仪器。 2HOG船检测挑战 HOG+滑动窗物体检测方法在前期工作中取得瞩目成果,为了探索该方法的限制,将其应用于场景不太均匀的背景。 图2.HOG+滑动窗应用于不同传感器的结果。假阴性显示是红色,手工标记显示是黄色,误报显示是蓝色,真阳性显示是绿色 3使用深度学习进行物体检测 在卫星图像上采用YOLO框架去完成目标检测,该框架使用了单一的卷积层(CNN)去预测类别和边界。这种快速方法结合获取背景信息的能力使得其应用在卫星图像中是引人注目的。 CNN与滑动窗结合的方法可以取得客观的效果,但是难以计算。另外一个缺点是,滑动窗只可以看到图像的一小部分,从而丢弃有用的背景信息。该YOLO框架解决了背景差异的问题,并扩展成大的数据集。 图3. 说明YOLO框架的缺省 该框架确实是有些局限性,但在文献中封装了三个问题,具体问题可以参看文献和原文。 针对这些问题,提出了YOLT框架,解决了上述的三个问题,分别使用滑动窗上采样以寻找小的物体、在多尺度上运行探测器;增加训练数据;定义新的网络架构使得最后的卷积层有更紧密的网格。 YOLT框架的输出的后处理结合了各种图形芯片,这些修改使得每秒44帧的速度降低为每秒18帧。如果寻找密集物体不是必须的,最大图形尺寸应该会增加2-4倍。 4YOLT训练数据 训练数据收集大图像中的小块,每个对象的标签是由边界框和类标识符组成。 主要集中以下四类: 开放水域的船 在港湾的船 飞机 飞机场 图4. YOLT训练数据 图5. 训练图像在色相和饱和度上旋转和缩放 5YOLT目标检测结果 对评估测试图像使用相同的评价标准;对于海上区域的评估,关注相同的区域。在硬件上仿真后,与之前方法的结果相比,HOG+滑动窗是用来训练分类船和船的航向,而YOLT是用来训练产生船和飞机的位置信息。具体性能分析请见原文。 图6. YOLT在AOI1的性能 图7. YOLT在AOI2的性能 图8. YOLT在AOI3的性能 图9. YOLT在AOI4的性能 图10. YOLT在美济礁使用如图2所示的相同卫星测试的结果 图11. YOLT应用到苏伊士运河的南入口的卫星图像 图12. YOLT检测应用到DigitalGlobe图像中,上图拍摄于希斯罗机场 6结论 这篇文章中,展示了一个经典机器学习技术应用于卫星图像目标检测的局限性;为了解决这个局限性,实现了一个完全卷积神经网络分类(YOLT)去快速获得卫星图像中的船只和飞机的位置,在稀疏场景的分类性能证明比HOG+滑动窗方法更好。 在Part II部分,将探讨在完全不同尺度上检测目标,比如在船只、飞机和跑道上的挑战。 数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧! 文章原标题《You Only Look Twice — Multi-Scale Object Detection in Satellite Imagery With Convolutional Neural Networks (PartI)》,作者:Adam Van Etten 文章为简译,更为详细的内容,请查看原文 翻译:海棠

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

阿里巴巴淘票票专家分享:如何利用阿里云ARMS,搭建国际化在线售票的业务监控系统

阿里巴巴旗下-淘票票 王伟 撰稿 1. 简介 淘票票为了开拓国际业务,需要做国际化的在线售票,并选择了阿里云新加坡节点作为技术方案,项目上线后急需一套自动化的监控系统代替人肉维护监控。看了ARMS的功能说明,发现其刚好以很低的接入成本来满足我们业务实时监控的需求,因此决定采用阿里云的业务实时监控服务(ARMS)做业务监控。 业务的基本需求是需要实时大盘和报警功能,对要实时统计订票接口的各种状态进行统计和报警,包括: 订票成功率,从业务层面看是否系统运行正常。 订票接口状态,如响应时间,同比环比调用,等,从系统层面看是否系统运行正常。 以下篇幅从日志设计到配置,到最终大盘展示。 2. 监控配置 2.1. 采集日志 ARMS基本原理是采集日志通过实时流式计算出聚合数据监控业务,可以通过ECS,LogHub,SDK等多种方式获得日志源,这里我们选择LogHub,因为我们所有使用阿里云的ECS已经采集日志到日志服务上,只需要简单通过配置即可让ARMS从LogHub上获取日志。 采集到LogHub上的原始日志示例为: 2017-08-21 13:54:48,805|20170821|2f58c35e15033448888056471d27aa|tibizrouter|HSFBizProcessor-5-thread-265|INFO|API_DIGEST:108|RegionAPIImpl|getRegionNotice|1|0|Y[{"appChannel":"000100","appDevice":"458805f1934f07_dwada29t0gCNkDAIQwAJI4EOia__353317069054105","appEnv":"PROD","appPlatform":"ANDROID","appVersion":"4.1.2","regionId":1}]|- 2017-08-21 13:54:48,806|20170821|2f58d75c13231228888057385d7976|tibizrouter|HSFBizProcessor-5-thread-244|INFO|API_DIGEST:108|ConfigAPIImpl|getByGroup|3|0|Y|[{"appChannel":"000100","appDevice":"660d3b4bd6872442__WX/m9PEqA2cDANH6dYHwh2k6__3550awdaw61314546","appEnv":"PROD","appPlatform":"ANDROID","appVersion":"4.2.0"}]|- 按照我们定义的分隔符解析日志格式为JSON,格式示例如下: {"__column15__":"28667","__column16__":"","runtime":"449","__column17__":"","__column14__":"4","response":"-","appName":"tigateway","time":"2017-04-19 21:24:20,462","apiName":"ticketnew","logLevel":"INFO","request":"{\"boxOffice\":\"TICKETNEW\",\"extAreaId\":\"3\",\"extCinemaId\":\"4\",\"extScheduleId\":\"28667\"}","traceId":"2f58d75c1492608260eeaa2072d7d0f","thread":"HSFBizProcessor-5thread-42","resultCode":"0","__column18__":"","indiaTime":"20170419","logName":"API:73","method":"PULL_SOLD_SEAT","success":"Y"} {"runtime":"1","response":"-","appName":"tibizrouter","time":"2017-04-19 21:24:21,102","apiName":"MovieAPIImpl","logLevel":"INFO","request":"[{\"appChannel\":\"000100\",\"appDevice\":\"ANcca0bff117c2faaf__WPnpLeWzcDAIlMjjPv2LJS\",\"appEnv\":\"PROD\",\"appPlatform\":\"ANDROID\",\"appVersion\":\"4.1.0\",\"movieId\":2515,\"regionId\"1}]","traceId":"2f58d75c1492adwa611022076d7d0f","thread":"HSFBizProcessor-5-thread-40","resultCode":"0","indiaTime":"20170419","logName":"API_DIGEST:108","method":"getMovieDetail","success":"Y"} 其中: • method是业务方法名,通过appName,apiName和method来唯一确定某个应用系统上某个接口的业务方法; • success用来表示该业务方法执行成功与否; • resultCode来用表示方法返回的错误码; • runtime表示该方法执行的时间,单位为毫秒,可以用来统计哪些方法执行较慢,做后期优化; • request为方法请求参数。 2.2.配置切分 对以上已经存在的字段按照JSON切分器切分,为了计算成功率,还需要把成功数转换成数字类型,方便在数据集做累加来计算。 2.3.配置数据集 配置接口成功率,通过sum累加得到成功的数量successCount,通过count得到总数量totalCount,使用successCount/totalCount得到成功率,当然也可以额外计算平均接口耗时等参数,在通过下砖维度获取按维度的成功率。 2.4.配置报警 由数据集可以直接配置报警,当成功率低于一定阈值的时候直接发出报警,实时监控线上业务,最大成都降低业务影响范围。 2.5.配置业务大盘 通过配置好的数据集就可以配置业务接口成功率大盘了,用来监控各个业务的实时稳定性。 3. 业务提升 我们通过ARMS对目前线上大部分业务性能指标如成功率,接口错误码分布,接口平均响应时间等性能参数做了实时监控,尤其在前段时间两次重大活动中及时发现线上性能问题,针对特定问题及时响应解决起了巨大的作用,提升了业务稳定性和业务响应速度。 除稳定性方面,我们也通过ARMS配置实时业务数据监控,通过按维度统计订单,用户访问等业务数据,根据不同时间段的业务数据快速调整业务运营和决策,对业务增长起了很好的推动作用。 ARMS正在公测,速来

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册