- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我使用 SDL 编写了一个显示相当大的瓷砖 map (大约 240*240 瓷砖)的模拟。由于我对 SDL 库还很陌生,所以我真的无法判断渲染超过 50,000 个图 block 时相当慢的性能是否真的正常。每个图 block 始终可见,大约 4*4 像素大。目前它通过 2d 数组迭代每一帧并渲染每个单独的图 block ,这给了我大约 40fps,太慢了,无法真正将任何游戏逻辑放在系统后面。
我试图找到一些替代系统,比如只更新更新的图 block ,但人们总是评论说这是一种糟糕的做法,渲染器应该在每一帧都被清理等等。
所以我基本上想问是否有比每帧渲染每个瓦片更高效的系统。
编辑:下面是我使用的简单渲染方法
void World::DirtyBiomeDraw(Graphics *graphics) {
if(_biomeTexture == NULL) {
_biomeTexture = graphics->loadImage("assets/biome_sprites.png");
printf("Biome texture loaded.\n");
}
for(int i = 0; i < globals::WORLD_WIDTH; i++) {
for(int l = 0; l < globals::WORLD_HEIGHT; l++) {
SDL_Rect srect;
srect.h = globals::SPRITE_SIZE;
srect.w = globals::SPRITE_SIZE;
if(sites[l][i].biome > 0) {
srect.y = 0;
srect.x = (globals::SPRITE_SIZE * sites[l][i].biome) - globals::SPRITE_SIZE;
}
else {
srect.y = globals::SPRITE_SIZE;
srect.x = globals::SPRITE_SIZE * fabs(sites[l][i].biome);
}
SDL_Rect drect = {i * globals::SPRITE_SIZE * globals::SPRITE_SCALE, l * globals::SPRITE_SIZE * globals::SPRITE_SCALE,
globals::SPRITE_SIZE * globals::SPRITE_SCALE, globals::SPRITE_SIZE * globals::SPRITE_SCALE};
graphics->blitOnRenderer(_biomeTexture, &srect, &drect);
}
}
}
因此在这种情况下,每个瓷砖都称为“站点”,这是因为它们还存储湿度、温度等信息。
每个站点在生成过程中都分配了一个生物群落,每个生物群落基本上都是一个 ID,每个陆地生物群落的 ID 都大于 0,每个水域 ID 都为 0 或更低。
这允许我将每个按 ID 排序的生物群系 Sprite 放入“biome_sprites.png”图像中。所有的地精基本上都在第一排,而所有的水瓦都在第二排。这样我就不必手动将 Sprite 分配给生物群落,并且该方法可以通过将图 block 大小(基本上是宽度)乘以生物群落来自行完成。
这是 biome ID table from my SDD/GDD和 actual spritesheet .
图形类中的 blitOnRenderer 方法基本上只是运行一个 SDL_RenderCopy 将纹理 blit 到渲染器上。
void Graphics::blitOnRenderer(SDL_Texture *texture, SDL_Rect
*sourceRectangle, SDL_Rect *destinationRectangle) {
SDL_RenderCopy(this->_renderer, texture, sourceRectangle, destinationRectangle);
}
在游戏循环中,每一帧都会调用 RenderClear 和 RenderPresent。
我真的希望我能理解地解释它,想问什么就问什么,我就是在向你们寻求帮助,所以我至少能做的就是合作 :D
最佳答案
向 SDL2 开发人员咨询 SDL_RenderCopy()
的多项版本(类似于现有的 SDL_RenderDrawLines()
/SDL_RenderDrawPoints()
/SDL_RenderDrawRects()
函数)和/或 batched SDL_Renderer 后端。
现在,您正在尝试 至少 240*240 = 57000 次绘制调用,使 GPU 无所适从;在给定的 16 毫秒内,您通常只能指望 1000-4000 次绘制调用。
或者切换到 OpenGL 并自己进行批处理。
关于c++ - SDL tilemap 渲染很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54688632/
我在 cocos2d-x 中使用等距 tilemap,我面临的一个问题与深度管理有关。玩家 Sprite 没有正确地隐藏在放置在不同瓷砖 map 层上的树木和房屋后面。我已申请 cc_vertexz
我正在尝试制作一个 TileMap,但是当我去渲染tileMap 并迭代 map 中的所有整数时,我得到一个ArrayIndexOutOfBoundsException。 这是渲染方法: public
我正在开发一个小应用程序,我在其中将 tilemap ( JSTilemap ) 加载到 sprite kit 中。 这一切都很好,除了瓦片 map 在纵向上看起来正常而且很好,但是当我翻转到横向时它
我在做一些本应非常简单的事情时遇到了一些麻烦。我无法让瓷砖的地板显示在背景图片上方。然而,我可以让我的所有其他游戏对象从我的控制面板显示到我的 HUD,甚至是在同一个瓷砖 map 中设置的硬币和怪物。
如何在基于 2D 图 block 的游戏中映射负 map 坐标?前任。 (-180,100)或 (10, -8) 我需要用 O(1) 来访问它们。我不想创建一个巨大的二维 vector 并将 (500
我正在创建一个 2d 横向卷轴游戏并且有一个关于碰撞的问题。我一直在阅读各种文章,其中一些文章说您应该有一个碰撞层,它与平铺层的样式完全相同,但只是存储位。我理解这个逻辑,但如果我的图 block 实
我用周围瓷砖的所有可能组合制作了一个自定义组。 我将它与我的 TileMap 上启用的自动映射模式一起使用,结果如下: 如您所见,有几个错误: 我以编程方式和在编辑器中都尝试过。行为是相同的。 我的想
我尝试了很多不同的解决方案,但我不太确定这是否是问题所在使用我的方法或者如果代码不起作用 例如, 我希望能够在我最初设置的值中设置下面数组中的值,这是我的尝试 function makepointfr
我找不到解决问题的方法。我平铺了一个图像并将其保存到一个位图数组中。现在我想把它填成一个 7 x 7 的网格。我需要这样做,因为我想访问并可能更改单个磁贴。我尝试了 Gridview,但似乎我只能设置
下面的代码应该用空格替换 tilemap 索引,但是没有任何反应。 瓷砖 map : var tilemap = [ "wwwwwwwwwwwwwwww", "wmmmmmmmmm
我希望用户在那里选择 map 大小,所以我不知道运行时 map 的大小。我一直在寻找如何实现这一点,但收效甚微。最接近正常工作的是 vector 变体,但在它运行时仍然无法正常工作。 我想要一个 3
我有两个瓷砖 map 。可以使用 WASD 移动一个(瓦片会立即移动到新位置),我想检测此瓦片 map 的瓦片何时与另一个瓦片 map 的瓦片发生碰撞。 两者都有 tilemapcollider2d
我使用 SDL 编写了一个显示相当大的瓷砖 map (大约 240*240 瓷砖)的模拟。由于我对 SDL 库还很陌生,所以我真的无法判断渲染超过 50,000 个图 block 时相当慢的性能是否真
我有兴趣尝试为 2D 游戏创建逼真的流体(水)。这个游戏类似于泰拉瑞亚。我听说过如何在场景中拍打一堆碰撞粒子并在其上进行渲染,瞧,逼真的水。 Terraria 使用基于瓷砖的水,我不喜欢它……我想要更
我正在计划使用 SpriteKit 和 Swift 为 iOS 开发一款平台游戏。我研究了如何处理玩家 Sprite 的碰撞并偶然发现了这篇文章。 http://www.learn-cocos2d.c
我正在使用 SDL2 编写一个在每一帧都显示瓦片 map 的游戏,但性能太慢了。我写了一个小程序来隔离问题。假设“temp.bmp”是一张 16x16 的图像。 #include #include
我正在寻找一种方法来创建一种新型的六边形规则图 block 来完成一些相当简单和具体的事情。我想创建一个六边形规则图 block ,该图 block 能够根据与它相邻的其他类型的六角形图 block
我正在尝试在运行时将我的一个可编写脚本的图块添加到我的 Unity Tilemap 中。我可以在编辑器中绘制磁贴,一切看起来都很好,但我想在运行时添加它。 我尝试实例化 ScriptableObjec
我使用 Tiled 软件创建了以下 map ,我想让箱子发挥作用。实际上,我想知道玩家和宝箱何时重叠,但即使搜索了几个小时我也找不到解决方案。 我正在使用 ARCADE 物理。我尝试使用对象层但没有任
这是我现在用来尝试生成 tilemap 的代码: // --- Javascript --- window.onload = function (){ var can = document.get
我是一名优秀的程序员,十分优秀!