Articles of 性能

在封闭path上定位点,以最大化加权点样本的距离总和

我正在做一个简单的困惑游戏的人工智能,需要有效地解决以下问题(小于1秒的范围指定,因为我需要在游戏中做很多迭代)。 从左上角开始以1个单位间隔在正方形(0至200,000,000)的边上分布N(1至100,000)个强度为1至10,000的怪物的样本。 将英雄移动到正方形上的一个点X上,以最大化加到怪物上的距离的总和。 每个怪物的加权距离由MonsterStrength * ShortestDistanceToX(顺时针或逆时针)计算。 X也必须在1单位间隔标记上,怪物和英雄只在广场的两侧移动 我已经尝试了几种方法,但都不够快或不够准确。 这个问题的可能的补充(最小化到距离原始集合中每个对应怪物最远距离处的距离总和)似乎与寻找几何中值,设施位置问题,Weber问题等有关。 线性编程也是可能的,但可能太慢而且过度。 有没有人有一个好方法的想法? 这里是长度为3的两边正方形的插图: 1 ——- 2(M / 3)——- 3 —— 4(M / 1) | | 12(M / 2)5 | | 11(M / 1)6 | | 10 ——– ——— 9 8(X)——- 7 如果你把一个3的强度为2的怪物,一个在4的强度1,一个在12的强度2,一个在11的强度为1,英雄(X)在8,加权distne的总和是:3 * 6 + 1 * 4 + 1 * 3 + 2 * 4 […]

配料和表演

我想了解配料,我不知道如何去做,我可以有更多的信息吗? 这是我现在发现的: 批量信息 有很多types的配料: 雪碧配料 几何配料 ??? 雪碧配料 只有一个绘制调用绘制所有精灵是非常有用的。 要做到这一点,一个SpriteBatcher类需要获取具有相同材质和相同几何体(sprite = square geometry)的所有网格。 获取相同材质的精灵 将所有Sprite的matrix发送到Sprite着色器( http://antonholmquist.com/blog/sprite-batching-opengl-es-2-0/ ) 几何配料(使用静态几何) 合并网格的几何,所以我们可以在一个绘图调用中绘制所有的网格。 获取所有静态网格 合并网格的几何graphics,并用matrix计算它们的位置(计算一个VBO和IBO) 隐藏原始网格以避免两次绘制。 我对吗? 谢谢!

我应该使用对象引用还是整数值来将棋子存储在棋盘上?

只是一个关于跳棋项目的一般性问题。 我为游戏作品建立了一个类层次结构(可以扩展为国际象棋等)。 层次结构看起来像 interface GamePiece() {…} class EmptySquare implements GamePiece {…} class Pawn implements GamePiece extends EmptySquare {…} class Queen implements GamePiece extends EmptySquare {…} 我将一个对象引用存储在board[][]数组中。 在树中search该数组是克隆每个recursion(不与doMove() …调用recursion… undoMove() )。 我存储游戏片段的对象参考,所以我可以做这样的事情来生成移动列表: for(sq:Squares) sq.getPossibleMoves() possibleMoves.addAll(sq.possibleMoves) 我不确定这个引用数组占用了多less空间,如果从性能的角度来看它是一个好的方法。 它在逻辑上很好地工作。 你会这样做,还是牺牲更好的代码来使用更紧凑的游戏板arrays,并且使用switch()来调用每个片段的子例程来创建移动列表?

每个连接的Websocket服务器线程

我正在创建一个html5多人游戏,并且正在研究如何创建一个websocket服务器。 我一直在寻找各种图书馆,我注意到,每个人都会为每个连接的客户端创建一个新的线程。 现在我对websocket还是比较陌生的,但是我知道在过去,当谈到游戏服务器devise时,每个连接的线程是不好的做法。 这对websockets是否正确? 为什么每个连接都需要一个新线程?

剔除vs绘制调用

在比桌面CPU / GPU(即移动设备)更高性能敏感的环境中,确定是否跳过绘制不可见对象与减less绘制调用次数的确切点有关? 我正在处理一个具有〜10,000个三角形的环境模型。 我可以将它分成30个左右的网格,这样在任何给定的点上都可以看到不到一半的网格。 然而,对于所有的10,000个三角形来说,15次绘制的调用是否比一次绘制的调用效率更高?

光照贴也被认为是纹理吗?

我希望我的游戏支持最大纹理尺寸为1024的手机,所以我的纹理地图集是1024.我的问题是:lightmaps是否也被视为纹理,其最大尺寸必须是1024? 或者他们可以有像4096更高的尺寸?

当我的玩家碰到一个特定的对象(解决scheme已知,不确定如何实现)

我正在使用LibGDX开发Android游戏(尽管这比引擎问题更像是一个JAVA问题)。 我的目标是让我的球员从一个弹簧反弹到另一个弹簧,最终将他带走一个障碍如下: 我有一种感觉,滞后是因为即时通讯在update()调用的方法中创建新的对象。 这是因为我在游戏中遇到了与硬币相同的问题,直到我停止在由update()调用的方法中初始化Coin对象 – 现在它们工作正常。 但是,我不确定如何在没有初始化Spring对象的情况下实现弹簧碰撞。 目前,对象是通过一个文本文件来初始化的 – 但是, Spring只是在Box对象而不是文本文件中初始化的。 在我的update()方法中循环遍历对象,如果一个对象是一个包含Spring的Box ,则调用以下方法: public void playerSpringCollision(Box containsSpring) { // first spring (on the box) Spring boxSpring = containsSpring.getSpring(); // second spring (on the platform) Spring platformSpring = containsSpring.getPartnerPlatform().getSpring(); // distance in x between first & second spring float dx = platformSpring.getxPos() + platformSpring.getSprite().getWidth() – boxSpring.getxPos() […]

OpenGL在Windows上慢速渲染50万个点

我怎样才能加快在Windows上的OpenGL绘图? 我有一个Qt 5.9.1应用程序,显示实时激光雷达数据,所以在一定的频率,我添加点到我的缓冲区(我已经超载作为一个循环缓冲区)。 在linux上,一切都很好,我所有的渲染器(我的激光雷达点,我的三维模型等)的渲染速度只有60帧/秒的一小部分。 然而,在Windows上,渲染激光雷达点几乎需要两个60 FPS帧的时间。 我测量了这个在glDrawArrays()调用之后插入glFlush()和glFinish() 。 我的缓冲区大小约为1/2百万点。 我试图展示可能跨越几公里的点,但通常只限于1公里 – 我提到这一点,因为现在我没有做任何明确的截锥体挑选。 我的过程是: 从一个向量加载新的点到我的重载循环OpenGL缓冲区。 每个点是20个字节(位置,强度,..) 写所有我的统一variables(MVPmatrix等) 调用glDrawArrays 然后有一个顶点着色器只是传递数据 实例化每个视口点的几何着色器(3) 片段着色器,通过标高来着色点。 明确: 初始化 : auto LidarRenderer::initPointShaders() -> void { point_opengl_buffer_.setUsagePattern(QOpenGLBuffer::DynamicDraw); initializeOpenGLFunctions(); // Setup our vertex buffer object. point_opengl_buffer_.create(); render_program_ = make_unique<QOpenGLShaderProgram>(); // Vertex shader pretty much just passes points through render_program_->addShaderFromSourceFile(QOpenGLShader::Vertex, vertex_shader_); render_program_->addShaderFromSourceFile(QOpenGLShader::Geometry, geo_shader_); render_program_->addShaderFromSourceFile(QOpenGLShader::Fragment, fragment_shader_); […]

快速select可见的儿童组件

我在gui上工作,我有基本的UI组件的下一个实现: 所以当我想要得到绝对的分量位置时,我需要将所有的父位置与分量位置相加。 另外,如果我想跳过组件的渲染,万一如果它在父组件之一出界,我需要通过所有的父母,并检查这一点。 如果组件数量过多(大约10,000),这种方法不是很快,所以我的ups从2600降低到每秒400更新。 也直到呈现我需要计算剪切矩形通过与当前矩形相交的所有父矩形。 海事组织也是一点点沉重的操作,以防万一一个大树组件。 有什么办法可以增加它吗? 或者一些快速的方式来select只有可见的组件而不检查列表中的每个组件? 也许应该有一些另外的组件结构?

摩托罗拉68000上的快速赛车物理

我已经有一个稳定的3D引擎,在系统的随机芯片上运行速度为60 fps,假设我保持polycount合理,60 fps可以保证(至less在TimeTrial模式下有这样的testing轨迹)没有敌人存在)。 68000(20MHz以下)已经在做这个(手写汇编器): input AI 碰撞检测跟踪 细节层次(只是距离检查和网格指针交换) 相机插值(高程差) 一般的游戏状态管理 所以,不言而喻的是,在当前帧内没有太多的性能可用(保持60 fps),像刚体物理这样的过度使用解决scheme的所有向量,点积,交叉积(和相关的膨胀)。 通过试错&基准testing,我提出了以下68000scheme,速度非常快,允许参数化车辆特性,如加速/扫射(玩家需要在具有不同参数的车辆之间进行select): 通过Speed = LUTSpeed [idxSpeed] 进行非线性加速 (每按一次Up / Down,我们就会将idxSpeed加1) LUTSpeed [] = { 1,1,1,2,2,2,2,2,2,3,3,3,3,3,4,4,4,5,5,6 } 通过Strafe = LUTStrafe [idxStrafe] 进行非线性Straing (每次我们按左/右键我们将加/减1的idxStrafe) LUTStrafe [] = { 1,1,1,2,2,2,2,2,2,3,3,3,3,3 } Hill通过RelativeSpeed 加速/减速 = LUTRelSpeed [idxTrackPosition]将在轨道加载时基于山坡计算 LUTRelSpeed [] = { 0,0,0,0, 1,2,2,2, 0,0,0, -1, -1, -2, -4, […]