我想添加像素飞溅和粒子效果的游戏。为此,我的选择是有一堆预先制作的动画形式的纹理,或创建一个粒子引擎。
对于粒子引擎方法,据我所知,我的选项是创建像素并使用以下两种方法呈现它们:
我不知道什么是更好的方法。#2可能更容易一些,因为我有一个基于快速纹理呈现的整个系统(不一定比1更快,但似乎更容易用我的当前系统实现)。#1看起来很理想,因为它在SDL2库中是有原因的,但我真的不确定我应该采用哪种方法。
发布于 2016-12-31 17:33:09
因此,我运行了两个函数100,000次(运行几次只是为了确保),并使用time.h计时。我在0,0呈现了一个简单的1x1像素,在0,0呈现了一个1x1像素的纹理。下面基本上是我发现的一次试验。
SDL_RenderDrawPoint:所用时间为9毫秒
SDL_RenderCopy:时间为266毫秒
毫不奇怪,RenderDrawPoint比RenderCopy快得多。我的尝试并不完美,因为我可能已经能够使用一个更优化的纹理,并且不得不为SDL_RenderCopy使用一些变量,但是我怀疑它增加了很多时间来使RenderCopy更接近RenderDrawPoint。
编辑(本质上是我使用的代码,renderer
是窗口渲染器,texture
是使用RLE优化加载的纹理中的1x1位图面):
#include <time.h>
#include <SDL2/SDL.h>
SDL_Rect clip;
clip.x = 0;
clip.y = 0;
clip.w = 1;
clip.h = 1;
int msec, i;
clock_t start, diff;
i = 100000;
start = clock()
while(i-- > 0)
{
SDL_RenderDrawPoint(renderer, 0, 0);
}
diff = clock() - start;
msec = diff * 1000 / CLOCKS_PER_SEC;
fprintf(stdout, "Time taken %d seconds %d milliseconds", msec/1000, msec%1000);
i = 100000;
start = clock()
while(i-- > 0)
{
SDL_RenderCopy(renderer, texture, &clip, &clip);
}
diff = clock() - start;
msec = diff * 1000 / CLOCKS_PER_SEC;
fprintf(stdout, "Time taken %d seconds %d milliseconds", msec/1000, msec%1000);
发布于 2022-04-14 03:35:59
这两种方法都不是:使用SDL_LockSurface直接访问表面数据。然后,改变像素就是改变数组中的值,这是最快的。
https://gamedev.stackexchange.com/questions/135126
复制相似问题