我在用Python制作游戏引擎。目前它运行在5-7 FPS,我想增加它。所以我想用C/C++把形状放到框架上。我的帧是三维数组。我想在python和C++之间传输这些数组。但是当使用np.ctypeslib.ndpointer时,数组包含垃圾。
下面是C++文件的代码:
#include <iostream>
using namespace std;
int*** zeros_3d_cpp(int n1, int n2, int n3) {
int ***arr = new int**[n1];
for (int i = 0; i < n1; i++) {
arr[i] = new int*[n2];
for (int j = 0; j < n2; j++) {
arr[i][j] = new int[n3];
for (int k = 0; k < n3; k++) {
arr[i][j][k] = 0;
}
}
}
return arr;
}
extern "C" {
__declspec(dllexport) int*** zeros_3d(int n1, int n2, int n3) { return zeros_3d_cpp(n1, n2, n3); }
}下面是python代码:
from ctypes import *
import numpy as np
lib = cdll.LoadLibrary('./bin/main.dll')
lib.zeros_3d.argtypes = [c_int, c_int, c_int]
lib.zeros_3d.restype = np.ctypeslib.ndpointer(dtype=c_int, ndim=3, shape=(3, 2, 4))
print(lib.zeros_3d(3, 2, 4))生成的输出是:
[[[ 4490944 0 4491040 0]
[ 4491136 0 387641098 268496650]]
[[ 4490976 0 4491008 0]
[ 4456792 0 387641098 268496650]]
[[ 0 0 0 0]
[ 4456792 0 387641098 268496650]]]而它应该是,,到处都是。
请帮我快点,我想在我的学校开学之前完成这个项目。
发布于 2020-11-07 08:29:11
我不认为这是一个好主意,存储在一个多维数组,如你所说的帧。这样可以更容易地将数据存储在一个线性一维数组中.
int*** zeros_3d_cpp(int n1, int n2, int n3) {
int ***arr = new int**[n1];
for (int i = 0; i < n1; i++) {
arr[i] = new int*[n2];
for (int j = 0; j < n2; j++) {
arr[i][j] = new int[n3];
for (int k = 0; k < n3; k++) {
arr[i][j][k] = 0;
}
}
}
return arr;
}我会将代码分成两部分,首先分配Array,然后填充它。
int* zeros_3d_cpp(int width, int height, int breadth) {
//Allocating Memory
int *arr = new int[width*height*breadth];
for (int i = 0; i < breadth; i++)
{
//Iterates over 2D Image
for (int j = 0; j < height; j++)
{
//Iterates over a Single Row
for (int k = 0; k < width; k++)
{
arr[i*width*height + j*width +k] = 0;
}
}
}
return arr;
}确保将内存(即返回的数组ptr )绑定到python中的某个对象。
存储器
此外,您正在使用原始指针,使用额外的预防措施来查看谁在管理资源的内存。您可以使用numpy或C++从python端分配内存(在您的情况下是动态数组),并跟踪对象在Python中的生存期,以确保它被正确释放。
您还可以使用numpy在python中创建数组,然后将指针返回到C++,因此C++函数将以起始指针地址作为输入。
void zeros_3d_cpp(int* start_address, int width, int height, int breadth) {
//Only fill in with zeros
}https://stackoverflow.com/questions/64725533
复制相似问题