- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想知道,在 C# 中是否有与以下代码等效的代码?
ShortBuffer sb = BufferUtils.createShortBuffer(Cubie.indexData.length);
sb.put(Cubie.indexData).flip();
Gl.BufferData(BufferTarget.ElementArrayBuffer, sb, BufferUsageHint.StaticDraw);
Gl.BindBuffer(BufferTarget.ElementArrayBuffer, 0);
最佳答案
首先,这可能是一个小问题,但如果其他人来到这里或者 OP 可能仍然需要这样的东西,请回答。
我将数组包装到缓冲类中并尝试匹配 ShortBuffer
.当然,这不是它的完整实现,因此可能仍然缺少一些东西或必须实现的东西。
我将其设为通用,以防您可能想要不同类型的缓冲区而不仅仅是短缓冲区。
这是 Buffer<T>
类。
/// <summary>
/// A generic buffer.
/// </summary>
/// <typeparam name="T"></typeparam>
public class Buffer<T>
{
/// <summary>
/// The internal buffer.
/// </summary>
protected T[] _array;
/// <summary>
/// Creates a new generic buffer.
/// </summary>
/// <param name="array">The array.</param>
public Buffer(T[] array)
{
_array = new T[array.Length];
Array.Copy(array, 0, _array, 0, _array.Length);
}
/// <summary>
/// Creates a new generic buffer.
/// </summary>
/// <param name="capacity">The capacity.</param>
public Buffer(int capacity)
{
_array = new T[capacity];
// 0 filling for value-types
for (int i = 0; i < _array.Length; i++)
_array[i] = default(T);
}
/// <summary>
/// Gets the first value of the buffer.
/// </summary>
public T First
{
get { return _array[0]; }
}
/// <summary>
/// Gets the last value of the buffer.
/// </summary>
public T Last
{
get { return _array[_array.Length - 1]; }
}
/// <summary>
/// Gets the length of the buffer.
/// </summary>
public int Length
{
get { return _array.Length; }
}
/// <summary>
/// Gets values in the form of an array from a specific index.
/// </summary>
/// <param name="index">The index.</param>
/// <param name="length">The length.</param>
/// <returns>Returns the values in the form of an array.</returns>
public T[] Get(int index, int length)
{
var array = new T[length];
Array.Copy(_array, index, array, 0, length);
return array;
}
/// <summary>
/// Gets a copy of the internal array.
/// </summary>
/// <returns>Returns the copied array.</returns>
public T[] Get()
{
var array = new T[_array.Length];
Array.Copy(_array, 0, array, 0, array.Length);
return array;
}
/// <summary>
/// Gets a value by an index.
/// </summary>
/// <param name="index">The index.</param>
/// <returns>Returns the value.</returns>
public T GetValue(int index)
{
return _array[index];
}
/// <summary>
/// Puts a value into the beginning of the buffer.
/// Note: Put does not replace the first value.
/// </summary>
/// <param name="value">The value.</param>
public void Put(T value)
{
var array = new T[_array.Length + 1];
Array.Copy(_array, 0, array, 1, _array.Length);
array[0] = value;
_array = array;
}
/// <summary>
/// Puts a value into a specific index of the buffer.
/// Note: Put does not replace the value at the specific index.
/// </summary>
/// <param name="value">The value.</param>
/// <param name="index">The index.</param>
public void Put(T value, int index)
{
if (index == 0)
{
Put(value);
}
else if (index == _array.Length - 1)
{
Append(value);
}
else
{
var array = new T[_array.Length + 1];
array[index] = value;
Array.Copy(_array, 0, array, 0, index);
Array.Copy(_array, index, array, index + 1, _array.Length - index);
_array = array;
}
}
/// <summary>
/// Inserts a value at a specific index of the buffer.
/// Note: Insert replaces the current value at the index.
/// </summary>
/// <param name="value">The value.</param>
/// <param name="index">The index.</param>
public void Insert(T value, int index)
{
_array[index] = value;
}
/// <summary>
/// Appends a value to the buffer.
/// </summary>
/// <param name="value">The value to append.</param>
public void Append(T value)
{
var array = new T[_array.Length + 1];
Array.Copy(_array, 0, array, 0, _array.Length);
array[array.Length - 1] = value;
_array = array;
}
/// <summary>
/// Puts an array into the beginning of the buffer.
/// Note: Put does not replace the first values of the buffer.
/// </summary>
/// <param name="value">The value.</param>
public void Put(T[] value)
{
var array = new T[_array.Length + value.Length];
Array.Copy(value, 0, array, 0, value.Length);
Array.Copy(_array, 0, array, value.Length, _array.Length);
_array = array;
}
/// <summary>
/// Puts an array into a specific index of the buffer.
/// Note: Put does not replace the array at the specific index.
/// </summary>
/// <param name="value">The value.</param>
/// <param name="index">The index.</param>
public void Put(T[] value, int index)
{
if (index == 0)
{
Put(value);
}
else if (index == _array.Length - 1)
{
Append(value);
}
else
{
var array = new T[_array.Length + value.Length];
Array.Copy(value, 0, array, index, value.Length);
Array.Copy(_array, 0, array, 0, index);
Array.Copy(_array, index, array, index + value.Length, _array.Length - index);
_array = array;
}
}
/// <summary>
/// Appends an array to the buffer.
/// </summary>
/// <param name="value">The value.</param>
public void Append(T[] value)
{
var array = new T[_array.Length + value.Length];
Array.Copy(_array, 0, array, 0, _array.Length);
Array.Copy(value, 0, array, _array.Length, value.Length);
_array = array;
}
/// <summary>
/// Puts a buffer into the beginning of the buffer.
/// Note: Put does not replace the first values of the buffer.
/// </summary>
/// <param name="value">The value.</param>
public void Put(Buffer<T> value)
{
Put(value._array);
}
/// <summary>
/// Puts a buffer into a specific index of the buffer.
/// Note: Put does not replace the buffer at the specific index.
/// </summary>
/// <param name="value">The value.</param>
/// <param name="index">The index.</param>
public void Put(Buffer<T> value, int index)
{
Put(value._array, index);
}
/// <summary>
/// Appends a buffer to the buffer.
/// </summary>
/// <param name="value">The value.</param>
public void Append(Buffer<T> value)
{
Append(value._array);
}
/// <summary>
/// Gets the bytes of the buffer.
/// </summary>
/// <returns>Returns a newly created byte array of the buffer.</returns>
public byte[] GetBytes()
{
var buffer = new byte[_array.Length * Marshal.SizeOf(typeof(T))];
Buffer.BlockCopy(_array, 0, buffer, 0, buffer.Length);
return buffer;
}
}
这是一个关于如何实现 ShortBuffer
的示例实现
/// <summary>
/// A 16 bit integer buffer.
/// </summary>
public class Int16Buffer : Buffer<short>
{
/// <summary>
/// Creates a new instance of Int16Buffer.
/// </summary>
/// <param name="array">The array to build a buffer upon.</param>
public Int16Buffer(short[] array)
: base(array) { }
/// <summary>
/// Creates a new instance of Int16Buffer.
/// </summary>
/// <param name="capacity">The start capacity of the buffer.</param>
public Int16Buffer(int capacity)
: base(capacity) { }
}
当然你也可以这样做
// Creates a buffer of 10 short elements ...
var shortBuffer = new Buffer<short>(10);
最后是一些示例用法。
var buffer1 = new Int16Buffer(new short[] { 1, 2, 4, 5 });
buffer1.Put(0);
buffer1.Put(3, 3);
buffer1.Append(6);
var buffer2 = new Int16Buffer(new short[] { 1, 2, 4, 5 });
buffer2.Put(0);
buffer2.Put(3, 3);
buffer2.Append(6);
buffer1.Put(buffer2);
var buffer3 = new Int16Buffer(new short[] { 1, 2, 4, 5 });
buffer3.Put(0);
buffer3.Put(3, 3);
buffer3.Append(6);
buffer1.Put(buffer3, 7);
foreach (var b in buffer1.Get())
{
Console.WriteLine(b);
}
你可以在这里得到输出:
关于java - C#相当于Java的FloatBuffer/ShortBuffer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29402216/
在 Chapel 中以固定增量遍历一系列实数的最惯用方法是什么? C 等效代码为: for (x = 0.0; x start, "Stop must be greater than start");
在编写我的 VBA 宏时,我经常使用“GoTo”以便在不离开 Sub 的情况下跳转到宏的前一部分。现在我正在将我所有的宏转换为 Google Apps 脚本,我正试图找到“GoTo”的等效项。 Sub
作为一个(不幸)对 jQuery 的了解多于 raw javascript 的人,我现在正在学习是时候用原始 javascript 替换我的所有代码了。不,这不是必需的,但对我来说这是一种更简单的学习
当我运行 git help -a它向我显示了内部命令列表、我所有的别名和我所有的外部 git 命令(即我的路径中以 git- 开头的任何可执行文件)。我想要的是一个可以作为 git which 运行的
我正在使用的查询: SELECT COUNT(*), SUM(amount) AS amount, FROM_UNIXTIME(added, '%W (%e/%m)') AS dail
我有一堆我正在调试的脚本,都是嵌套的并且非常讨厌。 只是想知道我是否能够设置一些与 bash 的 -x 选项等效的环境变量。这将为我节省大量时间。 我已经寻找答案,但似乎它不存在 - 希望你们聪明的人
ObjC [MyObject doThisWithString:string?: [MyObject otherString]]; 我如何在 Swift 中执行此操作? extension MyObj
我目前正在运行 Sonar 来对我的代码进行静态分析。当我在分析java文件并想抑制某个警告时,我使用了@SuppressWarnings(nameOfTheWarningOnSonar)注解。我想知
我最近一直在研究 Elixir 和 Akka,这让我想到:Clojure 中的等价物是什么? 我发现了几篇关于代理与 Actor 的“消息吞吐量比较”帖子,但它们来自 8 年前 一个答案曾经是agen
我以前工作的地方,我们使用 Mercurial 进行版本控制。我有一份新工作,我们在那里使用 Subversion。我是 Subversion 的新手。 我发现自己想知道自从我在远程仓库上结帐以来 c
寻找一种等效的剪切和粘贴策略来复制 vim 的“cut til”。如果我真的知道它在 vim 中的名称,我敢肯定这是 googleable,但这是我要找的: 如果我有一个像这样的文本块: foo ba
我有一段 .NET 代码,我想将其移植到 64 位。这些代码基本上是一组对其他 C dll 的 P/Invoke 调用。 C dll 中的函数之一具有参数“size_t”。我应该在我的 P/Invok
开发 iPhone 应用程序的标准开发者平台是什么,例如相当于 Eclipse? 最佳答案 Xcode 是 iOS 开发的标准且唯一(由 Apple 支持)IDE。它也是必需的,因为如果您想要任何开发
我想将某些内容推送到 iPhone 的响应者链上。也就是说,我想将选择器发送到 UIResponder子类,如果它不响应所述选择器,则将其传递给其 nextResponder . 有什么想法吗? 最佳
我需要一个与 SQL 中的此查询等效的 Firebase 查询: select * from your_table where id in (123, 345, 679) 你会如何在 firebase
我有一个很好的解决方案: $.get('getdbstuff.php?type=meta,'.$var_id, function(data){ $(data).appendTo("head")
我正处于 Cassandra 应用程序数据建模的初始阶段。此应用程序具有现有的关系持久层,必须用 Cassandra 替换。 应用程序为用户使用一个名为login_log 的表,它提供所有应用程序中任
如标题所述,TensorFlow 是否存在与 numpy.all() 函数等效的函数来检查 bool 张量中的所有值是否为 True?实现此类检查的最佳方法是什么? 最佳答案 使用tf.reduce_
在 Stata 中,如果我有以下变量:var1、var2、var3、var4、var5 和 var6,我可以使用命令 var* 选择所有它们。 R 有类似的功能吗? 最佳答案 “dplyr”包中的se
我正处于 Cassandra 应用程序数据建模的初始阶段。此应用程序具有现有的关系持久层,必须用 Cassandra 替换。 应用程序为用户使用一个名为login_log 的表,它提供所有应用程序中任
我是一名优秀的程序员,十分优秀!