gpt4 book ai didi

android - 如何将控制从字符串委托(delegate)给 C 中的一系列函数

转载 作者:行者123 更新时间:2023-11-30 16:02:18 24 4
gpt4 key购买 nike

这是我的 Android 应用程序的性能关键部分,我正在使用 NDK (c) 来处理大型位图数组。

int blender(const char* blendMode, int c1, int c2, int amount){

int sob, sog, sor, soa, dsr, dsg, dsb, dsa = 0;

dsr = Argb_GetRed(c1);
dsg = Argb_GetGreen(c1);
dsb = Argb_GetBlue(c1);
dsa = Argb_GetAlpha(c1);

sor = Argb_GetRed(c2);
sog = Argb_GetGreen(c2);
sob = Argb_GetBlue(c2);
soa = Argb_GetAlpha(c2);


int src_alpha, mix_alpha, dst_alpha;

src_alpha = soa * ((255 * amount) / 100) >> 8;

if (!strcmp(blendMode, "normal")) {
PSD_BLEND_NORMAL(dsr, sor, mix_alpha);
PSD_BLEND_NORMAL(dsg, sog, mix_alpha);
PSD_BLEND_NORMAL(dsb, sob, mix_alpha);
}
else if (!strcmp(blendMode, "exclusion")) {

mix_alpha = soa / 255;
//.... it's not always just the 3 macros

PSD_BLEND_EXCLUSION(dsr, sor, mix_alpha);
PSD_BLEND_EXCLUSION(dsg, sog, mix_alpha);
PSD_BLEND_EXCLUSION(dsb, sob, mix_alpha);
}

~~~~~~~~~ X 20 or so blend modes ~~~~~~~~~~~~
}

目前它在每个像素上运行这个混合器功能,并进行切换(显然效率低下)

而且,它必须将原始命令作为字符串(来自 json,并通过 java 传递下来)

我可以想出几种方法来提高效率,但它们都涉及编写两个巨大的 switch 语句。我更愿意使用 1 个 switch 语句,或者如果可能的话进行查找

谢谢!

最佳答案

相当令人讨厌的问题,但我有一个“黑客”的想法。

如果'blendMode'名称选择得当,您可以只比较字符串的前两个(或三个)字母。如果有多个字符串具有相同的第一个字母,您可以进行特例并比较第一个和第三个字母,依此类推。

这个技巧将使代码比一直调用 strcmp() 快得多。另外,内联比较函数也可能有所帮助。

这是一些代码:

/* compares first two letters of the string */
inline int fast_cmp(const char *mode, const char *cmp) {
return (mode[0] == cmp[0] && mode[1] == cmp[1]) ? 1 : 0;
}

if( fast_cmp(blendMode, "no") ); /* for "normal" */
if( fast_cmp(blendMode, "ex") ); /* for "exclusion" */

实际操作:http://ideone.com/OiXS0

当然,可以将比较直接写入 if/else 语句,但这可能会令人困惑。这可以通过小而漂亮的宏来修复:

#define FAST_CMP(x, y) x[0] == y[0] && x[1] == y[1]

这是正在运行的宏:http://ideone.com/NQFwW

这个宏版本可能是进行比较的最快方法。

关于android - 如何将控制从字符串委托(delegate)给 C 中的一系列函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5438256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com