Articles of 内存效率的

有效地创建和管理一个非常大的tileMap

我正在做一个二维JRPG建立在一个鸟瞰tileMap上,我不能完全包围我的脑子,我将如何有效地做到这一点 我想使用50X50块,在玩家所在的邻近4个邻近点中的玩家周围呈现。当玩家从块移动到块时,与其相邻的所有块都被渲染,并且只有这些块其余的以前渲染的块被删除 我也需要一种方法来有效地处理由用户修改的块 如果你的答案可以提供必要的材料,所以我可以做这两件事的研究,我将不胜感激 方法,将允许有效的块加载和存储 一种方法来保持由玩家修改的块“保存”以备后用 如果你能列出所有必要的事情,我需要做到这一点,我真的很感激

有没有理由保持地图内存?

我已经注意到, 很久以来,游戏(大多数是FPS)在用户完成之后不卸载地图(也就是说,从服务器断开,服务器不断变化的地图)。 这样做的结果是地图被保存在内存中 ,这可能导致巨大的内存使用5GB的区域2小时CoD:黑色行动2或大约8GB的同一时间的Crysis Wars会议。 这个行为最引人注目的游戏(我注意到)是孤岛危机系列和使命召唤:黑色行动2。 我已经注意到这个已经有好几年了,但是现在我正在“升级”Crysis Wars(修复bug,增加function,并将它移植到我的新的多人networking),我已经能够在游戏完成时卸载地图。 因此,在玩了两个小时之后,内存使用量从平均8GB下降到了2GB(testing时我跳过了几次服务器)。 当游戏不再需要他们的bug时,是否将地图保存在内存中?还是有目的的? 这个“内存泄漏”存在于其他“孤岛危机”游戏中,也是“使命召唤”系列(也是在游戏机上,虽然我不确定这一点),所以它似乎是有目的的,而不是一个错误。 我也看了一下,从服务器断开后实际上保留着什么,似乎所有的实体都被留下,但地形和hightmaps被删除。 类似的事情可能发生在CoD:BO2,我也观察到了这一点。 显然我不想从内存中清除地图,但是在“孤岛危机战争”中我注意到没有任何副作用。

最小,最有记忆效率的方式有瓷砖? (C ++ / OpenGL的)

我需要在我的游戏中有瓷砖,只有16×16的图像,会有数百(甚至数千)的组成一个级别。 当然,拥有成千上万个内存的普通实体是不可行的,但是tile只是重复的图像。 什么是最有记忆效率的方式做瓷砖?

内存使用量每帧增加〜10kb

我目前正在开发Android游戏(使用SDK)并试图减less内存使用量。 我发现在每一帧中,内存使用量增加了大约10kb。 游戏运行速度为60fps,因此每秒钟增加了超过半个兆字节,随着时间的推移,游戏的总内存使用量大大增加。 这不是一个很大的问题,一段时间后,内存被垃圾收集器释放,并返回到正常的水平。 尽管如此,我想知道这样的每帧内存增加对于Java开发的游戏是否正常。 如果没有,是否有任何提示或解决scheme来减less帧内存增加(除了没有实例化对象在每个更新/绘制调用 – 我已经确定我没有这样做)。 这是我的游戏的绘制方法: public void draw(Canvas canvas){ if(screenScaleX > 1f || screenScaleY > 1f) canvas.scale(screenScaleX, screenScaleY); canvas.drawColor(Color.BLACK); if(skipFrames > 0){ skipFrames–; return; } pp.preDraw(this, canvas); scrollX = (player == null ? 0 : player.getBounds().getX()) * SCALE_FACTOR – 1280f / 2f; scrollY = (player == null ? 0 : player.getBounds().getY()) […]

我如何构建一个数据结构,在GameMaker 8.1及更早版本中保存/加载?

我希望在Game Maker中构建数据结构,如树,链表,graphics,堆栈,队列等。 然而,Game Maker Version 8.1及更早版本中的对象概念并没有一个可靠的指针概念。 只要有东西被删除或实例化,它们就会移动,如果所有东西都依赖于指针构造,那么它们显然是不好的。 我认为这背后的动机是避免一个悬挂的指针错误,但它使对象几乎无用。 “ds _…”函数中的内置数据结构在保存和加载时不会保留。 他们完全没有得到保证。 这从长远来看也不是很好,因为它可能使复杂的结构随机分解。 因此,这引出了一个普通的数据结构如何实现不存在这个问题的问题? 由于Game Engine Studio中引擎的指针实现的最新更新,问题本身不再存在,因为指针不需要洗牌以防止悬挂的指针exception(显然这是咳嗽的无效咳嗽deviseselect背后的动机)。 然而,由于语言中的对象有些臃肿,这个问题仍然是一种寻求内存的方式 – 便宜的解决scheme来解决这个问题。 原始的游戏制作软件的用户或者尝试修改以旧代码为基础的基于代码修改的游戏的用户将仍然受益于这篇文章。

C ++结构不正确地alignment像素着色器cbuffer

为了扩展我以前的问题 ,我必须添加我不能正确映射我的C ++结构像素着色器内的相应的cbuffer 。 当输出在结构C ++端定义的随机颜色,它发生我得到错误的结果,即一个XMFLOAT4(0,0,0,1.0)会给我一个红色(?)。 所以这里是一个代码示例: __declspec(align(16)) struct SceneParams { bool DEAOEnabled; XMFLOAT4 DEAOColor; double DEAOPow; bool lightEnabled; XMFLOAT4 lightColor; XMFLOAT3 lightDirection; bool lightMultiply; double lightMultiplyFactor; bool ambiantLightEnabled; XMFLOAT4 ambiantLightColor; bool HSEnabled; int HSSpread; bool fogEnabled; XMFLOAT4 fogColor; double fogDistanceMax; bool glowEnabled; XMFLOAT4 glowColor; double glowRadius; XMFLOAT4 skyColor; bool skyBoxEnabled; //uniform sampler2D skyBoxTexture; int […]

video游戏中典型3D角色的RAM消耗范围是多less?

三维角色的平均内存容量是多less? 当然,这显然是基于我们正在谈论的游戏的偏见。 但是,我对KB的实际大小不太感兴趣,对范围更感兴趣。 简单来说,一个大概的想法 我想知道这些信息,将其与我的2D游戏进行比较。 目前,我的2D游戏几乎可以精确地衡量一个角色在内存中占用多less内存。 目前的公式是这样的:95KB *animation数*帧数*方向数。 例如,如果一个角色有一个15帧的空闲animation和15帧的步行animation,角色有4个方向可以移动,那么这个角色在内存中占用11.4MB。 3D角色必须加载他们的网格,纹理和animation。 2D字符只是加载图像。 然而,有数百个animation – 我只能想象2D角色最终会超过3D角色的内存需求。 我需要大致了解我应该在屏幕上限制多less个字符,如何在内存中加载我的角色和animation等等。当我在内存中交换纹理时,我得到了一些性能命中,可能是因为它们是大的spritesheet。 我不知道如果不使用spritesheets会解决这个问题。 我总是被告知“雪碧performance对performance有好处”。 那么3D游戏呢? 任何示例都可以工作,而且不一定是真正的范围。 我只想知道我可能在看什么。 低质量3D游戏的例子和高质量3D游戏的例子将是完美的。

我们如何解决2D游戏中的大video内存需求?

我们如何解决2D游戏中的大video内存需求? 我们正在用allegro C / C ++开发2D游戏(Factorio),随着游戏内容的增加,我们正面临一个随着video内存需求的增加而出现的问题。 我们目前收集所有关于将要使用的图像的信息,尽可能地剪切所有这些图像,并尽可能紧密地将它们组织成大的地图集。 这些地图集存储在video内存中,其大小取决于系统的限制; 目前通常是8192×8192的2张图像,所以需要256Mb到512Mb的video内存。 这个系统对我们来说非常好,就像一些自定义的优化和分割渲染和更新线程一样,我们能够以60fps的速度在屏幕上绘制成千上万的图像; 我们在屏幕上有许多对象,并且允许大的缩小是关键要求。 由于我们想补充一点,video内存需求会有一些问题,所以这个系统是不可能成立的。 我们想要尝试的事情之一是有一个最常见的图像图集,第二个作为caching。 图像将根据需要从内存位图中移出。 这种方法有两个问题: 在快板中,从内存位图到video位图的绘制非常缓慢。 除了主线程以外,不能在video位图上使用快进,所以几乎不可用。 这里有一些额外的要求,我们有: 游戏必须确定,所以性能问题/加载时间永远不会改变游戏状态。 游戏是实时的,很快也会成为多人游戏。 我们需要不惜一切代价避免最小的口吃。 大部分游戏是一个连续的开放世界。 testing包括从1×1到300×300的批量绘制10000个精灵,每个configuration几次。 我在Nvidia Geforce GTX 760上做了testing。 video位图到video位图的绘制每个精灵0.1us,当源位图在各个位图(地图集变体)之间没有变化时; 大小并不重要 video位图到video位图的绘制,源位图在graphics之间切换(非地图集版本),每个精灵花费0.56us; 大小也没有关系。 内存位图到video位图的绘制真的很可疑。 尺寸从1×1到200×200每个位图占用0.3us,所以速度并不那么可怕。 对于更大的尺寸,时间开始大幅度增加,201×201的9us到291×291的3116us。 使用地图集将性能提高了5倍以上。如果我有10ms的渲染速度,使用地图集,每帧限制在10万个精灵,如果没有它,限制为20000个精灵。 这将是有问题的。 我也试图find一种方法来testing位图压缩和1bpp位图格式的阴影,但我无法find一种方法来做这个在快板。